Znajdowanie programów w liczbach pierwszych

9

Przypiszmy cyfry od 0 do 94 do 95 drukowanych znaków ASCII :

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Spacja to 0, !1 i tak dalej, aż do ~94. Przydzielimy także 95 do tab ( \t) i 96 do newline ( \n).

Rozważmy teraz nieskończony ciąg, którego N-ty znak jest znakiem powyżej, do którego przypisano N-tą liczbę pierwszą , modulo 97. Nazwiemy ten ciąg S.

Na przykład, pierwsza liczba pierwsza to 2, a 2 mod 97 to 2, a 2 jest przypisane ", więc pierwszym znakiem S jest ". Podobnie, 30. liczba pierwsza to 113, a 113 mod 97 to 16, a 16 jest przypisane 0, więc 30 znak S to 0.

Pierwsze 1000 znaków S to:

"#%'+-137=?EIKOU[]cgiosy $&*,0>BHJTV\bflrt~
#%1=ACGMOY_ekmswy"046:HNXZ^dlrx|!)-5?AKMSW]eiko{"&.28DFX^hntv|%+139?CEQ[]agmo{  $,6>HPV\`hnrz~+5ACMOSU_mqsw$(*.BFNX`djp~!'-5;GKQS]_eoq{}"48:>DJRX^tv
'17=EQU[aciu    026<>DHJNZ\b#)/7ISaegkqy}   $0:<@BFLXdlx~!'/3;?MQWY]ceku(.24LPR\hjt|!'-?EIKWamu$28<>BDNZ`fxz)+AGOUY[_gmwy"0:@LNRT^jl|~#')3;Meiow&(,4DFJRX^bnp%+-37=KQUW]agsy    ,06BJPTn
)15;=CYegw  ".<FHLTZ`dfjpx|~#-/9AES]ikquw&48>FLPbjtz
'1=KOU[]y{$,0>BJV\hlr%/1A[_amsw"(04<RTXZf!#)/59?AMQ]_ik{},2FV^bdhj
'39CEIOQWacoy{$28<BJPVfrtx%+/7AIOUkqs}*.4FHR`dfp~!);?EGKQS_cw,8:>DJLRhjp
%139EUW[aosu&>HNPZ\fhrxz#%/5=[egqy  (:@LXZlrv|!35?MSWY]uw"(8@FL^nptz|!'17COacim &>BDHNP\`n+5;GU[eqsw}$*46:HNTX^`jl|'/AEKWY_ek&,:>FPXdvz|
7CIK[agu    ,0NTZ`hnrt
%)+1GMOSegkwy   "<BHLT^~-/59;?AKY_cku{.24:X\dntz!'37=?EIOQ[]ms&*6D`fz~/7=AGU[akmw"*46@HT^vx|#)-5GQW]_eo{}&,28@FPVX^djt|39OQcgoy6>PTV`fhnr#+7IY_ams} (*0:HLdfvx!#-AEGKScioq},48>\^hjptz
'-1=CKW[iu  6<HNPfn
)/=ACIS[aek(6@BNXZjl~5GM]ouw(,24>FPV\dhnpz|'+179EIWims&*28<DHV\`nz~
=AY_eq}*046:LR^

Wymiana stosu zamienia tabulatory w spacje, więc oto PasteBin z niezmienionymi tabulatorami.

Wyzwanie

Znajdź podłańcuch S, który jest poprawnym programem w wybranym języku, który generuje pierwsze M liczb pierwszych, po jednym w wierszu, w kolejności , dla pewnej dodatniej liczby całkowitej M.

Na przykład 2jest podciągiem S (występuje w wielu miejscach, ale każde to zrobi) i 2jest poprawnym programem CJam , którego wyjściem jest

2

czyli pierwsze M = 1 liczby pierwsze, po jednej w wierszu, w kolejności.

Podobnie, ciąg 2N3N5może być gdzieś podciągiem S i 2N3N5jest poprawnym programem CJam, który wyprowadza

2
3
5

czyli pierwsze M = 3 liczby pierwsze, po jednej w wierszu, w kolejności.

Punktacja

Zgłoszenie z najwyższym M wygrywa. Łamacz remisów trafia do przesłanego postu jako pierwszy.

Detale

  • Nie powinno być żadnych dodatkowych danych wyjściowych oprócz pojedynczych liczb pierwszych w każdej linii, z wyjątkiem opcjonalnej nowej linii po ostatniej linii. Brak danych wejściowych.

  • Podciąg może mieć dowolną długość, o ile jest skończony.

  • Podciąg może występować w dowolnym miejscu w obrębie S. (A S może zawierać go w wielu miejscach).

  • Program musi być pełnoprawnym programem. Nie możesz zakładać, że działa on w środowisku REPL.

  • Program musi działać i kończyć się w ograniczonym czasie bez błędów.

  • „Nowa linia ” może być interpretowana jako każda wspólna reprezentacja nowej linii niezbędna dla twojego systemu / tłumacza / etc. Po prostu traktuj to jako jedną postać.

Musisz podać indeks S, od którego zaczyna się podłańcuch, a także długość podłańcucha, jeśli nie sam podłańcuch. Możesz nie tylko pokazać, że podciąg musi istnieć.

Powiązane: Szukanie programów w ogromnej tablicy Boggle

Hobby Calvina
źródło
1
Czy możesz podać kod, aby wygenerować ten duży ciąg do dowolnej liczby znaków? (Podejrzewam, że już go masz)
Optymalizator
Jeśli jest 95 znaków ASCII do wydrukowania, to dlaczego robisz modulo 97? Ach, nieważne, używasz również tabulacji i nowej linii.
Aditsu zakończyło się, ponieważ SE to EVIL
Biorąc pod uwagę, że 0 mod 97 może wystąpić tylko raz, brak miejsca naprawdę boli ...
Sp3000
@ Sp3000 Strzelaj, to nie przyszło mi do głowy. : /
Hobby Calvina

Odpowiedzi:

18

Lenguage , M = ∞

Wszystkie programy zaczynają się na początku łańcucha. Poniższy źle napisany program Python oblicza, ile znaków potrzeba dla danego M.

def program_length(n):
    PLUS, MINUS, DOT = '000', '001', '100'
    i = 1
    s = ''
    while n > 0:
        i += 1
        if all(i%f for f in range(2,i)): 
            s += str(i) + '\n'
            n -= 1
    out = '110111'
    ch = 0
    for c in s:
        dif = ord(c) - ch
        if dif > 0: out += PLUS * dif
        else: out += MINUS * -dif
        out += DOT
        ch = ord(c)
    return int(out, 2)

Na przykład, dla M = 5, program jest pierwsze 2458595061728800486379873255763299470031450306332287344758771914371767127738856987726323081746207100511846413417615836995266879023298634729597739072625027450872641123623948113460334798483696686473335593598924642330139401455349473945729379748942060643508071340354553446024108199659348217846094898762753583206697609445347611002385321978831186831089882700897165873209445730704069057276108988230177356 znaków.

feersum
źródło
W razie wątpliwości istnieje wariant BF, który zrobi to za Ciebie.
ymbirtt
3
To zabawne, jak Lenguage zainspirowało moje kolejne wyzwanie. To tak, jakbym doprowadził do własnego upadku.
Calvin's Hobbies
3

CJam, M = 2

Krótkie i słodkie:

2NZ

Ta sekwencja zaczyna się od pozycji 54398, przy użyciu 1-indeksowania łańcucha. Możesz to przetestować online tutaj .

Próbowałem wyszukać kilka możliwych odmian, ale to było pierwsze rozwiązanie, jakie znalazłem.

Obecnie próbuję znaleźć wersję M = 3, ale nie spodziewam się jej znaleźć w rozsądnym czasie. Jeśli sekwencja jest jednolicie losowa (przybliżenie), wówczas indeks początkowy dla sekwencji o długości 5 może być rzędu 10 ^ 9.

PhiNotPi
źródło
Zweryfikowano: 1e6{mp},97f%' f+"2NZ"# link (trwa chwilę: p)
aditsu zakończyło się, ponieważ SE to EVIL