Conway'in Prime Oyunu


18

Özellikle, Conway'in PRIMEGAME .

Bu, John H. Conway tarafından 14 rasyonel sayı dizisi kullanarak primler üretmek için geliştirilen bir algoritmadır:

 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

Örneğin, F kesirdir 77/29.

Algoritma asal sayıları nasıl bulur. Sayı ile başlayarak 2, sıra ile çarpıldığında bir tamsayı üreten ilk girdiyi bulun. İşte bu kadar M, 15/2üretir, hangi 15. Daha sonra, bu tamsayı için 15, çarpıldığında bir tamsayı üreten dizideki ilk girişi bulun. Bu sonuncusu N, ya da 55/1veren 825. İlgili diziyi yazın. ( Aranızdaki zeki, bunu bir FRACTRAN programı olarak tanıyabilir .)

Bazı tekrarlardan sonra, aşağıdakileri elde edersiniz:

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

Listelenen son öğenin 4veya olduğunu unutmayın 2^2. 2Bu algoritma ile oluşturulan ilk asal sayımıza ( üs) bakın! Sonunda, dizi aşağıdaki gibi görünecektir:

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

Böylece asal sayıları verir. Bu OEIS A007542 .

Meydan okuma

nSıfır veya bir indeksli (seçiminiz) bir giriş numarası verildiğinde n, bu dizinin ilk sayılarını veya bu dizinin nth sayısını verir.

Örnekler

Aşağıdaki örnekler n, sıfır indeksli sekansın teriminin çıktısını vermektedir .

 n   output
 5   2275
19   4
40   408

kurallar

  • Varsa, giriş / çıktının dilinizin yerel Tamsayı türüne uygun olacağını varsayabilirsiniz.
  • Giriş ve çıkış herhangi bir uygun yöntemle verilebilir .
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine döndürebilirsiniz.
  • Standart boşluklar yasaktır.
  • Bu bu nedenle her zamanki golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

11
Belki de Conway'in ana oyunu , bu meydan okuma için Let's Play a Game'den daha açıklayıcı bir isim olurdu . Bu, gelecekte bu zorluğu tekrar bulmayı kolaylaştıracaktır.
Lynn

Çıktı şamandıra olabilir mi? örneğin 408.0yerine 408.
dylnan

Maalesef (kanonik) bir “Fractran'ı yorumla” zorluğumuz yok. Üzerinde bir yığın taşması kilitlenir.
user202729

@dylnan Elbette, sorun değil.
AdmBorkBork

Yanıtlar:


5

Python 3 , 17316515514514414314313512612512510610410 bayt

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]

Çevrimiçi deneyin!

  • Jonathan Frech sayesinde -30 bayt!
  • Lynn sayesinde -3 bayt!

2>>n*2olduğu 2için n==0ve 0aksi.

103 bayt dönebiliyorsak yüzer.


Python 2'yi kullanma; 153 bayt .
Jonathan Frech

@JonathanFrech Güzel, güzel numara. Teşekkürler!
dylnan



Tekrar teşekkürler, şimdi benden daha fazlasını yaptın!
dylnan

5

FRACTRAN , 99 bayt

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

Çevrimiçi deneyin!

Program 2*31^n, başlangıç ​​durumu olarak kullanılan bir girdi olarak alır .

Orijinal FRACTRAN programındaki tüm kesirler 31'e (kullanılmayan ilk ana kayıt) bölünmüştür, bu nedenle program ninci yinelemede durur.


Arsız cevap. ;-)
AdmBorkBork


3

Python 3 , 107 bayt

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

Çevrimiçi deneyin!

zipYazdırılamayan düşük ASCII karakterleri içeren iki bayt dizesi oluşturarak kesirlerin listesini kodlar .

Eğer nsıfır ise, argümanı döndürürüz k; aksi taktirde yeni parametrelerle çektik. Yenik , bir tamsayı yani listede k*a//bbazı kesirlere karşılık gelen ilk değerdir .(a, b)k*a//bk*a%b<1



2

J , 116110 bayt

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

Çevrimiçi deneyin!

0 endeksli; n'inci sayıyı döndürür

Bazı baytlar, fiil zımni yapılarak kaydedilebilir, ancak yapmakta sorun yaşıyorum ^: iş .

Açıklama:

J , NrD formundaki rasyonel sayıları açıklar; burada N, paydır ve D paydadır, örneğin, paylar ve paydalar için 17r91 78r85 19r51 23r38...2 ayrı liste oluşturdum ve onlardan 2 baz-96 sayı yaptım.

1047856500267924709512946135x%&(96#.inv])5405040820893044303890643137x baz-96 sayılarını listelere dönüştürür ve iki listeyi bölerek kesirlerin bir listesini oluşturur.

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

2 2 ile başla

^:yfiili sol nzamanlarında tekrarlayın (y fonksiyonun argümanıdır)

] doğru argüman (2'de başlar ve sonra her yinelemenin sonucunu kullanır)

* kesirler listesini doğru argümanla çarpın

(=<.) sonuçlar tamsayıdır (her bir sayıyı zemiyle karşılaştırın)

{.@I.@tamsayıların I.ilkinin dizinini bulur{.

{[ numarayı almak için dizini kullanır


1
62 bayt:('0m26<l~l *,..V'%&(31x-~3&u:)'ztRE@<620,*-! ')&(0{*#~0=1|*)2:
mil

@miles Teşekkürler, sanırım çözümünüzü paylaşmalısınız, bu benimkinden çok daha iyi.
Galen Ivanov

2

05AB1E ,  44  43 bayt

0 endeksli

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

Çevrimiçi deneyin!

açıklama

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

İtilen çok sayı 17781923297795770111131515559185513833292319171311140201



1

JavaScript (Node.js) , 106 95 bayt

  • @Arnauld ve @Neil'e 11 bayt azalttığı için teşekkürler
(n,N=2,I=13,B=Buffer(`[U3&!\rNM_M\r7`))=>n--?f(n,N/B.find(x=>N%x<!!++I)*B[I]):N

Çevrimiçi deneyin!


Birkaç bayt sıkıştırmayı başardı
Neil

1
@Neil Forma operatörünü kullanmaya gerek yoktur Buffer. Ayrıca, tüm verileri tek bir arabellek içine koymak güvenli olduğunu düşünüyorum: 95 bayt .
Arnauld

@Arnauld OP forma operatörünü kullandı (Buffer'ı bilmiyorum, bu yüzden daha iyisini bilmiyordum) ama bu tek Tampon ile harika bir hamle!
Neil

@Arnauld correct, updated :)
DanielIndie

1

Retina , 213 bayt

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

Çevrimiçi deneyin! Açıklama:

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

Girişi, tüm kesirlerin yanı sıra ilk tamsayı listesiyle değiştirin.

\d+
*

Her şeyi tekil hale getirin.

"$+"+`

Değiştirmeyi orijinal giriş tarafından verilen sayıda tekrarlayın.

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

Tamsayıyı eşit olarak bölen bir payda bulun.

$1$#5*$2

Tamsayıyı, bölme sonucuyla payın çarpımıyla değiştirin.

r`_\G

Tamsayıyı ondalık sayıya dönüştürün ve sonucu alın.


1

Ataşe , 81 bayt

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

Çevrimiçi deneyin! 1'den büyük bir kesir5 çıkarır 2275/1. Örneğin, girdi geri döner . Bu, artı 2 bayt ile düzeltilebilirN@ , programa .

açıklama

Bu, Nest önceden tanımlanmış iki argümanla körili kör bir işlevdir :

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

ve 2 . Bu son argüman basitçe başlangıç ​​tohumudur ve bu fonksiyona iletilen argüman, verilen fonksiyonun iç içe geçtiği yineleme sayısıdır.

PRIMEGAME kodlamak için aşağıdakiler kullanılır:

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

Bu şöyle değerlendirilir:

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

GAçıklamayı bu ifadeyle değiştirelim . İlk fonksiyonumuz:

{Find[Integral,_*G]}

Bu _, işleve giriş üzerinden FRACTRAN kodunun tek bir yinelemesini gerçekleştirir . Bu dizinin Findbir Integralüyesidir (biri tamsayıdır) _*G, girdi _her üyesiyle çarpılır G.Nestbu dönüşümü verilen sayıda uygular.

Ataşe, 42 bayt

$langsBu meydan okumadan esinlenerek kütüphanenin bazı kısımlarını uyguladım , bu yüzden bu bölümü rakipsiz olarak işaretliyorum.

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

Bu sadece sahip FRACTRAN_EXAMPLESolduğum listeyi sorgular . Her örnek, FractranExampledahili FRACTRANişlevi çağıran bir örnektir . primeÖrnek Conway PRIMEGAME olduğunu.


1

F # (Mono) , 215 bayt

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

Çevrimiçi deneyin!


0

PHP, 183 bayt ("php" etiketi ile 189)

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;

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;

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.