首先是幸运数字。
幸运数字是这样生成的:
以所有的自然数为例:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20...
然后,删除每个秒数。
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39...
现在,3
是安全的。
删除第三个数字:
1, 3, 7, 9, 13, 15, 19, 21, 25, 27, 31, 33, 37, 39, 43, 45, 49, 51, 55, 59...
现在,7
是安全的。
每七号删除一次。
继续,并移除每个n
编号,其中n
是消除后的第一个安全数字。
安全数字的最后一个列表是幸运数字。
不幸的数字是由单独的数字列表组成的,它们是[U1, U2, U3... Un]
。
U1
是从幸运的“候选人”中删除的第一组数字,因此它们是:
2, 4, 6, 8, 10, 12, 14, 16, 18, 20...
U2
是删除的第二组数字:
5, 11, 17, 23, 29, 35, 41, 47, 53, 59...
依此类推(U3
是第三个列表,U4
是第四个等等)。
当给定两个输入m
和n
时,您的任务是在list Un
中生成m
th号。
(5, 2) -> 29
(10, 1) -> 20
m
和1e6
,n
必须运行到100
。m
和n
都是正整数。U(1e6, 100)
= 5,333,213,163
。(谢谢你@pacholik!)这是密码-高尔夫,所以以字节为单位的最短代码将获胜!
PS:如果有人想出一个通用的公式来生成这些,那就太好了。如果你有公式,请把它写在你的答案里!
发布于 2016-09-27 19:45:09
from itertools import*
def L(n,k=1):
if n<2:yield from count(2+k,2)
t=L(n-1);l=next(t)
for i in t:
n+=1
if(n%l>0)==k:yield i
U=lambda m,n:sum(islice(L(n,0),m-1,m))
函数L生成可能的幸运数字行(如果k为真)或Un (如果为假)。评估懒惰(因此,我不需要生成n-1无限列表,如果我想要Un)。
运行函数U
U(1,000,000;100)用PyPy在我的机器上运行大约需要1小时45分钟。我怀疑和CPython在一起大约有四个小时。(是的,准确地说是4小时20分钟。)
如果我使用list而不是生成器,我可能会获得一些速度,但是我需要一个比Python允许的更大的列表。如果是这样的话,它将需要几十千兆字节的内存。
是,U(1 000 000;100) =5 333 213 163。
发布于 2016-09-29 16:28:04
f<-function(m,n){a=1:2e8
i=1
while(i<n){a=c(0,a)[c(F,rep(T,i))]
i=i+1}
a[(n+1)*m]}
用法
f(5,2)
Returns 29
这需要有一个足够大的向量开始,所以有足够的数字返回值。所创建的向量已经约为800 so,并且该函数可以处理m=1e4和n=100,因此仍然远远没有达到目标。
要创建一个足够大的向量来计算f(1e6,100),需要一个1:2e10的起始向量。由于Rs数据分配过程,这会创建一个向量>70 be,虽然代码会运行,但它不能在我知道的任何计算机上运行。
Error: cannot allocate vector of size 74.5 Gb
作为参考,f(1e4,100)大约在30秒内运行。基于此和几个较小的测试f(1e6,100)大约需要一个小时。
发布于 2016-09-28 17:50:38
(λ(N m n)(let loop((l(filter odd?(range 1 N)))(i 1))(define x (list-ref l i))(if(= i (sub1 n))
(begin(set! l(for/list((j(length l))#:when(= 0(modulo(add1 j)x)))(list-ref l j)))(list-ref l(sub1 m)))
(begin(set! l(for/list((j(length l))#:unless(= 0(modulo(add1 j) x)))(list-ref l j)))(if(>= i(sub1 (length l)))l
(loop l(add1 i)))))))
非高尔夫版本:
(define f
(λ(N m n)
(let loop ((l (filter odd? (range 1 N))) (i 1))
(define x (list-ref l i))
(if (= i (sub1 n))
(begin (set! l (for/list ((j (length l))
#:when (= 0 (modulo (add1 j) x)))
(list-ref l j)))
(list-ref l (sub1 m)))
(begin (set! l (for/list ((j (length l))
#:unless (= 0 (modulo (add1 j) x)))
(list-ref l j)))
(if (>= i (sub1 (length l)))
l
(loop l (add1 i))))))))
测试:
(f 100 5 2)
输出:
29
https://codegolf.stackexchange.com/questions/94695
复制相似问题