皮打了你的电话


30

挑战:

Pi应该是无限的。这意味着每个数字都包含在pi的小数部分内。您的任务将是在输入上取一个正整数,并在输出上以pi位返回此数字的位置。

例如,如果输入为59,我们将返回4

这就是为什么:我们将59在pi的数字中查找数字

3.14159265...
     ^^

该值从第4位开始,因此输出为4

其他一些例子:

input : 1      output : 1
input : 65     output : 7
input : 93993  output : 42
input : 3      output : 9

规则:

  • 您不必处理前200个数字中不存在的数字
  • 与往常一样,标准漏洞是被禁止的。
  • 这是,所以较少的字节获胜。

41
具有您提到的属性的数字称为普通数字。无限的十进制扩展(即使是非周期性的)也不表示正态。0.101001000100001 ...是一个反例。
丹尼斯

38
而且,绝对地,Pi 应该是无限的。但是,它是十进制表示形式,具有无限数字。
rafa11111 '18

11
@Dennis Normal是一个更强的条件(完全一致vs全部存在)
user202729 '18

6
我们是否可以输出0索引的n'th索引?因此,文本大小写将返回0, 6, 41, 8而不是1, 7, 42, 9
凯文·克鲁伊森

7
@ rafa11111我同意。我们应该放弃整数并在基本PI中使用数字。然后,整数将具有无限数字。
mbomb007'4

Answers:


22

Python 2,69 75 71 67字节

由于caird coinheringaahing节省了4个字节。

x=p=1333
while~-p:x=p/2*x/p+2*10**200;p-=2
print`x`.find(input(),1)

找不到3零位成本6 2字节。输入以字符串形式给出。

在线尝试!


无限版本

Python 2,224字节

def g():
 q,r,t,i,j=1,0,1,0,1
 while True:
  i+=1;j+=2;q,r,t=q*i,(2*q+r)*j,t*j;n=(q+r)/t
  if n*t>4*q+r-t:yield n;q,r=10*q,10*(r-n*t)
a=input()
l=len(`a`)
s=z=10**l;i=1-l
p=g().next;p()
while s!=a:s=(s*10+p())%z;i+=1
print i

根据上面使用的相同公式使用无限制的插口。

在线尝试!


更快的版本

from gmpy2 import mpz
def g():
  # Ramanujan 39, multi-digit
  q, r, s ,t = mpz(0), mpz(3528), mpz(1), mpz(0)
  i = 1
  z = mpz(10)**3511
  while True:
    n = (q+r)/(s+t)
    if n == (22583*i*q+r)/(22583*i*s+t):
      for d in digits(n, i>597 and 3511 or 1): yield d
      q, r = z*(q-n*s), z*(r-n*t)
    u, v, x = mpz(1), mpz(0), mpz(1)
    for k in range(596):
      c, d, f = i*(i*(i*32-48)+22)-3, 21460*i-20337, -i*i*i*24893568
      u, v, x = u*c, (u*d+v)*f, x*f
      i += 1
    q, r, s, t = q*u, q*v+r*x, s*u, s*v+t*x

def digits(x, n):
  o = []
  for k in range(n):
    x, r = divmod(x, 10)
    o.append(r)
  return reversed(o)

a=input()
l=len(`a`)
s=z=10**l;i=1-l
p=g().next;p()
while s!=a:s=(s*10+p())%z;i+=1
print i

基于Ramanujan#39的更快的无限制插口。

在线尝试!


不错,既没有硬代码也没有使用内置的(因为Python没有任何内置的)
user202729


2
@Dennis 31需要在137比赛:/
primo

2
这是哪种近似算法?这里列出一个吗?en.wikipedia.org/wiki/Approximations_of_%CF%80
Sphinxxx '18年

4
@Sphinxxx是将Euler变换应用于Leibniz系列的结果。我已经在以前的帖子中发布了派生词。
primo

19

外壳,5个字节

€tİπd

在线尝试!

说明

€tİπd                              59
    d  Convert to base-10 digits   [5,9]
  İπ     The digits of pi          [3,1,4,1,5,9..]
 t       Remove the first element  [1,4,1,5,9,2..]
€      Index of the sublist        4

1
可笑-但我必须承认我印象深刻。
弗洛里斯'18

6
对于高尔夫语言,通常最好添加一个解释,因为不了解该语言的人将无法阅读它。如果我正确理解的话,请执行以下操作:将()的索引从tPI(İπ)的数字的第一项(前导3)除去()处,将其转换为以10为底的(d)并输出到STDOUT(隐式)。
凯文·克鲁伊森

同意,我不知道我在看什么。
JA Terroba

1
@gggg看起来像是一个懒惰的表示示例验证
仅ASCII的

1
@gggg İπ是无限的数字来源
H.PWiz

18

Excel,212字节

=FIND(A1,"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196")

Excel仅处理15个小数位,因此pi只是硬编码。对于这个挑战,这应该是一个相当微弱的上限。


4
很抱歉对我的帖子发表评论,但是一些支持者可以告诉我为什么他们喜欢这个答案吗?它在Excel公式中可以打高尔夫球,但是很长,而且一点也不聪明。
Engineer Toast

6
我之所以喜欢它,是因为它不依赖具有内置功能的高尔夫语言来将pi计算到任意小数位。它可能没有创造力,但是很实用(这里实用性并不重要)。
斯科特,

因为这个问题没有明确规定,输入或答案必须是基地10,你能不能打高尔夫球这种使用CONCATBBP公式来计算π-base16的前200位,并且十六进制搜索呢?(没有365,因此无法测试)
Chronocidal

2
办公室365只:使用CONCATCODE并且MID我减少PI串从202个字符(INC引号)143:CONCAT(CODE(MID(".ÜÁ£ÙÏ ¦®š«¦ Ï²œÔ“ÇŧÝËŠº”ᱬ»—‡ÑÀ†œ¾ˆãÖœƒ°™¢•‘†ÏÒŽÐÖ³ ÒžÂ¯‰¦¬¼ß²º–ŸÈµ»¨Ñœ°‹‘­‚ÔŠ›ÝÕ•Š·»À®–Þٶ݃Ñà",2*ROW(A1:A100)-1,2))-32)
Chronocidal

1
使用Office365进行测试,无论输入什么,它看起来都会输出14?
马修·施拉赫特

9

Java 8,615 217 202 184 182 166 165字节(计算的999200位)

n->{var t=java.math.BigInteger.TEN.pow(200);var r=t;for(int p=667;p-->1;)r=t.valueOf(p).multiply(r).divide(t.valueOf(p-~p)).add(t).add(t);return(r+"").indexOf(n,1);}

1索引

在线尝试。

Math.PI与许多其他语言一样,Java的内建精度为15个十进制值。要获得更多数字,您必须自己使用BigIntegers或进行计算BigDecimals。上面这是一个办法做到这一点.. 也许有人可以高尔夫这个下面211个字节,哈哈..
编辑:创建的端口@primo S” Python的2答案(请务必给予好评他!),所以计算比硬更短编码不再那么牵强。高尔夫只需要增加7个字节就可以使它更短。

使用@Neil可以得到 -15个字节,这比下面的硬编码答案还要短!
-36字节感谢@primo
-1字节更改java.math.BigInteger t=null,T=t.TEN.pow(200),r=T;var T=java.math.BigInteger.TEN.pow(200);var r=T;,因为var比1字节短null(必须爱新的Java 10)。

说明:

n->{                            // Method with String parameter and integer return-type
  var t=java.math.BigInteger.TEN.pow(200);
                                //  Temp BigInteger with value 10^200
  var r=t;                      //  Result BigInteger, also starting at 10^200
  for(int p=667;                //  Index-integer, starting at 667
      p-->1;)                   //  Loop as long as this integer is still larger than 1
                                //  (decreasing `p` by 1 before every iteration with `p--`)
    r=                          //   Replace the Result BigInteger with:
      t.valueOf(p)              //    `p`
       .multiply(r)             //    multiplied by `r`,
       .divide(t.valueOf(p-~p)) //    divided by `2*p+1`
       .add(t).add(t);          //    And add 2*10^200
  return(r+"")                  //  Convert the BigInteger to a String
    .indexOf(n,                 //  And return the index of the input,
               1);}             //  skipping the 3 before the comma

Java 8,211字节(硬编码200位)

"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196"::indexOf

0索引

在线尝试。


1
!p.equals(t.ONE)也许?另外,indexOf(n,1)-1我认为是作品。或者保存2个字节,并将其设置为1索引。
尼尔,

不知道我如何错过第一个,但我真的需要记住第二个。不知道有一种indexOf方法可以跳过前几个m字符。TIL,谢谢!
凯文·克鲁伊森


1
您也可以p每次(for(int p=667;p-->1;))减一,然后乘以p除以p-~p
primo

1
r尽管极端值将需要更多的迭代,但是的初始值可以从字面上是任何值。最好的种子(最小的迭代次数)实际上是4e200
primo

6

05AB1E,6个字节

₁žs¦¹k

在线尝试!

怎么样?

₁        push 256
 žs      push pi to 256 places
   ¦     remove the leading 3
    ¹    push the input
     k   index inside that string

如果我用相同的语言获得了类似的6字节解决方案,那么在您之后,是否删除答案?
nicael

@nicael通常没关系,但是您的解决方案3无论如何都会失败
Uriel

哦,的确如此,thnks
nicael

6

MATL16 15字节

YP8WY$4L)jXfX<q

在线尝试!

说明

YP     % Push pi as a double
8W     % Push 2^8, that is, 256
Y$     % Compute pi with 256 significant digits using variable-precision arithmetic
       % The result as a string
4L)    % Remove first character. This is to avoid finding '3' in the integer part
       % of pi
j      % Push input as a string
Xf     % Strfind: gives array of indices of occurrences of the input string in the
       % pi string
X<     % Mimimum
q      % Subtract 1. Implicitly display

非常好,简短!您能解释一下它是如何工作的吗?
随机家伙

@Therandomguy当然,添加了解释
Luis

4

R +数字包,52字节

regexec(scan(),substring(numbers::dropletPi(200),3))

在线尝试!

dropletPi计算的前200个十进制数字,pi3.在开头包含a ,因此我们先将其去除,substring然后与匹配regexec,这将返回匹配的索引以及有关该匹配的一些元数据。


也许regexpr(scan(),numbers::dropletPi(200))-2吧?
djhurio '18 -4-3

@djhurio无效,因为我们必须将小数点后的数字匹配。那也是我的第一个念头,但是那件事毁了它。也许一个"if"
朱塞佩

我在这里看不到问题。输入的非将包含3.(我假设我们处理输入中不是实数的整数)。测试示例与此相关。
djhurio

3
@djhurio是正确的,但是 在应该regexpr(3,numbers::dropletPi(200))-2返回-1时返回9,请尝试
Giuseppe

3

果冻,23 个字节

⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SṾḊw

单子链接接受一个字符列表(要查找的整数)并返回索引。适用于包含在π小数部分的前252位数字内的输入。

在线尝试!

怎么样?

这使用πLeibniz公式来计算前253位数字,包括前导3(再加上四个尾随的不正确数字)。3然后删除前导,并找到输入的索引:

⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SṾḊw - Link: list of characters
⁵                       - literal ten
  ⁹                     - literal 256
 *                      - exponentiate = 10000...0 (256 zeros)
   Ḥ                    - double       = 20000...0
          ¤             - nilad followed by links as a nilad:
     ȷ                  -   literal 1000
      Ḋ                 -   dequeue -> [2,3,4,5,...,1000]
         $              -   last two links as a monad:
        J               -     range of length -> [1,2,3,4,...,999]
       +                -     addition (vectorises) -> [3,5,7,9,...,1999]
    ;                   -   concatenate -> [20000...0,3,5,7,9,...,1999]
                  \     - cumulative reduce with:
                 ɗ      -   last three links as a dyad:
               ¤        -     nilad followed by link(s) as a nilad:
            ⁹           -       chain's right argument (the right of the pair as we traverse the pairs in the list -- 3, 5, 7, 9, ...)
              2         -       literal two
             :          -       integer division (i.e. 1, 2, 3, ...)
           ×            -     multiply (the left of the pair, the "current value", by that)
                :       -   integer divide by the right argument (i.e. 3, 5, 7, 9, ...)
                   S    - sum up the values (i.e. 20000...0 + 66666...6 + 26666...6 + 11428...2 + ... + 0)
                    Ṿ   - un-evaluate (makes the integer become a list of characters)
                     Ḋ  - dequeue (drop the '3')
                      w - first (1-based) index of sublist matching the input

如果您希望使用数字列表作为输入使用⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SDḊw(也为23),而如果您真的想给它一个整数使用⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SDḊwD(用于24)。


您的意思是将Euler变换应用于Leibniz公式。用Leibniz公式计算252位数字所花的时间比大多数人愿意等待的时间短。
primo

是的,以原始形式需要花费很长时间(我相信它仍在“使用Leibniz公式”!)
Jonathan Allan

3

BASH(GNU / Linux),75 67 66字节

感谢Sophia Lechner,节省了1个字节,感谢Cows quack,节省了7个字节。

a=`bc -l<<<"scale=999;4*a(1)"|tail -c+2|grep -ob $1`;echo ${a%%:*}

这是一个使用单个参数(即数字)的shell脚本。测试

$ bash <script-path> 59
4

该脚本首先执行三个命令的管道:

bc -l<<<"scale=999;4*a(1)"|    #produce pi with its first 999 fractional digits
tail -c+2|                     #cut off the "3."
grep -ob $1                    #compute the byte offsets of our argument in the string

该管道的结果分配给shell变量a,然后将其回显,但除去第一个数字除外:

a=`...`;         #assign the result of the pipeline to a variable
echo ${a%%:*}    #cleave off the first : character and anything following it

不幸的是,bc当输出线变得太长时,往往会折断它们。如果要找到的数字不在第一行,则可能导致错误的结果。您可以通过设置环境变量来避免这种情况BC_LINE_LENGTH

export BC_LINE_LENGTH=0

这将完全禁用换行功能。


显然,如果允许其他输出,则可以省略最后两个命令。
这给出了48个字节的计数:

bc -l<<<"scale=999;4*a(1)"|tail -c+2|grep -ob $1

输出结果:

$ bash <script-path> 59
4:59
61:59
143:59
179:59
213:59
355:59
413:59
415:59
731:59
782:59
799:59
806:59
901:59
923:59
940:59
987:59

真好!你不需要之间的空间-l<<<虽然。
Sophia Lechner '18

您可以转换为程序,然后使用sed保存一些字节,请在线尝试!
Kritixi Lithos

@Cowsquack我是否不需要在字节数中包含shebang行?
cmaster

@cmaster shebang行不包含在任何语言的字节数中
Kritixi Lithos 18-4-5

@Cowsquack感谢您的建议。但是,如果允许其他输出,则最好也不要这样做sed(请参阅我的答案的第二部分)。尽管如此,转换为程序却给了我7个字节,所以谢谢!我现在还用外壳变量magic 替换了tr/ head组合,以保存另一个字节。
cmaster

2

JavaScript中,197 187

-10:谢谢,尼尔

x=>"50ood0hab15bq91k1j9wo6o2iro3by0h94bg3geu0dnnq5tcxz7lk62855h72el61sx7vzsm1thzibtd23br5tr3xu7wsekkpup10cek737o1gcr6t00p3qpccozbq0bfdtfmgk".replace(/.{9}/g,a=>parseInt(a,36)).search(x)+1

接受一系列9位以36为底的整数,将其转换为10以底,然后将它们连接起来以创建pi的前200位。


很好,您不遗余力地对数据进行编码,您的方法在原始数据上节省了38个字节。
Nit

+1-我将要发布完全相同的方法。
darrylyeo

使用x=>'50...'.replace(/.{9}/g,a=>parseInt(a,36)).search(x)+1保存10个字节。
尼尔

2

第一次做代码高尔夫。使用委托和lambda表达式可以减少函数调用。V2将类名缩短为一个字节。

[C#],361355字节

using System;class P{static void Main(){Func<string,int>F=f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1;Action<int>w=Console.WriteLine;w(F("1"));w(F("65"));w(F("93993"));w(F("3"));}}

格式化版本:

using System;

class P
{
    static void Main()
    {
        Func<string,int>F=f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1;
        Action<int>w=Console.WriteLine;
        w(F("1"));
        w(F("65"));
        w(F("93993"));
        w(F("3"));
    }
}

伊迪奥!

注意:我误算了第一个版本。它是361个字节,而不是363个字节。

[C#],tio版本218字节

f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1

在线尝试!


你并不需要在你的代码的测试用例,你可以只使用一个lambda(匿名)函数,而不是一个完整的程序
扎克·法拉格

Hyarus建议using System;f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1;作为编辑。
ovs '18 -4-4

我是新来的,我认为我必须包括一个完整的程序,包括测试用例。似乎人们在使用tio.run进行演示,而不是使用ideone。我看到tio.run将代码分成几部分。

2

Haskell中208 120个字节

a=1333
x=tail$show$foldr(\p x->p`div`2*x`div`p+2*10^200)a[3,5..a]
x!n|take(length n)x==n=0|1<2=1+tail x!n
f n=1+x!show n

在线尝试!

非常感谢乔纳森·艾伦的建议!

旧版本(208字节)

(+1).((tail$g(1,0,1,1,3,3))!)
g(q,r,t,k,n,l)=([n:g(10*q,10*(r-n*t),t,k,div(10*(3*q+r))t-10*n,l)|4*q+r-t<n*t]++[g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)])!!0
x!n|take(length n)x==n=0|1<2=1+tail x!n

我实际上不知道上面的代码是如何工作的。我从本文中摘录了它,而我所实现的只是查找部分。 g(1,0,1,1,3,3)返回pi的数字,并且效率出乎意料(它在tio.run中以不到4s的时间计算了10 000个数字)。

输入是一个列表,其中包含要查找的数字。

在线尝试!


我的猜测是,莱布尼兹公式会更短。
乔纳森·艾伦

@JonathanAllan谢谢!我会试试看。我绝对喜欢这个网站!伙计们,我从你们中学到了很多!:)
Cristian Lupascu '18

@JonathanAllan我尝试使用来近似pi l=4*sum[((-1)**x/(2*x+1))|x<-[0..1e6]],但是这需要5秒才能运行,并且第7位数字已经错误。因此,计算200位数字可能不可行。无论如何,这是一个有趣的练习,所以谢谢!
克里斯蒂安·卢帕斯库

1
您想使用Euler变换(请参阅我的Jelly答案或primo的Python答案)
Jonathan Allan '18

1
参考您链接的文章,您可能会对这篇文章感兴趣,在这篇文章中,我重新实现了本文中发现的代码,而没有“故意混淆”。结果,它也更加简单(较短)。请参见“ 更快的无边界生成器”g1_ref部分中的方法。代码是python。
primo

2

Haskell,230字节

使用惰性可以在pi的无限位数中的任意位置查找数字,而不仅仅是在前200位中。哦,是的,它返回给您该数字的每个(无限多个?)实例,而不仅仅是第一个实例。

p=g(1,0,1,1,3,3)where g(q,r,t,k,n,l)=if 4*q+r-t<n*t then n:g(10*q,10*(r-n*t),t,k,div(10*(3*q+r))t-10*n,l) else g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)
z n=[(i,take n$drop i p)|i<-[1..]]
f l=[n|(n,m)<-z$length l,m==l]

挑战中的例子

>  take 10 $ f [1]
[1,3,37,40,49,68,94,95,103,110]
>  take 10 $ f [6,5]
[7,108,212,239,378,410,514,672,870,1013]
>  take 1 $ f [9,3,9,9,3]
[42]
>  take 10 $ f [3]
[9,15,17,24,25,27,43,46,64,86]

学分

'p'是pi数字的无限流,取自https://rosettacode.org/wiki/Pi#Haskell

> take 20 p
[3,1,4,1,5,9,2,6,5,3,5,8,9,7,9,3,2,3,8,4]

我想您已经知道了,但是您只需要输出序列中的第一个数字即可
Timtech '18

只是以为我会拥抱无限:D
tombop

2

SmileBASIC,179个 164字节

INPUT I$FOR I=0TO 103Q$=Q$+STR$(ASC("\A#YO &.+& O2TGE']KiRa1,;N(>VYb>P0*uCb0V3 RB/]T._2:H5;(Q0oJ2)&4n7;@.^Y6]&"[I]))NEXT?INSTR(Q$,I$)+1

pi的数字被硬编码并打包到字符的ascii值中。14-> CHR$(14),15-> CHR$(15),92-> \,65-> A,35-> #

该字符串包含不可打印的字符,因此以下是用十六进制写入的字节: 0E 0F 5C 41 23 59 4F 20 26 2E 1A 2B 26 20 4F 32 1C 54 13 47 45 27 5D 4B 69 52 00 61 31 2C 3B 17 00 4E 10 28 3E 56 14 59 62 3E 50 03 30 19 03 2A 75 00 43 62 15 30 00 56 33 20 52 1E 42 2F 00 5D 54 2E 00 5F 32 3A 16 1F 48 35 3B 28 51 1C 30 6F 4A 32 1C 29 00 1B 00 13 26 34 6E 37 3B 40 2E 16 5E 59 36 5D 00 26 13 06

以十进制显示,您可以看到pi的数字: 14 15 92 65 35 89 79 32 38 46 26 43 38 32 79 50 28 84 19 71 69 39 93 75 105 82 0 97 49 44 59 23 0 78 16 40 62 86 20 89 98 62 80 3 48 25 3 42 117 0 67 98 21 48 0 86 51 32 82 30 66 47 0 93 84 46 0 95 50 58 22 31 72 53 59 40 81 28 48 111 74 50 28 41 0 27 0 19 38 52 110 55 59 64 46 22 94 89 54 93 0 38 19 6


如果您发布完整的代码,则可以更轻松地验证您的答案。
primo

1
我无法发布它,因为有无效字符被删除/未显示。我想我可以发布ascii代码。
18Me21年

您可以发布一个十六进制转储,例如使用xxd。
纳撒尼尔(Nathaniel)

2

红宝石37 35字节

p"#{BigMath::PI 200}"[3..-3]=~/#$_/

在线尝试!

没什么特别的,只是展示了内置库。输出为0索引。Pi字符串的格式为0.31415...e1,因此我们需要剥离前三个字符。最后的e1部分实际上并没有造成任何伤害,但是它也被剥离了,因为无论如何我们都需要提供一个范围结束(或切片长度)值。


简短易读!
pjs

2

木炭27 15字节

I⊖∨⌕I▷N⟦≕Piφ⟧θχ

在线尝试!链接是详细版本的代码。最多可处理1000位数字。说明:

        ≕Pi     Get variable `Pi`
           φ    Predefined variable 1000
     ▷N⟦    ⟧   Evaluate variable to specified precision
    I           Cast to string
             θ  First input
   ⌕            Find
              χ Predefined variable 10
   ∨             Logical OR
  ⊖              Decrement
 I               Cast to string
                 Implicitly print

固定,13个字节。旁注:感觉真的很作弊:P
ASCII码,仅ASCII

实际固定为13个字节。使用隐式输入。(不是预期的行为,但它似乎比其他任何方式都有用)。您还可以链接到填充错误的示例吗?
–仅ASCII

仅限@ASCII填充怪异度 -为何光标最终到达那里?
尼尔

:| 哦,我不知道我应该尽快修复
ASCII码仅

nvm我是个白痴,已提交修复程序。
–仅ASCII

2

Japt186个 177字节

`nqnrvosrpruvtvpopuqsosqppÕÝvr¶uuqnvtnsvpvvptrnmruomvtqvqqrvopmÉæqÛàÑ$vvÔàmpqupqm¡vuqum«rnpopmssqtmvpuqqsmvrrmruoopÌÊprvqÛ$uqunnqr¶uqn¶tmnvpÔnmrrrvsqqsoovquvrqvpmpunvs`®c -#mÃbU

由于Japt共享Javascript的15位Pi约束和shoco,Japt使用的编码不会对数字进行编码,因此压缩需要一些技巧。

简短地说,开头是以下编码形式的字符串:

"nqnrvosrpruvtvpopuqsosqppupotvrmouuqnvtnsvpvvptrnmruomvtqvqqrvopmtunsqmsousomuvvusoumpquorpqonntmstvuonqumusrnpouopmssqtmvpuqqsmvrrmruoopntorprvqmunouqunnntqrmouqnmotmnvpuronnmrrrvsqqsoovquvrqvpmpunvs"

每个字母所在的字符串'm' + corresponding digit of pi。我测试了整个字母,然后该字母以几个字节提供了最佳压缩效果。

反引号告诉Japt解码字符串。其余的内容非常简单:

®c -#mÃbU
®          // Given the above string, map each letter
 c         // and return its charcode
   -#m     // minus the charcode of 'm', 109.
      Ã    // When that's done,
        bU // find the index of the implicit input U.

输出匹配片段的从0开始的索引。
多亏了奥利弗,剃光了两个字节。

在线尝试!


1
聪明的主意!您可以替换£X使用®,并} Ã
奥利弗

@Oliver非常感谢您,我仍在学习Japt,因此非常感谢所有帮助。
Nit

1
到目前为止,您的表现很棒!我很好奇,看看是否有比109更好的偏移。我制作了一个bruteforcer,结果证明109是最佳的。做得很好:)
奥利弗·奥利弗

@Oliver谢谢您,我只是手动尝试了整个az范围,因为它工作量不大。:P
Nit

1

AWK -M,131个119 117字节

使用-M标志进行任意精度计算。p=k=0已向TIO链接添加(5个字节)以允许多行输入

{CONVFMT="%.999f";PREC=1e3;for(p=k=0;k<1e3;)p+=(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))/16^k++;$0=$1==3?9:index(p,$1)-2}1

在线尝试!

说明:

{CONVFMT="%.999f";  # Allows 999 decimal digits to be used when numbers are convert to strings
PREC=1e3;           # Digits of precision to use for calculations
for(;k<1e3;)p+=(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))/16^k++; # The most concise numerical calculation I could find. It doesn't converge  extremely rapidly, but it seems to work OK
$0=$1==3?9:index(p,$1)-2}  # Replace input line with either 9 or index-2
                           # since indices will either be 1 (meaning 3 was input) or >= 3
1                   # Print the "new" input line

我第一次尝试sprintf获取小数。使用CONVFMT绝对更清洁。
罗伯特·本森

2
无需使用标志:元共识是认为这是一种不同于AWK的语言,“带有-M标志的AWK ”
Giuseppe

很高兴知道。我想我应该花更多的时间在元数据上... :)
罗伯特·本森

1

果冻,24字节

ȷ*
ȷR×¢:Ḥ‘$ƲU×:¢+¢ʋ/ḤṾḊw

在线尝试!

使用类似Machin的公式,特别是1/4 pi == tan -1(1/2)+ tan -1(1/3)。

使用公式pi / 2 == 1 + 1/3×(1 + 2/5×(1 + 3/7×(1 + 4/9×(...)))))


有没有办法从ØPM中获取数字?
dylnan '18

@dylnan 有点,但M不是果冻。
user202729'4-4-18

我知道他们不同。不敢相信我没有想到floor。介意我是否将其用作M中的答案?
dylnan '18

没关系。无法在104位以上 ...
dylnan

1

Python 2 239 238 229 214字节

-9个字节(由于@primo)

from bigfloat import*;a=s=n=10**10**5;b=k=0
while a:k+=1;a*=k*(k*(108-72*k)-46)+5;a/=k**3*(640320**3/24);s+=a;b+=k*a
with precision(10**7):print`(426880*sqrt(10005*n)*n)/(13591409*s+545140134*b)`.find(input())-16

使用Chudnovsky-Ramanujan算法查找π 的前一百万个数字 50000个数字10**10**5改为10**10**6),然后查找它们以查找所需的字符串。


我试图确认结果,但似乎没有终止(n=10**10**5大约需要10秒)。
primo

@primo我从来没有说过这太快了!10**10**6在我的机器上大约需要7分钟。.公平地说,10**10**5给出了前50000位数字,所以我想也不错:)
DividedByZero

@primo我已将任意精度库更改为bigfloat,它现在运行得更快。
DividedByZero

现在它要快得多,我建议切换到gmpy2,但bigfloat可以节省十几个字节。如果您移至迭代的开始,k则可以与的分配合并。可以更简洁地写成。如果您声明Python 2,则可以将整数除以,并且也不需要括号。也可以在中删除空间。只验证到50000位数字,顺便说一句。k=b=0k+=1-(6*k-5)*(2*k-1)*(6*k-1)k*(k*(108-72*k)-46)+5///printimport*
primo

nsqrt(10005*n)似乎是问题; 它会将小数点移至第50000位。如果您有兴趣,这里是我自己的Chudnovsky实现:在线尝试!
primo

1

Visual Basic-114字节

好的,第一次提交。放轻松我吧!

    Dim s,p As String
    s=Console.Readline()
    p=Math.PI
    Console.Write((p.IndexOf(s,2)-1))

欢迎反馈!

我并没有限制PI的前256个部分,因为问题表明“您不必”,而不是“您不应该”,希望我做对了:)


我对虚拟基础知识了解不多,但是我想您可以通过删除所有空格来节省一些字节。您还应该能够将代码存储到一个函数中并返回该值,而不是返回它的“ console.log”(我想您会获得类似的字节)。哦,您必须输入该值而不是对其进行硬编码。
随机家伙

谢谢。删除了空格,并删除了硬编码值,以利于输入。将计数增加到114!返回值的函数是否不包括在字节数中?我想如果这样的话,它会更长一些。
user9338709'4

欢迎光临本站!看起来好像可以运行(在线尝试!),但是它似乎是一个片段,提交的内容必须是完整的程序或功能。
Dom Hastings

这样的事情可能会起作用,但是可能有更好的方法来做这些事情!请查看该页面顶部的链接菜单,以获取大量提交所使用的模板!
Dom Hastings

事实上,它看起来像常数不具有200位:( 在线试试吧! -这应该返回197.
大教堂黑斯廷斯

0

Javascript 217个字节(200个硬编码)

a=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".search(a)+1

0

PHP,27字节

这不是一个很明智的答案,它需要更改php.ini设置,因为pi()默认为14位,而不是200位,但是对于PHP解决方案来说,它是相当优雅的:

<?=strpos(pi(),$_GET[n])-1;

我认为这实际上不会起作用。precisionphp.ini中的标记只会更改显示精度,而实际上不会增加​​已定义常量的精度。见证人
primo

0

朱莉娅0.6,53字节

setprecision(9^6)
x->searchindex("$(big(π))","$x",3)

将BigFloats的精度设置得足够高,然后转换pi为字符串并进行搜索。9^6手柄精度159980位数。

在线尝试!



0

Perl 5,带有-MMath::BigFloat+bpi-n,20个字节

bpi($>)=~/.$_/;say@-

在线尝试!

我不确定$>支架的用途,因为它EFFECTIVE_USER_ID不是便携式的,但在TIO上为1000,可以满足我们对-1字节vs.的要求200


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.