เกมเฉพาะของ Conway


18

โดยเฉพาะคอนเวย์ PRIMEGAME

นี่คืออัลกอริทึมที่คิดค้นโดย John H. Conway เพื่อสร้างช่วงเวลาโดยใช้ลำดับหมายเลข 14 จำนวน:

 A   B   C   D   E   F   G   H   I   J   K   L   M   N
17  78  19  23  29  77  95  77   1  11  13  15  15  55
--  --  --  --  --  --  --  --  --  --  --  --  --  --
91  85  51  38  33  29  23  19  17  13  11  14   2   1

ยกตัวอย่างเช่น F 77/29เป็นเศษ

ดังนั้นนี่คือวิธีที่อัลกอริธึมหาจำนวนเฉพาะ เริ่มต้นด้วยตัวเลข2ค้นหารายการแรกในลำดับที่เมื่อคูณด้วยกันจะสร้างจำนวนเต็ม นี่มันเป็นM, ซึ่งเป็นผู้ผลิต15/2 15จากนั้นสำหรับจำนวนเต็ม15นั้นให้ค้นหารายการแรกในลำดับที่เมื่อคูณแล้วจะสร้างจำนวนเต็ม นั่นเป็นครั้งสุดท้ายอย่างใดอย่างหนึ่งNหรือซึ่งอัตราผลตอบแทน55/1 825เขียนลำดับที่สอดคล้องกัน (ความเฉลียวฉลาดในหมู่คุณอาจจำได้ว่านี่เป็นโปรแกรมFRACTRAN )

หลังจากทำซ้ำแล้วคุณจะได้รับสิ่งต่อไปนี้:

2, 15, 825, 725, 1925, 2275, 425, 390, 330, 290, 770, 910, 170, 156, 132, 116, 308, 364, 68, 4 ...

โปรดทราบว่ารายการสุดท้ายที่ระบุไว้เป็นหรือ4 2^2ดูหมายเลขเฉพาะแรกของเรา ( 2เลขชี้กำลัง) ที่สร้างด้วยอัลกอริทึมนี้! ในที่สุดลำดับจะมีลักษณะดังนี้:

2 ... 2^2 ... 2^3 ... 2^5 ... 2^7 ... etc.

ดังนั้นการยอมจำนวนเฉพาะ นี่คือOEIS A007542

ความท้าทาย

กำหนดหมายเลขอินพุตnไม่ว่าจะเป็นศูนย์หรือหนึ่งดัชนี (ตัวเลือกของคุณ) ออกnตัวเลขแรกของลำดับนี้หรือส่งออกnหมายเลข th ของลำดับนี้

ตัวอย่าง

ตัวอย่างด้านล่างแสดงผลลัพธ์nคำศัพท์ลำดับซีโร่ที่เป็นศูนย์

 n   output
 5   2275
19   4
40   408

กฎระเบียบ

  • หากเป็นไปได้คุณสามารถสันนิษฐานได้ว่าอินพุต / เอาท์พุตจะพอดีกับภาษาของคุณ Integer
  • อินพุตและเอาต์พุตจะได้รับโดยวิธีการที่สะดวกใด
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

11
บางทีอาจจะเป็นเกมที่สำคัญของคอนเวย์จะเป็นชื่อที่สื่อความหมายมากขึ้นสำหรับความท้าทายกว่านี้ขอเล่นเกม นั่นจะทำให้ง่ายต่อการค้นหาความท้าทายนี้ในอนาคต
ลินน์

เอาท์พุทสามารถลอย? 408.0แทน 408ตัวอย่างเช่น
dylnan

น่าเสียดายที่เราไม่ได้มีการท้าทาย "Interpret Fractran" (บัญญัติ) หนึ่งรายการบนStack Overflowถูกล็อค
user202729

@ dylnan แน่นอนว่าไม่เป็นไร
AdmBorkBork

คำตอบ:


5

Python 3 , 173 165 153 145 144 136 135 127 126 125 108 107 104 ไบต์

f=lambda n:2>>n*2or[f(n-1)*t//d for t,d in zip(b"NM_M\r7",b"[U3&!\r")if f(n-1)*t%d<1][0]

ลองออนไลน์!

  • -30 ไบต์ขอบคุณ Jonathan Frech!
  • -3 ไบต์ด้วย Lynn!

2>>n*2คือ2สำหรับn==0และ0อย่างอื่น

103 ไบต์ถ้าเราสามารถส่งคืนได้ลอยตัว


ใช้ Python 2; 153 ไบต์
Jonathan Frech

@ JonathanFrech เจ๋งดีนะ ขอบคุณ!
dylnan

1
อยู่ใน Python 3, 146 ไบต์ !
Jonathan Frech

144 ไบต์
Jonathan Frech

ขอบคุณอีกครั้งคุณทำมากกว่าที่ฉันทำตอนนี้!
dylnan

5

FRACTRAN , 99 ไบต์

17/2821 78/2635 19/1581 23/1178 29/1023 77/899 95/713 77/589 1/527 11/403 13/341 15/434 15/62 55/31

ลองออนไลน์!

โปรแกรมใช้2*31^nเป็นอินพุตซึ่งใช้เป็นสถานะเริ่มต้น

เศษส่วนทั้งหมดในโปรแกรม FRACTRAN ดั้งเดิมถูกหารด้วย 31 (การลงทะเบียนครั้งแรกที่ไม่ได้ใช้ครั้งแรก) ดังนั้นโปรแกรมจะหยุดที่การทำซ้ำครั้งที่ n


คำตอบที่หน้าด้าน ;-)
AdmBorkBork


3

Python 3 , 107 ไบต์

f=lambda n,k=2:n and f(n-1,[k*a//b for a,b in zip(b"NM_M\r7",b"[U3&!\r")if k*a%b<1][0])or k

ลองออนไลน์!

เข้ารหัสรายการเศษส่วนโดยการทดสอบzipสองครั้งที่มีอักขระ ASCII ต่ำที่ไม่สามารถพิมพ์ได้

ถ้าnเป็นศูนย์เรากลับโต้แย้งk; มิฉะนั้นเราจะเรียกคืนด้วยพารามิเตอร์ใหม่ ใหม่ของเราkคือค่าแรกk*a//bที่สอดคล้องกับส่วนบางส่วน (a, b)ในรายชื่อดังกล่าวว่าเป็นจำนวนเต็มคือk*a//bk*a%b<1



2

J , 116 110 ไบต์

g=.3 :0
((1047856500267924709512946135x%&(96#.inv])5405040820893044303890643137x)([:({.@I.@(=<.){[)*)])^:y 2
)

ลองออนไลน์!

0 การจัดทำดัชนี; ส่งคืนตัวเลขที่ n

บางไบต์สามารถบันทึกได้ด้วยการทำให้คำกริยาโดยปริยาย แต่ฉันมีปัญหาในการทำ ^:ทำงาน

คำอธิบาย:

Jอธิบายตัวเลขที่มีเหตุผลในรูปแบบ NrD โดยที่ N คือตัวเศษและ D คือตัวส่วนตัวอย่างเช่น17r91 78r85 19r51 23r38...ฉันสร้าง 2 รายการแยกกันสำหรับตัวเศษและส่วนและทำตัวเลขฐาน -96 จำนวน 2 รายการ

1047856500267924709512946135x%&(96#.inv])5405040820893044303890643137x แปลงตัวเลขฐาน -96 เป็นรายการและสร้างรายการเศษส่วนโดยการหารทั้งสองรายการ

   1047856500267924709512946135x%&(96#.inv])5405040820893044303890643137x
17r91 78r85 19r51 23r38 29r33 77r29 95r23 77r19 1r17 11r13 13r11 15r14 15r2 55

2 เริ่มต้นด้วย 2

^:yทำซ้ำคำกริยาในnเวลาที่เหลืออยู่(y คืออาร์กิวเมนต์ของฟังก์ชัน)

] อาร์กิวเมนต์ที่ถูกต้อง (เริ่มต้นที่ 2 จากนั้นใช้ผลลัพธ์ของการวนซ้ำแต่ละครั้ง)

* คูณรายการเศษส่วนด้วยอาร์กิวเมนต์ที่ถูกต้อง

(=<.) เป็นจำนวนเต็มผลลัพธ์ (เปรียบเทียบแต่ละหมายเลขกับพื้น)

{.@I.@ค้นหาดัชนีI.ของ{.จำนวนเต็มแรก

{[ ใช้ดัชนีเพื่อดึงหมายเลข


1
62 ไบต์:('0m26<l~l *,..V'%&(31x-~3&u:)'ztRE@<620,*-! ')&(0{*#~0=1|*)2:
ไมล์

@miles ขอบคุณฉันคิดว่าคุณต้องโพสต์โซลูชั่นของคุณมันเป็นวิธีที่ดีกว่าของฉัน
Galen Ivanov

2

05AB1E ,  44  43 ไบต์

0 การจัดทำดัชนี

2sF•Ë₁ǝßÌ?ƒ¥"h2ÔδD‡béαA5À>,•тв2ä`Š*s‰ʒθ_}нн

ลองออนไลน์!

คำอธิบาย

2                                             # initialize stack with 2
 sF                                           # input times do:
   •Ë₁ǝßÌ?ƒ¥"h2ÔδD‡béαA5À>,•                  # push a base-255 compressed large number
                            тв                # convert to a list of base-100 digits
                              2ä`             # split in 2 parts to stack
                                 Š            # move denominators to bottom of stack
                                  *           # multiply the last result by the numerators
                                   s‰         # divmod with denominators
                                     ʒθ_}     # filter, keep only those with mod result 0
                                         нн   # get the div result

จำนวนมากที่ผลักคือ 17781923297795770111131515559185513833292319171311140201



1

JavaScript (Node.js) , 106 95 ไบต์

  • ขอบคุณ @Arnauld และ @Neil สำหรับการลดขนาด 11 ไบต์
(n,N=2,I=13,B=Buffer(`[U3&!\rNM_M\r7`))=>n--?f(n,N/B.find(x=>N%x<!!++I)*B[I]):N

ลองออนไลน์!


จัดการเพื่อบีบออกสองสามไบต์ แต่ไม่สามารถช่วยคิดว่าฉันขาดอะไร: ลองออนไลน์!
Neil

1
@Neil ไม่จำเป็นต้องใช้ตัวดำเนินการสเปรBufferด นอกจากนี้ผมคิดว่ามันปลอดภัยที่จะนำข้อมูลทั้งหมดในบัฟเฟอร์เดียว: 95 ไบต์
Arnauld

@Arnauld OP ใช้ตัวดำเนินการสเปรด (ฉันไม่คุ้นเคยกับ Buffer ดังนั้นฉันจึงไม่รู้อะไรเลยดีกว่า) แต่นั่นเป็นการเคลื่อนไหวที่ยอดเยี่ยมด้วย Buffer ตัวเดียว!
นีล

@Arnauld ถูกต้องอัปเดต :)
DanielIndie

1

เรติน่า 213 ไบต์

K`17/91¶78/85¶19/51¶23/38¶29/33¶77/29¶95/23¶77/19¶1/17¶11/13¶13/11¶15/2¶1/7¶55/1¶17/91¶78/85¶19/51¶23/38¶29/33¶77/29¶95/23¶77/19¶1/17¶11/13¶13/11¶15/2¶1/7¶55/1¶2
\d+
*
"$+"+`((_+)/(_+)¶(.+¶)*)(\3)+$
$1$#5*$2
r`_\G

ลองออนไลน์! คำอธิบาย:

K`17/91¶78/85¶19/51¶23/38¶29/33¶77/29¶95/23¶77/19¶1/17¶11/13¶13/11¶15/2¶1/7¶55/1¶17/91¶78/85¶19/51¶23/38¶29/33¶77/29¶95/23¶77/19¶1/17¶11/13¶13/11¶15/2¶1/7¶55/1¶2

แทนที่อินพุตด้วยรายการเศษส่วนทั้งหมดรวมถึงจำนวนเต็มเริ่มต้น

\d+
*

แปลงทุกอย่างเป็นเอกภาพ

"$+"+`

ทำซ้ำการแทนที่จำนวนครั้งที่กำหนดโดยอินพุตต้นฉบับ

((_+)/(_+)¶(.+¶)*)(\3)+$

ค้นหาตัวหารที่แบ่งจำนวนเต็มอย่างสม่ำเสมอ

$1$#5*$2

แทนที่จำนวนเต็มด้วยผลลัพธ์ของการหารหารด้วยตัวเศษ

r`_\G

แปลงจำนวนเต็มเป็นทศนิยมและออกผลลัพธ์


1

ทูต , 81 ไบต์

Nest<~{Find[Integral,_*&`//=>Chop[Ords!"0zmt2R6E<@l<~6l2 0*,,*.-.!V "-31,2]]},2~>

ลองออนไลน์! ส่งออกเศษส่วนมากกว่า 1 ตัวอย่างเช่นอินพุต52275/1ผลตอบแทน สิ่งนี้สามารถแก้ไขได้ด้วยบวก 2 ไบต์โดยN@ต่อท้ายโปรแกรม

คำอธิบาย

นี่คือฟังก์ชั่น curried ซึ่ง curries ที่Nest มีอาร์กิวเมนต์สองตัวที่กำหนดไว้ล่วงหน้า:

{Find[Integral,_*&`//=>Chop[Ords!"0zmt2R6E<@l<~6l2 0*,,*.-.!V "-31,2]]}

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

ข้อมูลต่อไปนี้ใช้เพื่อเข้ารหัส PRIMEGAME:

&`//=>Chop[Ords!"0zmt2R6E<@l<~6l2 0*,,*.-.!V "-31,2]]

นี่คือการประเมินเช่น:

A> "0zmt2R6E<@l<~6l2 0*,,*.-.!V "
"0zmt2R6E<@l<~6l2 0*,,*.-.!V "
A> Ords!"0zmt2R6E<@l<~6l2 0*,,*.-.!V "
[48, 122, 109, 116, 50, 82, 54, 69, 60, 64, 108, 60, 126, 54, 108, 50, 32, 48, 42, 44, 44, 42, 46, 45, 46, 33, 86, 32]
A> Ords!"0zmt2R6E<@l<~6l2 0*,,*.-.!V "-31
[17, 91, 78, 85, 19, 51, 23, 38, 29, 33, 77, 29, 95, 23, 77, 19, 1, 17, 11, 13, 13, 11, 15, 14, 15, 2, 55, 1]
A> Chop[Ords!"0zmt2R6E<@l<~6l2 0*,,*.-.!V "-31,2]
 17 91
 78 85
 19 51
 23 38
 29 33
 77 29
 95 23
 77 19
  1 17
 11 13
 13 11
 15 14
 15  2
 55  1
A> &`//=>Chop[Ords!"0zmt2R6E<@l<~6l2 0*,,*.-.!V "-31,2]
[(17/91), (78/85), (19/51), (23/38), (29/33), (77/29), (95/23), (77/19), (1/17), (11/13), (13/11), (15/14), (15/2), (55/1)]

ลองแทนที่นิพจน์นี้ด้วยGในคำอธิบาย ฟังก์ชั่นแรกของเรากลายเป็น:

{Find[Integral,_*G]}

สิ่งนี้ดำเนินการวนซ้ำของรหัส FRACTRAN มากกว่า_อินพุตไปยังฟังก์ชัน มันFindเป็นIntegralสมาชิก (หนึ่งซึ่งเป็นจำนวนเต็ม) ของอาร์เรย์_*Gซึ่งเป็นข้อมูลที่_คูณด้วยสมาชิกแต่ละคนของGคูณที่มีสมาชิกของแต่ละคนNestเพียงแค่ใช้การแปลงนี้ตามจำนวนครั้งที่กำหนด

ทูตขนาด 42 ไบต์

ฉันติดตั้งส่วนต่าง ๆ ของ$langsห้องสมุดโดยได้รับแรงบันดาลใจจากความท้าทายนี้ดังนั้นฉันจึงทำเครื่องหมายส่วนที่ไม่ได้แข่งขัน

Needs[$langs]2&FRACTRAN_EXAMPLES.prime.run

นี่เป็นการค้นหารายการที่FRACTRAN_EXAMPLESฉันมี ตัวอย่างแต่ละตัวอย่างเป็นFractranExampleอินสแตนซ์ซึ่งเรียกใช้FRACTRANฟังก์ชันinbuilt primeตัวอย่างคือ PRIMEGAME คอนเวย์



0

PHP, 183 ไบต์ (189 ที่มีแท็ก "php")

Golfed:

$t=2;for(;@$i++<$argv[1];){foreach([17/91,78/85,19/51,23/38,29/33,77/29,95/23,77/19,1/17,11/13,13/11,15/14,15/2,55/1]as$n){$a=$t*$n;if(preg_match('/^\d+$/',$a)){$t=$a;break;}}}echo$t;

Ungolfed:

<?php 
$t=2;
for(;@$i++<$argv[1];){
    foreach([17/91,78/85,19/51,23/38,29/33,77/29,95/23,77/19,1/17,11/13,13/11,15/14,15/2,55/1] as $n){
        $a=$t*$n;
        if(preg_match('/^\d+$/',$a)){
            $t=$a;break;
        }
    }
}
echo $t;

ลองออนไลน์!

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