Stampa i primi 128 numeri primi senza usare parole riservate


13

La soluzione ovvia sarebbe semplicemente stamparli come una stringa, ma è possibile scrivere un codice più corto?

Requisiti:

  1. Nessun input deve essere elaborato e l'output dovrebbe essere sotto forma di 2 3 5 7 11 13 ...ecc.
  2. Non vengono utilizzate parole riservate nella lingua
  3. Il linguaggio dovrebbe almeno consentire una programmazione strutturata e avere parole riservate (altrimenti il ​​punto 2 sarebbe controverso).

inizialmente avevo in mente esclusivamente C / C ++, ma ho esteso la domanda mentre cercavo ancora di evitare i trucchi


1
Sfortunatamente per me, Tcl non ha parole riservate.
Johannes Kuhn,

Risposte:


14

C, 60 caratteri

La limitazione "nessuna parola chiave" non ha importanza qui. Sono abbastanza sicuro che il miglioramento, se possibile, non sarà fatto aggiungendo parole chiave.

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

Versione alternativa:
l'output non è così bello, ma mi piace l' printfabuso.

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

Il trucco in entrambe le soluzioni è quello di unire due loop (implementati per ricorsione) in uno.
nè il prossimo potenziale primo, mil prossimo potenziale divisore.
In ogni chiamata ricorsiva, incrementiamo n(mentre impostiamo mil valore precedente) o diminuiamo m.


7

Python, 108 caratteri

Python non è stato creato per questa sfida. Vuoi print? Questo è riservato. Bene, che ne dici di usare stdout? Beh, costerà un import... hai indovinato, riservato. Bene ... Sono su Unix, quindi posso aprire il descrittore di file 1, che sembra essere stdout. Hack!

Uomo e iterazione? Nient'altro che eval. Nessun loop, ovviamente, ma non possiamo nemmeno definire una funzione con defo lambda. E per aggiungere la beffa al danno, non possiamo nemmeno usare la comprensione della lista! Cerco sempre una scusa per usare cose come map(p.__mod__,...)nel code golf ... la comprensione è sempre migliore. Fino ad ora, cioè.

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

Ora, potresti lamentarti che execè una parola chiave, anche se non ho usato la parola chiave (nemmeno evaluna exec). Bene, ecco una soluzione di 117 caratteri che non 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)

1
la stampa non è riservata in Python3 :) puoi usarla __import__, ma costerà i personaggi
gnibbler il

6

JavaScript (80 caratteri)

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

Corri nella console del tuo browser web.

Utilizzato un setaccio primario, che si è rivelato molto condensato.


4

C, 183 caratteri

#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;}

Bene, ecco un primo tentativo veloce. Credo che questo dovrebbe soddisfare i requisiti. Sto usando una semplice divisione di prova per trovare i numeri primi e un ciclo srotolato costruito usando il preprocessore per iterarlo fino a quando non ne ho trovati abbastanza. Il numero di ripetizioni è stato modificato in modo da stampare esattamente 128 numeri primi.


4

C, 87 caratteri

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);}

(Ho provato a scriverlo in uno stile più funzionale, ma la mia incapacità di usare quel returntipo di piano ha ucciso.)


3

C, 134 caratteri

Ecco una soluzione alternativa che cerca di evitare di usare le parole il più possibile, riservate o meno:

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;}

Tutto ciò che usa è printfe maincon un solo argomento.


3

Mathematica 50 personaggi

Non sono sicuro di come interpretare le "parole riservate" per Mathematica, ma voglio giocare, quindi prenderò il significato di fare senza funzioni incorporate per generare numeri primi o testare la primalità.

Fold[#2Cases[#/#2,1|_Rational]&,#,#]&@Range[2,719]

2

Haskell, 72 caratteri

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

Certo, evitare le parole chiave non è troppo difficile in Haskell.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.