Encontrar programas en los primos

9

Asignemos los números del 0 al 94 a los 95 caracteres ASCII imprimibles :

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

El espacio es 0, !es 1, y así hasta que ~sea ​​94. También asignaremos 95 a tab ( \t) y 96 a nueva línea ( \n).

Ahora considere la cadena infinita cuyo enésimo carácter es el carácter anterior al que se ha asignado el enésimo número primo , módulo 97. Llamaremos a esta cadena S.

Por ejemplo, el primer número primo es 2, y 2 mod 97 es 2, y 2 está asignado a ", por lo que el primer carácter de S es ". Del mismo modo, el número 30 primo es 113, y 113 mod 97 es 16, y se asigna 16 0, por lo que el carácter 30 de S es 0.

Los primeros 1000 caracteres de S son los siguientes:

"#%'+-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^

Stack Exchange convierte las pestañas en espacios, así que aquí hay un PasteBin con las pestañas intactas.

Desafío

Encuentre una subcadena de S que sea un programa válido en su idioma de elección que genere los primeros números primos M, uno por línea, en orden , para algún número entero positivo M.

Por ejemplo, 2es una subcadena de S (ocurre en varios lugares pero cualquiera servirá), y 2es un programa CJam válido cuya salida es

2

que son los primeros M = 1 números primos, uno por línea, en orden.

Del mismo modo, la cadena 2N3N5puede ser una subcadena de S en algún lugar, y 2N3N5es un programa CJam válido que genera

2
3
5

que es el primer M = 3 números primos, uno por línea, en orden.

Puntuación

La presentación con la M más alta gana. El desempate va a la presentación publicada primero.

Detalles

  • No debería haber salida adicional además de los números primos individuales en cada línea, excepto una nueva línea final opcional después de la última línea. No hay entrada

  • La subcadena puede tener cualquier longitud siempre que sea finita.

  • La subcadena puede aparecer en cualquier lugar dentro de S. (y S puede contenerla en varios lugares).

  • El programa debe ser un programa completo. No puede suponer que se ejecuta en un entorno REPL.

  • El programa debe ejecutarse y finalizar en un tiempo finito sin errores.

  • "Nueva línea" puede interpretarse como cualquier representación común de nueva línea necesaria para su sistema / intérprete / etc. Solo trátalo como un personaje.

Debe dar el índice de S donde comienza su subcadena, así como la longitud de la subcadena, si no la subcadena misma. No solo puede mostrar que la subcadena debe existir.

Relacionado: Buscando programas en un gran tablero de Boggle

Pasatiempos de Calvin
fuente
1
¿Puedes dar el código para producir esa gran cadena hasta cualquier número de caracteres? (Supongo que ya tienes uno)
Optimizer
Si hay 95 caracteres ASCII imprimibles, ¿por qué estás haciendo el módulo 97? Ah, no importa, también usas tabulador y nueva línea.
Aditsu renunció porque SE es MAL
Teniendo en cuenta que 0 mod 97 solo puede ocurrir una vez, la falta de espacio realmente duele ...
Sp3000
@ Sp3000 Shoot, eso no se me ocurrió. : /
Aficiones de Calvin

Respuestas:

18

Lenguage , M = ∞

Todos los programas comienzan al principio de la cadena. El siguiente programa de Python mal escrito calcula cuántos caracteres se necesitan para una 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)

Por ejemplo, para M = 5, el programa es el primero 2458595061728800486379873255763299470031450306332287344758771914371767127738856987726323081746207100511846413417615836995266879023298634729597739072625027450872641123623948113460334798483696686473335593598924642330139401455349473945729379748942060643508071340354553446024108199659348217846094898762753583206697609445347611002385321978831186831089882700897165873209445730704069057276108988230177356 caracteres.

Feersum
fuente
En caso de duda, hay una variante BF que lo hará por usted.
ymbirtt
3
Es curioso cómo Lenguage se inspiró en otro desafío mío. Es como si estuviera provocando mi propia caída.
Aficiones de Calvin
3

CJam, M = 2

Corto y dulce:

2NZ

Esta secuencia comienza en la posición 54398, usando la indexación 1 de la cadena. Puedes probarlo en línea aquí .

Intenté buscar algunas variaciones posibles, pero esta fue la primera solución que encontré.

Actualmente estoy tratando de encontrar una versión M = 3, pero no espero encontrarla dentro de un período de tiempo razonable. Si la secuencia es uniformemente aleatoria (una aproximación), entonces el índice inicial para una secuencia de longitud 5 podría ser del orden de 10 ^ 9.

PhiNotPi
fuente
Verificado: 1e6{mp},97f%' f+"2NZ"# enlace (toma un tiempo: p)
Aditsu se retiró porque SE es MAL