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


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.


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.


Verificado: 1e6{mp},97f%' f+"2NZ"# enlace (toma un tiempo: p)
— Aditsu se retiró porque SE es MAL
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.