Drucken Sie die ersten 128 Primzahlen aus, ohne reservierte Wörter zu verwenden

13

Die naheliegende Lösung wäre, sie einfach als Zeichenfolge auszudrucken. Ist es jedoch möglich, einen kürzeren Code zu schreiben?

Bedarf:

  1. Es sollte keine Eingabe verarbeitet werden, und die Ausgabe sollte in Form von 2 3 5 7 11 13 ...usw. erfolgen.
  2. Es werden überhaupt keine reservierten Wörter in der Sprache verwendet
  3. Die Sprache sollte zumindest eine strukturierte Programmierung ermöglichen und reservierte Wörter enthalten (ansonsten wäre Punkt 2 umstritten).

Zuerst dachte ich ausschließlich an C / C ++, erweiterte aber die Frage, während ich immer noch versuchte, Betrug zu verhindern

vsz
quelle
1
Leider hat Tcl für mich keine reservierten Wörter.
Johannes Kuhn

Antworten:

14

C 60 Zeichen

Die Einschränkung "keine Keywords" spielt hier keine Rolle. Ich bin mir ziemlich sicher, dass es nach Möglichkeit nicht möglich ist, es durch Hinzufügen von Keywords zu verbessern.

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

Alternative Version:
Die Ausgabe ist nicht so schön, aber ich mag den printfMissbrauch.

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

Bei beiden Lösungen besteht der Trick darin, zwei durch Rekursion implementierte Schleifen zu einer zusammenzuführen.
nist die nächste potentielle Primzahl, mder nächste potentielle Divisor.
In jedem rekursiven Aufruf erhöhen n(während mauf den vorherigen Wert gesetzt wird) oder verringern wir ihn m.

ugoren
quelle
7

Python, 108 Zeichen

Python wurde nicht für diese Herausforderung gemacht. Willst du print? Das ist reserviert. Nun, wie wäre es mit wir stdout? Nun, das wird einen import... Sie haben es erraten, zurückhaltend. Naja ... ich bin auf Unix, also kann ich den Dateideskriptor 1 öffnen, der zufällig stdout ist. Hacken!

Mensch und Iteration? Nichts als eval. Natürlich keine Schleifen, aber wir können nicht einmal eine Funktion mit defoder definieren lambda. Und um die Verletzung zusätzlich zu beleidigen, können wir nicht einmal das Listenverständnis verwenden! Ich suche immer nach einer Ausrede, um Dinge wie Codegolf zu benutzen map(p.__mod__,...)... das Verständnis ist immer besser. Bis jetzt ist das so.

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

Jetzt könnten Sie sich beschweren, dass execes sich um ein Keyword handelt, obwohl ich das Keyword nicht verwendet habe (ich habe nicht einmal evalein Keyword verwendet exec). Nun, hier ist eine 117-Zeichen-Lösung, die nicht verwendet wird '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
quelle
1
print ist in Python3 nicht reserviert :) du kannst es verwenden __import__, aber das wird Zeichen kosten
gnibbler
6

JavaScript (80 Zeichen)

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

Führen Sie in der Konsole Ihres Webbrowsers.

Benutzte ein Hauptsieb, das sich als sehr kondensiert herausstellte.

Kopieren
quelle
4

C 183 Zeichen

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

Hier ist ein kurzer erster Versuch. Ich glaube, das sollte den Anforderungen genügen. Ich benutze eine einfache Testdivision, um die Primzahlen und eine entrollte Schleife zu finden, die mit dem Präprozessor erstellt wurde, um sie zu durchlaufen, bis ich genug von ihnen gefunden habe. Die Anzahl der Wiederholungen wurde so angepasst, dass genau 128 Primzahlen gedruckt werden.

Ilmari Karonen
quelle
4

C 87 Zeichen

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

(Ich habe versucht, es in einem funktionaleren Stil zu schreiben, aber meine Unfähigkeit, returndiesen Plan zu verwenden, hat mich umgebracht.)

Brot-Box
quelle
3

C 134 Zeichen

Hier ist eine alternative Lösung, die versucht, die Verwendung von Wörtern so weit wie möglich zu vermeiden, sei sie reserviert oder auf andere Weise:

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

Alles, was es verwendet, ist printfund mainmit einem einzigen Argument.

Brot-Box
quelle
3

Mathematica 50 Zeichen

Ich bin mir nicht sicher, wie ich "reservierte Wörter" für Mathematica interpretieren soll, aber ich möchte spielen, also werde ich auf eingebaute Funktionen verzichten, um Primzahlen zu generieren oder auf Primalität zu testen.

Fold[#2Cases[#/#2,1|_Rational]&,#,#]&@Range[2,719]
Mr.Wizard
quelle
2

Haskell, 72 Zeichen

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

Zugegeben, das Vermeiden von Keywords ist in Haskell nicht allzu schwierig.

Hammar
quelle