折数


14

Pi是一个无理数,表示其十进制表示形式永远不会终止或重复。

Pi被截断为41个十进制数字(40个位)3.1415926535897932384626433832795028841971

如果忽略小数点并将数字列为正整数序列(避免重复)则会得到3 1 4 15 9 2 6 5 35 8 97 93 23 84 62 64 33 83 27 950 28 841 971OEIS A064809)。
(注意,15该序列出现在序列中,而不是1 5因为1已经发生。
请注意,0因为它不是正数,所以不会发生;950包含第一个零。)

为了构造第一个归零数,我们使用此序列索引Pi的数字(第一个数字为3,第二个为1,依此类推)。

因此,第一个编号的第一位是Pi的第三位,
第二位是Pi的第一位,
第三位是Pi的第四位,第四位是Pi
第十五位,
依此类推。
在第一个数字后添加小数点以模仿Pi。

因此,第一个第41位数字是 4.3195195867462520687356193644029372991880
(请注意,对于第30位,我必须一直到Pi的第974位。)

为了构造第二个序数,使用第一个序数而不是Pi来重复该过程。(Pi本身可以称为零归零数。)因此,新序列为4 3 1 9 5 19 58 ...,第一个海盗数被索引以产生第二个,然后开始9.14858...

以相同的方式创建更多的打折号,每个打折号都是从之前的打折号生成的。

挑战

您的任务是编写可能的最短程序,该程序采用两个整数ND,并输出N截断为D十进制数字数字。

D始终为正但N为非负,且DPi的数字应在N为0
时输出。D为1时,小数点是否存在无关紧要。

输入应来自stdin或命令行,输出应进入stdout(或您的语言的最接近替代品)。

您的程序应适用于2 16ND以下的所有输入值,但不必及时或有效。

以字节为单位的最短代码获胜。

(请注意,折数在其他基准中存在,但此挑战中的所有操作均在基准10中完成。)


我们可以使用Pi的内置任意精度表示来获得 数字吗?
Martin Ender 2014年

1
@MartinBüttner好的。只要您愿意,甚至可以在线获取pi的数字,只要您获取pi的数字即可。
卡尔文的爱好

@ Calvin'sHobbies:很好,我可以在文件中包含pi的前64ki位吗?我应该为文件名添加+1吗?
克劳迪

输入范围正确吗?例如N=1D=13393对于您来说,您需要PI的第31百万位
Claudiu

pi的前10亿位数只能让您获得第一个积分数的42,598位数
Claudiu

Answers:


3

Python 292个字节

效率很低,我只能得到N = 3的几位数字,而N = 4却没有。

import sympy
def P(N,D,s=''):
 if N<1:return'3'+`sympy.pi.evalf(D+9)`[2:-9]
 for i in range(D):
    h=[];l='';j=i;x=0
    while-~j:
     x+=1;d=P(N-1,x)[-1];l+=d
     while'1'>P(N-1,x+1)[-1]:x+=1;l+='0'
     if(l in h)<1:h+=[l];l='';j-=1
    s+=P(N-1,int(h[i]))[-1]
 return s
s=P(*input())
print s[0]+'.'+s[1:]

输入样例:

0,20
3.1415926535897932384

1,20
4.3195195867462520687

2,10
9.148583196

3,5
9.9815

高尔夫:更改=="0"<"1"。使内部while循环一行。删除周围的空间x += 1if l not in h-> if(l in h)<1: N==0->N<1
isaacg

@isaacg谢谢那些,当我发布并错过一些明显的东西时,我有点着急。我可能不会意识到您可以进行字符串比较,而且if(l in h)<1它也很聪明。
KSab 2014年

更多信息:初始化sPdef P(N,D,s=''):)的参数。 str(...)可能带有反引号。 while'1'>...节省空间。做h一组,并与初始化h=l,={''},然后写l in h{l}<h
flornquake

@flornquake相当聪明,尤其是初始化它的方式,因此python认为它不是字典。当我把它放进去时,我实现了一个相当大的优化,不幸的是需要h订购。不过,我会尝试并记住这是一个巧妙的技巧。
KSab 2014年

@KSab甚至更好。:) while j+1:可以缩写为while-~j,顺便说一句。
flornquake 2014年

4

哈斯克尔,431 400 369

import Data.List
g(q,r,t,k,n,l)|4*q+r-t<n*t=n:g(q#0,(r-n*t)#0,t,k,div(r#(30*q))t-n#0,l)|1<2=g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)
u w@(x:y:xs)=x:v y xs 0 w
v a(r:s)n w|a`elem`take n(u w)||r==0=v(a#r)s n w|1<2=a:v r s(n+1)w
m p=map(genericIndex p.pred)$u p
a#b=a*10+b
(x:s)%n=show x++'.':show(foldl1(#)$n`take`s)
f n d=print$iterate m(g(1,0,1,1,3,3))!!n%d

爱无限列表!给定足够的时间和内存,该程序最终将为任何N和D计算正确的答案(我认为)。

我正在g使用spigot算法(从一个叫Stanley Rabinowitz的人无耻地偷来的)生成pi的数字,将数字分组/使用v并生成数字m

它在起作用:

λ> f 0 10
"3.1415926535"
λ> f 1 10
"4.3195195867"
λ> f 2 10
"9.Interrupted. --didn't have the time to wait for this to finish
λ> f 2 4
"9.1485"

1
我以为“哈斯克尔!” 当我看到问题时,向下滚动并微笑。
Soham Chowdhury 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.