Imprima los primeros 128 números primos sin usar palabras reservadas

13

La solución obvia sería simplemente imprimirlos como una cadena, pero ¿es posible escribir un código más corto?

Requisitos:

  1. No se debe procesar ninguna entrada, y la salida debe ser en forma de 2 3 5 7 11 13 ...etc.
  2. No se utilizan palabras reservadas en el idioma
  3. El lenguaje debería permitir al menos una programación estructurada y tener palabras reservadas (de lo contrario, el punto 2 sería discutible).

primero tenía en mente exclusivamente C / C ++, pero extendí la pregunta mientras intentaba evitar las trampas

vsz
fuente
1
Lamentablemente para mí, Tcl no tiene palabras reservadas.
Johannes Kuhn

Respuestas:

14

C, 60 caracteres

La limitación "sin palabras clave" no importa aquí. Estoy bastante seguro de que mejorarlo, si es posible, no se hará agregando palabras clave.

n=2;main(m){n<720&&main(m<2?printf("%d ",n),n:n%m?m-1:n++);}

Versión alternativa:
el resultado no es tan bueno, pero me gusta el printfabuso.

n=2;main(m){n<720&&main(m<2?printf("%*d",n,n):n%m?m-1:n++);}

El truco en ambas soluciones es fusionar dos bucles (implementados por recursividad) en uno.
nes el próximo potencial primo, mel próximo divisor potencial.
En cada llamada recursiva, incrementamos n(mientras establecemos msu valor anterior) o disminuimos m.

Ugoren
fuente
7

Python, 108 caracteres

Python no fue hecho para este desafío. Quieres print? Eso es reservado Bueno, ¿qué tal si usamos stdout? Bueno, eso va a costar un import... lo has adivinado, reservado. Bueno ... estoy en Unix, así que puedo abrir el descriptor de archivo 1, que resulta ser stdout. ¡Cortar a tajos!

¿Hombre e iteración? Nada más eval. Sin bucles, por supuesto, pero ni siquiera podemos definir una función con defo lambda. Y para agregar insulto a la lesión, ¡ni siquiera podemos usar la comprensión de la lista! Siempre busco una excusa para usar cosas como map(p.__mod__,...)en el golf de código ... la comprensión siempre es mejor. Hasta ahora, eso es.

p=1
eval(compile("p+=1;open('/dev/fd/1','w').write('%s '%p*all(map(p.__mod__,range(2,p))));"*720,'','exec'))

Ahora, puede quejarse de que execes una palabra clave, a pesar de que no usé la palabra clave (ni siquiera evaluna exec). Bueno, aquí hay una solución de 117 caracteres que no usa 'exec'.

p=2
s="eval('('+s*(p<720)+')',open('/dev/fd/1','w').write('%s '%p*all(map(p.__mod__,range(2,p)))),{'p':p+1})";eval(s)
boothby
fuente
1
print no está reservado en Python3 :) puedes usar __import__, pero eso va a costar caracteres
gnibbler
6

JavaScript (80 caracteres)

eval((s=Array(719)).join("s[j=++n]?j:"+s.join("s[j+=n]=")+"r+=n+' ';"),r="",n=1)

Ejecutar en la consola de su navegador web.

Usó un tamiz de primera calidad, que resultó estar muy condensado.

Copiar
fuente
4

C, 183 caracteres

#define q j*j<k?i%p[j++]||(i++,j=0):printf("%d\n",p[j=0,k++]=i++)
#define A q;q;q;q;q;q;q;q
#define B A;A;A;A;A;A;A;A
#define C B;B;B;B;B;B;B
main(){int i=2,j=0,k=0,p[999];C;C;C;C;C;}

Bueno, aquí hay un primer intento rápido. Creo que esto debería satisfacer los requisitos. Estoy usando una división de prueba simple para encontrar los primos y un bucle desenrollado construido usando el preprocesador para iterarlo hasta que haya encontrado suficientes. Se ha ajustado el número de repeticiones para que se impriman exactamente 128 primos.

Ilmari Karonen
fuente
4

C, 87 caracteres

d;p(n){--d<2||n%d&&p(n);}r(n){p(d=n);d<2&&printf("%d\n",n);++n<720&&r(n);}main(){r(2);}

(Traté de escribirlo en un estilo más funcional, pero mi incapacidad para usar returneso mató ese plan).

caja de pan
fuente
3

C, 134 caracteres

Aquí hay una solución alternativa que intenta evitar el uso de palabras tanto como sea posible, reservado o de otra manera:

main(i){i<9?main(2953216):i>4097?--i&4094?i/4096%(i%4096)?main(i):
main((i/4096-1)*4097):printf("%d\n",i>>12,main((i/4096-1)*4097)):0;}

Todo lo que usa es printfy maincon un solo argumento.

caja de pan
fuente
3

Mathematica 50 caracteres

No estoy seguro de cómo interpretar las "palabras reservadas" para Mathematica, pero quiero jugar, así que lo interpretaré sin las funciones integradas para generar números primos o pruebas de primalidad.

Fold[#2Cases[#/#2,1|_Rational]&,#,#]&@Range[2,719]
Señor mago
fuente
2

Haskell, 72 caracteres

main=putStrLn.unwords$take 128[show p|p<-[2..],all((>0).mod p)[2..p-1]]

Es cierto que evitar palabras clave no es demasiado difícil en Haskell.

hammar
fuente