ค้นหาตัวเลขภายในค่าคงที่ของ Copeland – Erd


17

พื้นหลัง

โคป-แอร์ดิชคงเป็นกำหนดการ "0. ว่า" กับฐาน 10 แทนจำนวนเฉพาะในการสั่งซื้อ ค่าของมันคือ

0.23571113171923293137414...

ดูเพิ่มเติมOEIS A033308

โคปและแอร์ดิชได้รับการพิสูจน์ว่าเป็นจำนวนปกติ นี่ก็หมายความว่าทุกจำนวนธรรมชาติสามารถพบได้ในบางจุดในการขยายทศนิยมของค่าคงที่ของ Copeland-Erd

ความท้าทาย

กำหนดจำนวนเต็มบวกให้แสดงในฐาน 10 (โดยไม่มีศูนย์นำหน้า) และส่งออกดัชนีการปรากฏตัวครั้งแรกภายในลำดับเลขทศนิยมของค่าคงที่ Copeland – Erd Er

อนุญาตรูปแบบอินพุตและเอาต์พุตที่เหมาะสม แต่อินพุตและเอาต์พุตควรอยู่ในฐาน 10 โดยเฉพาะอินพุตสามารถอ่านเป็นสตริงได้ และในกรณีนั้นสามารถสันนิษฐานได้ว่าไม่มีเลขศูนย์นำหน้า

เอาต์พุตอาจเป็นแบบอิง 0 หรืออิง 1 เริ่มต้นจากทศนิยมแรกของค่าคงที่

ผลลัพธ์ที่แท้จริงอาจถูก จำกัด ด้วยชนิดข้อมูลหน่วยความจำหรือกำลังประมวลผลและโปรแกรมอาจล้มเหลวในบางกรณีการทดสอบ แต่:

  • ควรทำงานในทางทฤษฎี (เช่นไม่คำนึงถึงข้อ จำกัด เหล่านั้น) สำหรับข้อมูลใด ๆ
  • ควรใช้งานจริงอย่างน้อยสี่รายแรกและสำหรับแต่ละกรณีผลลัพธ์ควรเกิดขึ้นในเวลาไม่ถึงนาที

กรณีทดสอบ

เอาต์พุตถูกกำหนดเป็น 1-based

13       -->         7   # Any prime is of course easy to find
997      -->        44   # ... and seems to always appear at a position less than itself
999      -->      1013   # Of course some numbers do appear later than themselves
314      -->       219   # Approximations to pi are also present
31416    -->     67858   # ... although one may have to go deep to find them
33308    -->     16304   # Number of the referred OEIS sequence: check
36398    -->     39386   # My PPCG ID. Hey, the result is a permutation of the input!
1234567  -->  11047265   # This one may take a while to find


เอาล่ะเกณฑ์การชนะคืออะไร
user8397947

เมื่อพิจารณารายละเอียดกฎเกี่ยวกับ I / O ฉันจะถือว่านี่คือรหัสกอล์ฟและใช้แท็ก ฉันหวังว่านี่คือสิ่งที่คุณมีในใจ
Dennis

@Dennis ใช่ขอโทษฉันลืม ขอบคุณสำหรับการแก้ไข
Luis Mendo

คำตอบ:


6

05AB1E , 14 ไบต์

ใช้เอาท์พุท 0 การจัดทำดัชนี ฟังก์ชั่นพิเศษในโอซาบีไม่มีประสิทธิภาพมาก รหัส:

[NØJD¹å#]¹.Oð¢

คำอธิบาย:

[       ]        # Infinite loop...
 N               # Get the iteration value
  Ø              # Get the nth prime
   J             # Join the stack
    D            # Duplicate this value
     ¹å#         # If the input is in this string, break out of the loop
         ¹.O     # Overlap function (due to a bug, I couldn't use the index command)
            ð¢   # Count spaces and implicitly print

ใช้การเข้ารหัสCP-1252 ลองออนไลน์! .



5

เยลลี่ขนาด 17 ไบต์

ÆRDFṡL}i
Ḥçßç?
çD

ส่งคืนดัชนีที่ใช้ 1 ลองออนไลน์! หรือตรวจสอบกรณีทดสอบมากที่สุด

ฉันตรวจสอบกรณีทดสอบล่าสุดแล้ว ใช้เวลา 8 นาที 48 วินาที

มันทำงานอย่างไร

çD        Main link. Argument: n (integer)

 D        Decimal; yield A, the array of base 10 digits of n.
ç         Call the second helper link with arguments n and A.


Ḥçßç?     Second helper link. Left argument: n. Right argument: A.

Ḥ         Unhalve; yield 2n.
    ?     If...
   ç        the first helper link called with 2n and A returns a non-zero integer:
 ç            Return that integer.
          Else:
  ß           Recursively call the second helper link with arguments 2n and A.


ÆRDFṡL}i  First helper link. Left argument: k. Right argument: A.

ÆR        Prime range; yield the array of all primes up to k.
  DF      Convert each prime to base 10 and flatten the resulting nested array.
     L}   Yield l, the length of A.
    ṡ     Split the flattened array into overlapping slices of length l.
       i  Find the 1-based index of A in the result (0 if not found).

รุ่นอื่น 11 ไบต์ (ไม่แข่งขัน)

ÆRVw³
ḤÇßÇ?

ไม่พบwอะตอมเมื่อมีการโพสต์ความท้าทายนี้ ลองออนไลน์!

มันทำงานอย่างไร

ḤÇßÇ?  Main link. Argument: n (integer)

Ḥ      Unhalve; yield 2n.
    ?  If...
   Ç     the helper link called with argument 2n returns a non-zero integer:
 Ç         Return that integer.
       Else:
  ß      Recursively call the main link with argument 2n.


ÆRVw³  Helper link. Argument: k (integer)

ÆR     Prime range; yield the array of all primes up to k.
  V    Eval; concatenate all primes, forming a single integer.
    ³  Yield the first command-line argument (original value of n).
   w   Windowed index of; find the 1-based index of the digits of the result to
       the right in the digits of the result to the left (0 if not found).

4

ที่จริงแล้ว 19 ไบต์

╗1`r♂Pεj╜@íu`;)╓i@ƒ

รับสตริงเป็นอินพุตและเอาต์พุตดัชนีที่ใช้ 1 ของสตริงย่อย

ลองออนไลน์!

คำอธิบาย:

╗1`r♂Pεj╜@íu`;)╓i@ƒ
╗                    push input to register 0
  `r♂Pεj╜@íu`;)      push this function twice, moving one copy to the bottom of the stack:
   r♂Pεj               concatenate primes from 0 to n-1 (inclusive)
        ╜@íu           1-based index of input, 0 if not found
1              ╓     find first value of n (starting from n = 0) where the function returns a truthy value
                i@   flatten the list and move the other copy of the function on top
                  ƒ  call the function again to get the 1-based index

3

Julia ขนาด 55 ไบต์

\(n,s="$n",r=searchindex(n|>primes|>join,s))=r>0?r:3n\s

ส่งคืนดัชนีที่ใช้ 1 เสร็จสิ้นการทดสอบทั้งหมดในไม่กี่วินาที ลองออนไลน์!


มีเหตุผลที่คุณเปลี่ยนจำนวนเฉพาะบน3และไม่เช่นโดย2? นอกจากนี้ยังมีวิธีที่จะขยายการทำงานให้0กับอินพุตที่สั้นกว่า...=r>0?r:3(n+9)\sหรือไม่?
charlie

3เร็วกว่า2การทดสอบเล็กน้อยและไม่เพิ่มจำนวนไบต์ สำหรับอินพุต0คุณสามารถใช้-~nแทน แต่จะช้ากว่านี้มาก
Dennis

ขอบคุณ-~3n\s(== (3n+1)\s) ดีพอ
charlie


2

J , 37 ไบต์

(0{":@[I.@E.[:;<@":@p:@i.@]) ::($:+:)

อินพุตถูกกำหนดเป็นฐาน 10 จำนวนเต็มและเอาต์พุตใช้การทำดัชนีแบบ zero-based

การใช้

   f =: (0{":@[I.@E.[:;<@":@p:@i.@]) ::($:+:)
   f 1
4
   f 13
6
   f 31416
67857

คำอธิบาย

การเรียกครั้งแรกนี้ถือว่าคำกริยาเป็น monad อย่างไรก็ตามการโทรที่ตามมาซึ่งอาจเกิดขึ้นซ้ำ ๆ จะถือว่าเป็น dyad

0{":@[I.@E.[:;<@":@p:@i.@]  Input: n on LHS, k on RHS
                         ]  Get k
                      i.@   Get the range [0, 1, ..., k-1]
                   p:@      Get the kth prime of each
                ":@         Convert each to a string
              <@            Box each string
           [:;              Unbox each and concatenate to get a string of primes
     [                      Get n
  ":@                       Convert n to a string
      I.@E.                 Find the indices where the string n appears in
                            the string of primes
0{                          Take the first result and return it - This will cause an error
                            if there are no matches

(...) ::($:+:)  Input: n on RHS, k on LHS
(...)           Execute the above on n and k
      ::(    )  If there is an error, execute this instead
           +:   Double k
         $:     Call recursively on n and 2k

1
คุณพิสูจน์ได้ไหมว่าสิ่งนี้ใช้ได้ผล?
Leun Nun

@LeakyNun โอ้ใช่ที่จริงก็ทำงานทางเทคนิคเฉพาะสำหรับกรณีทดสอบ แต่มันอาจจะไม่ได้พบในครั้งแรกnเฉพาะ
ไมล์

มันใช้งานไม่ได้กับ n = 1 เนื่องจากนายกคนแรกคือ 2 และคุณต้องการห้าช่วงแรกเพื่อรับการเกิดครั้งแรกของวันที่ 1
ไมล์

1

PowerShell v2 +, 90 ไบต์

for($a="0.";!($b=$a.IndexOf($args)+1)){for(;'1'*++$i-match'^(?!(..+)\1+$)..'){$a+=$i}}$b-2

รวมตรรกะของการค้นหาของฉันจำนวนในคำตอบที่คงที่ของ Champernowneควบคู่กับวิธีการสร้างที่สำคัญของการพิมพ์ของฉันn ที่สำคัญที่มีคำตอบที่nแล้วลบ2เพื่อส่งออกดัชนีอย่างเหมาะสม (เช่นไม่นับ0.ที่จุดเริ่มต้น)

รับอินพุตเป็นสตริง ค้นหา999หนึ่งในประมาณเจ็ดวินาทีบนเครื่องของฉัน แต่33308หนึ่งในอีกค่อนข้างนาน ( แก้ไข - ฉันให้ขึ้นหลังจาก 90 นาที ) ในทางทฤษฎีควรทำงานกับค่าใด ๆ จนถึงดัชนี[Int32]::Maxvalueaka 2147483647เนื่องจากเป็นความยาวสูงสุดของสตริง. NET มีแนวโน้มที่จะพบปัญหาหน่วยความจำนานก่อนที่จะเกิดขึ้นอย่างไรก็ตาม

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