首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不幸的数字!

不幸的数字!
EN

Code Golf用户
提问于 2016-09-27 10:46:50
回答 4查看 1.5K关注 0票数 22

要知道的事情:

首先是幸运数字。

幸运数字是这样生成的:

以所有的自然数为例:

代码语言:javascript
运行
复制
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20...

然后,删除每个秒数。

代码语言:javascript
运行
复制
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39...

现在,3是安全的。

删除第三个数字:

代码语言:javascript
运行
复制
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是从幸运的“候选人”中删除的第一组数字,因此它们是:

代码语言:javascript
运行
复制
2, 4, 6, 8, 10, 12, 14, 16, 18, 20...

U2是删除的第二组数字:

代码语言:javascript
运行
复制
5, 11, 17, 23, 29, 35, 41, 47, 53, 59...

依此类推(U3是第三个列表,U4是第四个等等)。

挑战:

当给定两个输入mn时,您的任务是在list Un中生成mth号。

示例输入和输出:

代码语言:javascript
运行
复制
(5, 2) -> 29
(10, 1) -> 20

规范:

  • 您的程序必须适用于m1e6n必须运行到100
    • 保证mn都是正整数。
    • 如果你好奇,U(1e6, 100) = 5,333,213,163。(谢谢你@pacholik!)

  • 你的程序必须在一天内在一台合理的现代计算机上计算。

这是密码-高尔夫,所以以字节为单位的最短代码将获胜!

PS:如果有人想出一个通用的公式来生成这些,那就太好了。如果你有公式,请把它写在你的答案里!

EN

回答 4

Code Golf用户

发布于 2016-09-27 19:45:09

Python 3,170

代码语言:javascript
运行
复制
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。

票数 7
EN

Code Golf用户

发布于 2016-09-29 16:28:04

R 82字节

代码语言:javascript
运行
复制
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]}

用法

代码语言:javascript
运行
复制
f(5,2)
Returns 29

这需要有一个足够大的向量开始,所以有足够的数字返回值。所创建的向量已经约为800 so,并且该函数可以处理m=1e4和n=100,因此仍然远远没有达到目标。

要创建一个足够大的向量来计算f(1e6,100),需要一个1:2e10的起始向量。由于Rs数据分配过程,这会创建一个向量>70 be,虽然代码会运行,但它不能在我知道的任何计算机上运行。

代码语言:javascript
运行
复制
Error: cannot allocate vector of size 74.5 Gb

作为参考,f(1e4,100)大约在30秒内运行。基于此和几个较小的测试f(1e6,100)大约需要一个小时。

票数 2
EN

Code Golf用户

发布于 2016-09-28 17:50:38

球拍332字节

代码语言:javascript
运行
复制
(λ(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)))))))

非高尔夫版本:

代码语言:javascript
运行
复制
(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))))))))

测试:

代码语言:javascript
运行
复制
(f 100 5 2)

输出:

代码语言:javascript
运行
复制
29
票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/94695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档