Pi รับเบอร์ของคุณ


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
และแน่นอนว่าพี่ไม่ควรที่จะไม่มีที่สิ้นสุด อย่างไรก็ตามมันคือการแทนทศนิยม, มีตัวเลขไม่ จำกัด
rafa11111

11
@Dennis Normal เป็นเงื่อนไขที่แข็งแกร่งมากขึ้น (ทุกชุดเทียบกับที่มีอยู่ทั้งหมด)
user202729

6
เราได้รับอนุญาตให้ส่งออกดัชนีที่ 0 ที่จัดทำnดัชนีแล้วหรือไม่? ดังนั้นกรณีที่ข้อความจะกลับมาแทน0, 6, 41, 8 1, 7, 42, 9
Kevin Cruijssen

7
@ rafa11111 ฉันเห็นด้วย เราควรละทิ้งจำนวนเต็มและใช้ตัวเลขใน base-PI จำนวนเต็มจะมีจำนวนอนันต์แทน
mbomb007

คำตอบ:


22

Python 2, 69 75 71 67 ไบต์

ที่บันทึกไว้ 4 ไบต์เนื่องจากcoinheringaahing Caird

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 #

ลองออนไลน์!


ดีไม่ใช่ฮาร์ดโค้ดหรือใช้ในตัว (เพราะ Python ไม่มี)
user202729


2
@Dennis 31 ต้องจับคู่ที่ 137: /
primo

2
อัลกอริธึมการประมาณแบบนี้คืออะไร? มันเป็นหนึ่งในรายการที่นี่? en.wikipedia.org/wiki/Approximations_of_%CF%80
Sphinxxx

4
@Sphinxxx มันคือการใช้งานออยเลอร์เปลี่ยนเป็นชุด Leibniz ผมเคยโพสต์มาในโพสต์ก่อนหน้านี้
primo

19

Husk , 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
ไร้สาระ - แต่ฉันต้องยอมรับว่าฉันประทับใจ
Floris

6
ด้วยภาษากอล์ฟมักเป็นความคิดที่ดีที่จะเพิ่มคำอธิบายเนื่องจากคนที่ไม่รู้ภาษาจะไม่สามารถอ่านได้ ถ้าฉันเข้าใจถูกต้องมันคือ: ใช้ดัชนีของ ( ) กับรายการแรก (3 นำหน้า) ลบ ( t) ของหลักของ PI ( İπ), แปลงเป็นฐาน 10 ( d) และเอาท์พุทเป็น STDOUT (โดยปริยาย)
Kevin Cruijssen

เห็นด้วยฉันไม่รู้ว่าฉันกำลังมองอะไรอยู่
JA Terroba

1
@gggg ดูเหมือนว่ามันเป็นตัวแทนขี้เกียจตัวอย่าง , ตรวจสอบ
ASCII เท่านั้น

1
@gggg İπเป็นรายการของตัวเลขที่ไม่สิ้นสุดสร้างขึ้นด้วยแหล่งที่มา
H.PWiz

18

Excel, 212 ไบต์

=FIND(A1,"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196")

Excel จัดการกับทศนิยม 15 ตำแหน่งเท่านั้นดังนั้น pi จึงเป็นรหัสฮาร์ดโค้ด นี่ควรจะเป็นขอบเขตบนที่ค่อนข้างอ่อนสำหรับความท้าทายนี้


4
ฉันขอโทษที่แสดงความคิดเห็นในโพสต์ของตัวเอง แต่ผู้อัปยศบางคนสามารถบอกฉันได้ว่าทำไมพวกเขาถึงชอบคำตอบนี้ มันเป็นกอล์ฟที่สามารถอยู่ในสูตร Excel แต่มันยาวมากและไม่ฉลาดเลย
Engineer Toast

6
ฉันชอบสิ่งนี้เพราะมันไม่ได้ขึ้นอยู่กับภาษากอล์ฟที่มี builtins ในการคำนวณ pi ให้เป็นทศนิยมตามใจชอบ มันอาจไม่ใช่ความคิดสร้างสรรค์ แต่เป็นประโยชน์ (ไม่ใช่ความจริงที่สำคัญ)
สกอตต์

ในฐานะที่เป็นคำถามที่ไม่ได้ระบุว่าการป้อนข้อมูลหรือคำตอบที่ได้จะเป็นฐาน 10 จะทำได้คุณกอล์ฟนี้โดยใช้CONCATและสูตร BBPในการคำนวณ 200 หลักแรกของπ-base16 และค้นหาในเลขฐานสิบหกแทน? (ไม่มี 365 ดังนั้นจึงไม่สามารถทดสอบได้)
Chronocidal

2
Office 365 เท่านั้น: ใช้CONCAT, CODEและMIDฉันลดลงสตริง PI จาก 202 ตัวอักษร (คำพูด Inc) 143:CONCAT(CODE(MID(".ÜÁ£ÙÏ ¦®š«¦ Ï²œÔ“ÇŧÝËŠº”ᱬ»—‡ÑÀ†œ¾ˆãÖœƒ°™¢•‘†ÏÒŽÐÖ³ ÒžÂ¯‰¦¬¼ß²º–ŸÈµ»¨Ñœ°‹‘­‚ÔŠ›ÝÕ•Š·»À®–Þٶ݃Ñà",2*ROW(A1:A100)-1,2))-32)
Chronocidal

1
ทดสอบกับ Office365 ดูเหมือนว่ามันจะเป็นผลลัพธ์ 14 โดยไม่คำนึงถึงอินพุตหรือไม่
แมทธิว Schlachter

9

Java 8, 615 217 202 184 182 166 165 ไบต์ (คำนวณ999 200 หลัก)

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 การจัดทำดัชนี

ลองออนไลน์

builtin ของ Java นั้นMath.PIมีความแม่นยำถึง 15 ค่าทศนิยมเช่นเดียวกับภาษาอื่น ๆ อีกมากมาย จะมีตัวเลขมากขึ้นคุณจะมีการคำนวณด้วยตัวคุณเองด้วยหรือBigIntegers BigDecimalsนี่เป็นวิธีที่จะทำได้ .. บางทีใครบางคนสามารถเล่นกอล์ฟได้ต่ำกว่า 211 ไบต์ฮ่า ๆ ..
แก้ไข: สร้างพอร์ตของPython 2 คำตอบของ@primo (ให้แน่ใจว่าได้ลงคะแนนเขา!) ดังนั้นการคำนวณให้สั้นกว่าฮาร์ด รหัสไม่ได้ถูกเรียกอีกต่อไป เพียง 7 ไบต์ที่จะตีกอล์ฟให้สั้นลง

-15 ไบต์ขอบคุณ@Neilทำให้สั้นกว่าคำตอบแบบตายตัวด้านล่าง!
-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;เพราะvar1 ไบต์สั้นกว่า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 รายการ
Neil

ไม่แน่ใจว่าฉันคิดถึงคนแรกได้อย่างไร แต่อย่างที่สองฉันต้องจำจริงๆ ไม่ทราบว่ามีindexOfวิธีการที่ข้ามmอักขระตัวแรก ขอบคุณมาก!
Kevin Cruijssen

1
วิธีการเกี่ยวกับการรักษา p จำนวนเต็ม ?
โม่

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-byte ที่คล้ายกันในภาษาเดียวกันฉันจะลบคำตอบของฉันได้ไหม?
nicael

@nicael มักจะไม่ได้เรื่อง แต่วิธีการแก้ปัญหาของคุณล้มเหลวสำหรับ3อยู่ดี
ยูเรียล

โอ้จริง ๆ แล้ว
ขอบคุณ

6

MATL , 16 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 Mendo

4

แพ็คเกจR + numbers 52 ไบต์

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

ลองออนไลน์!

dropletPiคำนวณตัวเลข 200 หลักแรกของpiแต่รวมถึง3.ที่จุดเริ่มต้นดังนั้นเราจึงตัดออกด้วยsubstringแล้วจับคู่กับregexecซึ่งจะส่งกลับดัชนีของการแข่งขันพร้อมกับข้อมูลเมตาบางส่วนเกี่ยวกับการแข่งขัน


อาจจะregexpr(scan(),numbers::dropletPi(200))-2?
djhurio

@djhurio ที่ไม่ทำงานเพราะเราต้องจับคู่ในหลักหลังจุดทศนิยม นั่นเป็นความคิดแรกของฉันเช่นกัน แต่ในกรณีนั้นมันก็พัง อาจจะ"if"?
Giuseppe

ฉันไม่เห็นปัญหาที่นี่ ไม่ใช่ของอินพุตจะมี3.(ฉันถือว่าเราจัดการกับจำนวนเต็มไม่ reals ในอินพุต) ตัวอย่างการทดสอบใช้งานได้กับสิ่งนี้
djhurio

3
@djhurio ทางขวา แต่regexpr(3,numbers::dropletPi(200))-2ผลตอบแทน-1 เมื่อมันควรกลับ9, ลอง
จูเซปเป้

3

เยลลี่ 23 ไบต์

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

ลิงก์ monadic ยอมรับรายการของอักขระ (จำนวนเต็มเพื่อค้นหา) และส่งคืนดัชนี ใช้งานได้กับอินพุตภายใน 252 หลักแรกของส่วนทศนิยมของ decimal

ลองออนไลน์!

อย่างไร?

สิ่งนี้ใช้สูตร 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)


คุณหมายถึงการแปลงของออยเลอร์ที่ใช้กับสูตรไลบนิซ การคำนวณตัวเลข 252 ด้วยสูตร Leibniz จะใช้เวลานานกว่าคนส่วนใหญ่ที่จะรอ
โม่

ใช่มันจะใช้เวลานานในรูปแบบดิบ (ยัง "ใช้สูตร Leibniz" ฉันเชื่อ!)
Jonathan Allan

3

BASH (GNU / Linux), 75 67 66 ไบต์

บันทึก 1 ไบต์ต้องขอบคุณ Sophia Lechner และ 7 ไบต์ขอบคุณวัวตัวจริง

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

นี่คือเชลล์สคริปต์ที่รับอาร์กิวเมนต์ตัวเดียวซึ่งก็คือตัวเลข ทดสอบด้วย

$ 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

ผลลัพธ์ของไปป์ไลน์นี้ถูกกำหนดให้กับตัวแปรเชลล์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

คุณสามารถแปลงเป็นโปรแกรมและใช้ sed เพื่อบันทึกไบต์ลองออนไลน์!
Kritixi Lithos

@Cowsquack ฉันไม่จำเป็นต้องรวมสาย shebang ในจำนวนไบต์แล้ว?
cmaster

บรรทัด @cmaster shebang ไม่รวมอยู่ในจำนวนไบต์สำหรับภาษาใด ๆ
Kritixi Lithos

@ Cowsquack ขอบคุณสำหรับคำแนะนำ อย่างไรก็ตามหากคุณอนุญาตให้มีเอาต์พุตเพิ่มเติมคุณอาจจะต้องละทิ้งsedเช่นกัน (ดูส่วนที่สองของคำตอบของฉัน) อย่างไรก็ตามการเปลี่ยนเป็นโปรแกรมให้ฉัน 7 ไบต์ดังนั้นขอบคุณสำหรับสิ่งนั้น! ฉันได้แทนที่tr/ headcombo ด้วย magic shell variable ตอนนี้เพื่อบันทึก byte อื่น
cmaster

2

JavaScript, 197 187

-10: ขอบคุณนีล !

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

ใช้ชุดของจำนวนเต็มเก้าหลัก -36 จำนวนเต็มแปลงเป็นฐาน 10 และเชื่อมต่อกันเพื่อสร้าง 200 หลักแรกของ pi


ที่ดีคุณเป่าความพยายามของฉันในการเข้ารหัสข้อมูลออกจากน้ำวิธีการของคุณบันทึก 38 ไบต์ในข้อมูลดิบ
นิด

+1 - ฉันกำลังจะโพสต์วิธีการเดียวกันแน่นอน
darrylyeo

ใช้x=>'50...'.replace(/.{9}/g,a=>parseInt(a,36)).search(x)+1เพื่อบันทึก 10 ไบต์
Neil

2

ครั้งแรกที่ทำรหัสกอล์ฟ ใช้ผู้ได้รับมอบหมายและแลมบ์ดานิพจน์เพื่อลดการเรียกใช้ฟังก์ชัน V2 ย่อชื่อคลาสให้สั้นลงเป็นไบต์เดียว

[C #], 361 355 ไบต์

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"));
    }
}

Ideone!

NB.I ผิดรุ่นแรก เป็น 361 ไบต์ไม่ใช่ 363 ไบต์

[C #] รุ่น tio 218 ไบต์

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

ลองออนไลน์!


คุณไม่จำเป็นต้องรวมกรณีทดสอบไว้ในรหัสของคุณและคุณสามารถใช้ฟังก์ชัน lambda (ไม่ระบุชื่อ) แทนโปรแกรมเต็มรูปแบบ
Zac Faragher

Hyarusแนะนำusing System;f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1;ว่าเป็นการแก้ไข
ovs

ฉันใหม่ที่นี่และฉันคิดว่าฉันจะต้องรวมโปรแกรมเต็มรูปแบบรวมถึงกรณีทดสอบ ดูเหมือนว่าผู้คนใช้ 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

ลองออนไลน์!

ขอบคุณมากสำหรับJonathan Allanสำหรับคำแนะนำของเขา!

รุ่นเก่า (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 และมีประสิทธิภาพอย่างน่าประหลาดใจ (คำนวณได้ 10,000 หลักบน tio.run ในเวลาน้อยกว่า 4s)

อินพุตเป็นรายการที่ประกอบด้วยตัวเลขของจำนวนที่จะพบ

ลองออนไลน์!


ฉันเดาว่าสูตรไลบนิซจะสั้นกว่านี้มาก
Jonathan Allan

@JanathanAllan ขอบคุณ! ฉันจะลองดู ฉันรักเว็บไซต์นี้อย่างแน่นอน! ฉันได้เรียนรู้มากมายจากคุณนะ! :)
Cristian Lupascu

@JanathanAllan ฉันพยายามประมาณค่า pi โดยใช้l=4*sum[((-1)**x/(2*x+1))|x<-[0..1e6]]แต่นั่นใช้เวลา 5s ในการทำงานและหลักที่ 7 ผิดไปแล้ว ดังนั้นจึงเป็นไปไม่ได้ที่จะคำนวณ 200 หลัก มันเป็นการออกกำลังกายที่น่าสนใจอยู่แล้วขอบคุณมาก!
Cristian Lupascu

1
คุณต้องการที่จะใช้การแปลงออยเลอร์ (ดูคำตอบ Jelly ของฉันหรือคำตอบ Python ของ primo)
Jonathan Allan

1
ในการอ้างอิงถึงเอกสารที่คุณเชื่อมโยงคุณอาจสนใจโพสต์นี้ซึ่งฉันใช้รหัสที่พบในบทความนี้อีกครั้งโดยไม่ต้อง "ทำให้งงงวยโดยเจตนา" ผลลัพธ์ก็ค่อนข้างเรียบง่ายกว่า (สั้นกว่า) ดูวิธีการg1_refในส่วนปั่นไฟ Unbounded ได้เร็วขึ้น รหัสคือหลาม
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' เป็นสตรีมแบบไม่สิ้นสุดของไพเลขนำมาจาก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

แค่คิดว่าฉันจะโอบกอดไม่มีที่สิ้นสุด: 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 -> A35 #->

สตริงมีอักขระที่ไม่สามารถพิมพ์ได้ดังนั้นนี่คือไบต์ที่เขียนเป็นเลขฐานสิบหก: 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

ในทศนิยมคุณสามารถดูตัวเลขของปี่: 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 ได้
12Me21

คุณสามารถโพสต์ hexdump โดยใช้ xxd เช่น
นาธาเนียล

2

Ruby , 37 35 ไบต์

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

ลองออนไลน์!

ไม่มีอะไรพิเศษเพียงแค่แสดงไลบรารีในตัว เอาท์พุทเป็นดัชนี 0 สตริง Pi มีการจัดรูปแบบเป็น0.31415...e1ดังนั้นเราจึงจำเป็นต้องตัดออก 3 ตัวอักษรแรก e1ส่วนหนึ่งในท้ายที่สุดไม่ได้จริงๆทำอันตรายใด ๆ แต่มันก็ถอดเกินไปในขณะที่เราต้องให้จบช่วง (หรือความยาวชิ้น) อยู่แล้วคุ้มค่า


สั้นและอ่านง่าย!
pjs

2

Charcoal , 27 15 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด ใช้งานได้เกือบ 1,000 หลัก คำอธิบาย:

        ≕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
เท่านั้น

คงจริง 13 ไบต์ ใช้อินพุตโดยปริยาย (ไม่ใช่พฤติกรรมที่ตั้งใจ แต่ดูเหมือนว่ามีประโยชน์มากกว่าวิธีอื่นใด) คุณสามารถเชื่อมโยงไปยังตัวอย่างของข้อบกพร่องการเติมได้หรือไม่
ASCII เท่านั้นเท่านั้น

@ ASCII- เติมความแปลกเท่านั้น- ทำไมเคอร์เซอร์ถึงอยู่ที่นั่น?
Neil

: | โอ้ฉันไม่มีความคิดที่ฉันควรแก้ไขโดยเร็ว
ASCII เท่านั้น

NVM ฉันงี่เง่าแก้ไขความมุ่งมั่น
ASCII เท่านั้น

2

Japt , 186 177 ไบต์

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

เนื่องจาก Japt แบ่งปันข้อ จำกัด Pi 15 หลักและshoco ของ Javascriptการเข้ารหัสที่ Japt ใช้ไม่ได้เข้ารหัสตัวเลขดังนั้นจึงจำเป็นต้องมีการเข้ารหัสบางส่วนสำหรับการบีบอัด

อธิบายสั้น ๆ จุดเริ่มต้นเป็นสตริงด้านล่างในรูปแบบที่เข้ารหัส:

"nqnrvosrpruvtvpopuqsosqppupotvrmouuqnvtnsvpvvptrnmruomvtqvqqrvopmtunsqmsousomuvvusoumpquorpqonntmstvuonqumusrnpouopmssqtmvpuqqsmvrrmruoopntorprvqmunouqunnntqrmouqnmotmnvpuronnmrrrvsqqsoovquvrqvpmpunvs"

'm' + corresponding digit of piซึ่งเป็นสตริงที่เป็นตัวอักษรแต่ละตัว ฉันทดสอบตัวอักษรทั้งหมดและตัวอักษรนั้นให้การบีบอัดที่ดีที่สุดโดยไม่กี่ไบต์

Backticks บอกให้ Japtor ถอดรหัสสตริง ส่วนที่เหลือมันค่อนข้างตรงไปตรงมา:

®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 ดังนั้นความช่วยเหลือทั้งหมดที่ชื่นชมมาก
นิตย์

1
คุณทำได้ดีมากแล้ว! ฉันอยากรู้ว่ามีการชดเชยที่ดีกว่า 109 หรือไม่ฉันทำ bruteforcerและปรากฎว่า 109 เหมาะสมที่สุด ทำได้ดีมาก :)
โอลิเวอร์

@Oliver ขอบคุณสำหรับสิ่งนั้นฉันลองใช้ช่วง az ทั้งหมดด้วยตนเองเนื่องจากมันไม่ทำงานมากเกินไป : P
Nit

1

AWK -M, 131 119 117 ไบต์

ใช้-Mแฟล็กสำหรับการคำนวณความแม่นยำโดยพลการ เพิ่มp=k=0(5 ไบต์) ในลิงก์ TIO เพื่ออนุญาตการป้อนข้อมูลแบบหลายบรรทัด

{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นั้นสะอาดกว่าแน่นอน
Robert Benson


ดีแล้วที่รู้. ฉันเดาว่าฉันควรใช้เวลามากขึ้นในการเมตา ... กับเวลาว่างของฉัน :)
Robert Benson

1

เยลลี่ 24 ไบต์

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

ลองออนไลน์!

ใช้สูตรที่เหมือนแมชชินโดยเฉพาะ 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 × (... )))


มีวิธีรับตัวเลขจากØPใน M หรือไม่
dylnan

@dylnan Somewhat, but M is not Jelly.
user202729

I know they're different. Can't believe I didn't think of floor. Mind if I use that to post as answer in M?
dylnan


1

Python 2 239 238 229 214 bytes

-9 bytes due to @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

Uses the Chudnovsky-Ramanujan algorithm to find the first 1 million digits 50000 digits of π (change 10**10**5 to 10**10**6 for more, but it takes ages to run) and then searches them for the desired string.


I tried to confirm the result but it doesn't seem to terminate (n=10**10**5 takes about 10s).
primo

@primo I never said it was fast! 10**10**6 takes about 7 minutes on my machine.. To be fair, 10**10**5 gives the first 50000 digits, so I guess it's not that bad either :)
DividedByZero

@primo I've changed the arbitrary precision library to bigfloat, it runs much quicker now.
DividedByZero

It's much faster now, I was going to suggest switching to gmpy2, but bigfloat saves a dozen or so bytes. The assignment of k can be merged with k=b=0 if you move k+=1 to the start of the iteration. -(6*k-5)*(2*k-1)*(6*k-1) can be written more succinctly as k*(k*(108-72*k)-46)+5. If you declare Python 2, the // integer divisions can be replaced by /, and also parentheses aren't necessary for print. Space can also be removed in import*. Only validates to 50000 digits, btw.
primo

The n in sqrt(10005*n) seems to be the problem; it's moving the decimal point to 50000th place. In case you're interested, here's my own Chudnovsky implementation: Try it online!
primo

1

Visual Basic - 114 Bytes

Okay, first submission. Go easy on me!

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

Feedback welcome!

I haven't restricted to the first 256 parts of PI as the question says "You don't have to", not "You shouldn't" Hope I'm doing this right :)


I don't know much about virtual basic, but i guess you can save some bytes by removing all the spaces. You also should be able to store your code into a function and return the value instead of "console.log" it (i guess you would gain some bytes like that). Oh, and you have to input the value and not hardcode it.
The random guy

Thanks. Removed spaces and removed the hardcoded value in favour of input. Increases the count to 114! Would the function for returning the value not be included in the byte count? I imagine it would make it longer if so.
user9338709

Welcome to the site! This looks like it works (try it online!), but it appears to be a snippet and submissions need to be either a full program, or a function.
Dom Hastings

Something like this might work, but there are probably better ways to do the things! Check out the link menu at the top of that page for the template a lot of submissions use!
Dom Hastings

Actually, it looks like the constant doesn't have 200 digits :( Try it online! - this should return 197.
Dom Hastings

0

Javascript 217 bytes (200 hardcoded)

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

0

PHP, 27 bytes

Not a very serieus answer, it requires a change in the php.ini settings as pi() defaults to 14 digits, not 200, but for once the PHP solution is fairly elegant:

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

I don't think this will actually work. the precision tag in php.ini only alters the display precision, and doesn't actually increase the precision of defined constants. witness
primo




โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.