Permainan Utama Conway

18

Secara khusus, PRIMEGAME Conway .

Ini adalah algoritma yang dirancang oleh John H. Conway untuk menghasilkan bilangan prima menggunakan urutan 14 angka rasional:

 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

Sebagai contoh, F adalah fraksi 77/29.

Jadi, inilah cara algoritma menemukan bilangan prima. Dimulai dengan angka 2, cari entri pertama dalam urutan yang ketika dikalikan bersama menghasilkan integer. Berikut ini M, 15/2yang menghasilkan 15. Kemudian, untuk bilangan bulat itu 15, temukan entri pertama dalam urutan yang ketika dikalikan menghasilkan bilangan bulat. Itu yang terakhir N,, atau 55/1, yang menghasilkan 825. Tulis urutan yang sesuai. (Yang cerdik di antara kamu mungkin mengenali ini sebagai program FRACTRAN .)

Setelah beberapa iterasi, Anda akan mendapatkan yang berikut ini:

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

Perhatikan bahwa item terakhir yang tercantum adalah 4, atau 2^2. Lihatlah bilangan prima pertama kami ( 2eksponen) yang dihasilkan dengan algoritma ini! Akhirnya, urutannya akan terlihat seperti berikut:

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

Jadi, menghasilkan bilangan prima. Ini adalah OEIS A007542 .

Tantangan

Diberikan nomor input n, baik nol atau satu diindeks (pilihan Anda), baik output nnomor pertama dari urutan ini, atau output nnomor ke-5 dari urutan ini.

Contohnya

Contoh di bawah ini mengeluarkan nistilah th dari urutan nol-diindeks.

 n   output
 5   2275
19   4
40   408

Aturan

  • Jika berlaku, Anda dapat mengasumsikan bahwa input / output akan sesuai dengan tipe Integer asli bahasa Anda.
  • Input dan output dapat diberikan dengan metode apa pun yang mudah .
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
AdmBorkBork
sumber
11
Mungkin permainan utama Conway akan menjadi nama yang lebih deskriptif untuk tantangan ini daripada Let's Play a Game . Itu akan membuatnya lebih mudah untuk menemukan tantangan ini kembali di masa depan.
Lynn
Bisakah output menjadi pelampung? 408.0bukannya 408misalnya.
dylnan
Sayangnya kami tidak memiliki tantangan (Interpretasi Fraktran) (kanonik). Yang ada di Stack Overflow terkunci.
user202729
@ Dylnan Tentu, tidak apa-apa.
AdmBorkBork

Jawaban:

5

Python 3 , 173 165 153 145 144 136 135 127 126 125 108 107 104 byte

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]

Cobalah online!

  • -30 byte terima kasih kepada Jonathan Frech!
  • -3 byte terima kasih kepada Lynn!

2>>n*2adalah 2untuk n==0dan 0sebaliknya.

103 byte jika kita dapat mengembalikan float.

dylnan
sumber
Menggunakan Python 2; 153 byte .
Jonathan Frech
@ JonathanFrech Keren, trik yang bagus. Terima kasih!
dylnan
1
Tinggal di Python 3, 146 byte !
Jonathan Frech
144 byte .
Jonathan Frech
Terima kasih sekali lagi, Anda melakukan lebih dari yang saya lakukan sekarang!
dylnan
5

FRACTRAN , 99 byte

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

Cobalah online!

Program mengambil 2*31^nsebagai input, yang digunakan sebagai keadaan awal.

Semua fraksi dalam program FRACTRAN asli telah dibagi dengan 31 (register prima pertama yang tidak digunakan), sehingga program berhenti pada iterasi ke-9.

Vincent
sumber
Jawaban nakal. ;-)
AdmBorkBork
4

Jelly , 49 43 byte

ד×NŒçøM_M¢¿ÆÐÐ7‘“[U3&!øçŒ×Æ¿Ç£¢‘:@xḍɗḢ
2Ç¡

Cobalah online!

  • -6 byte berkat mil
dylnan
sumber
Sayang sekali bahwa 0ọ0¤adalah inf, jika Anda bisa mengurangi ini untuk 42 byte ...
Erik yang Outgolfer
3

Python 3 , 107 byte

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

Cobalah online!

Mengkodekan daftar fraksi dengan zipmemasukkan dua bytestrings yang mengandung karakter ASCII rendah yang tidak patut.

Jika nnol, kami mengembalikan argumen k; kalau tidak, kita kambuh dengan parameter baru. Nilai baru kami kadalah nilai pertama yang k*a//bterkait dengan beberapa fraksi (a, b)dalam daftar sedemikian rupa sehingga k*a//bmerupakan bilangan bulat, yaitu k*a%b<1.

Lynn
sumber
2

MATL , 50 byte

Hi:"'0m26<l~l *,..V'31-*'{uSFA=731-+."!'32-&\w~)1)

Cobalah online!

Luis Mendo
sumber
3
Tebak bagian mana dari kode tersebut yang merupakan string literal dan mana yang merupakan pernyataan aktual ...
Luis Mendo
2
Hi:... aww, "Halo" kepada Anda juga, kode. :-)
AdmBorkBork
2

J , 116 110 byte

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

Cobalah online!

0 diindeks; mengembalikan nomor ke-n

Beberapa byte dapat disimpan dengan membuat kata kerja diam-diam, tapi saya punya masalah dalam membuat ^:pekerjaan.

Penjelasan:

J menjelaskan bilangan rasional dalam bentuk NrD, di mana N adalah pembilang dan D adalah penyebut, misalnya 17r91 78r85 19r51 23r38...saya membuat 2 daftar terpisah untuk pembilang dan penyebut dan membuat 2 basa-96 angka dari mereka.

1047856500267924709512946135x%&(96#.inv])5405040820893044303890643137x mengonversi angka-angka dasar-96 menjadi daftar dan menyusun daftar pecahan dengan membuka dua daftar.

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

2 mulai dengan 2

^:yulangi kata kerja di nwaktu kirinya (y adalah argumen untuk fungsi)

] argumen yang benar (mulai dari 2, dan kemudian menggunakan hasil dari setiap iterasi)

* gandakan daftar fraksi dengan argumen yang benar

(=<.) adalah bilangan bulat hasil (bandingkan setiap angka dengan lantainya)

{.@I.@menemukan indeks I.yang pertama {.dari bilangan bulat

{[ menggunakan indeks untuk mengambil nomor tersebut

Galen Ivanov
sumber
1
62 byte:('0m26<l~l *,..V'%&(31x-~3&u:)'ztRE@<620,*-! ')&(0{*#~0=1|*)2:
mil
@miles Terima kasih, saya pikir Anda harus memposting solusi Anda, itu jauh lebih baik daripada saya.
Galen Ivanov
2

05AB1E ,  44  43 byte

Diindeks 0

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

Cobalah online!

Penjelasan

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

Jumlah besar yang didorong adalah 17781923297795770111131515559185513833292319171311140201

Emigna
sumber
1

Pari / GP , 121 byte

n->a=2;for(i=1,n,a=[x|x<-a*[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],x\1==x][1]);a

Cobalah online!

alephalpha
sumber
1

JavaScript (Node.js) , 106 95 byte

  • terima kasih kepada @Arnauld dan @Neil untuk mengurangi 11 byte
(n,N=2,I=13,B=Buffer(`[U3&!\rNM_M\r7`))=>n--?f(n,N/B.find(x=>N%x<!!++I)*B[I]):N

Cobalah online!

DanielIndie
sumber
Berhasil memeras beberapa byte tetapi tidak dapat berpikir bahwa saya kehilangan sesuatu: Cobalah secara online!
Neil
1
@Neil Tidak perlu menggunakan operator spread Buffer. Juga, saya pikir aman untuk meletakkan semua data dalam satu buffer: 95 byte .
Arnauld
@Arnauld OP menggunakan operator spread (Saya tidak terbiasa dengan Buffer jadi saya tidak tahu yang lebih baik) tapi itu langkah yang bagus dengan Buffer tunggal!
Neil
@Arnauld benar, diperbarui :)
DanielIndie
1

Retina , 213 byte

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

Cobalah online! Penjelasan:

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

Ganti input dengan daftar semua fraksi, ditambah bilangan bulat awal.

\d+
*

Konversikan semuanya menjadi unary.

"$+"+`

Ulangi substitusi beberapa kali yang diberikan oleh input asli.

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

Temukan penyebut yang membagi bilangan bulat secara merata.

$1$#5*$2

Ganti bilangan bulat dengan hasil pembagian dikalikan dengan pembilang.

r`_\G

Ubah bilangan bulat menjadi desimal dan hasilkan hasilnya.

Neil
sumber
1

Attache , 81 byte

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

Cobalah online! Menghasilkan sebagian kecil dari 1. Misalnya, input 5kembali 2275/1. Ini dapat diperbaiki dengan ditambah 2 byte dengan menambahkan N@ke program.

Penjelasan

Ini adalah fungsi kari, yang kari Nest dengan dua argumen yang telah ditentukan:

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

dan 2. Argumen terakhir ini hanyalah benih awal, dan argumen yang diteruskan ke fungsi ini adalah jumlah iterasi untuk membuat sarang fungsi yang diberikan.

Berikut ini digunakan untuk menyandikan PRIMEGAME:

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

Ini dievaluasi sebagai berikut:

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)]

Mari kita ganti ungkapan ini dengan Gpenjelasannya. Fungsi pertama kami menjadi:

{Find[Integral,_*G]}

Ini melakukan iterasi tunggal dari kode FRACTRAN _, input ke fungsi. Ini Findadalah Integralanggota (yang merupakan integer) dari array _*G, yang merupakan input yang _dikalikan dengan masing-masing anggota G. Nestcukup menerapkan transformasi ini beberapa kali.

Attache, 42 byte

Saya menerapkan bagian $langsperpustakaan, terinspirasi oleh tantangan ini, jadi saya tandai bagian ini tidak bersaing.

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

Ini hanya menanyakan daftar yang FRACTRAN_EXAMPLESsaya miliki. Setiap contoh adalah sebuah FractranExampleinstance, yang memanggil FRACTRANfungsi inbuilt . The primecontoh adalah PRIMEGAME Conway.

Conor O'Brien
sumber
1

F # (Mono) , 215 byte

let q m=
 let rec i x y=
  if y=m then x 
  else[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]|>List.chunkBySize 2|>List.find(fun[n;d]->x*n%d=0)|>fun[n;d]->i(x*n/d)(y+1)   
 i 2 0

Cobalah online!

Henrik Hansen
sumber
0

PHP, 183 byte (189 dengan tag "php")

Golf:

$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;

Tidak Disatukan:

<?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;

Cobalah online!

Boian Ivanov
sumber