Ihre Aufgabe ist es, ein Programm / eine Funktion zu schreiben, das / die eine ganze Zahl N als Eingabe akzeptiert, wenn Sie dies akzeptieren möchten. Das Programm / die Funktion sollte eine Liste der ersten N Primzahlen ausgeben / zurückgeben . Aber hier ist der Haken: Sie dürfen keine Primzahlen in Ihrem Code verwenden. Ein Primzeichen ist ein Zeichen, dessen Unicode-Codepunkt eine Primzahl ist. Im druckbaren ASCII-Bereich sind dies:
%)+/5;=CGIOSYaegkmq
Die Regel gilt jedoch auch für Nicht-ASCII-Zeichen, wenn Ihr Code diese verwendet.
- Eine gültige Eingabe ist eine Ganzzahl N mit 0 <N <= T , wobei Sie T auswählen können , sie muss jedoch größer oder gleich 10000 sein. T muss nicht endlich sein.
- Für ungültige Eingaben (Nicht-Ganzzahlen, Ganzzahlen außerhalb des Bereichs) eine Ausnahme auslösen oder "output / return nothing / null" ausgeben.
- Eine Ganzzahl mit führenden / nachfolgenden Leerzeichen als Eingabe wird als ungültig betrachtet.
- Eine Ganzzahl mit einem
+
Vorzeichen als Eingabe wird als ungültig betrachtet. - Eine Ganzzahl mit führenden Nullen als Eingabe wird als gültig betrachtet.
- Wenn Sie in Ihrer Sprache eine bereits analysierte Ganzzahl als Eingabe übergeben können, gelten die obigen Analyseregeln (mit Ausnahme des Bereichs 1) nicht, da die Ganzzahl bereits analysiert wurde.
- Die Eingabe ist immer Base-10.
- Die Verwendung von eingebauten Primgeneratoren und Primalitätstestern (einschließlich Primfaktorisierungsfunktionen) ist nicht zulässig.
- Die Quellenbeschränkung gilt für Unicode-Zeichen, die Byte-Zählung für die Partitur kann jedoch auch in einer anderen Codierung erfolgen, wenn Sie dies wünschen.
- Die Ausgabe kann eine einzelne nachgestellte Zeile enthalten, dies ist jedoch nicht erforderlich.
- Wenn Sie die Primzahlliste als Zeichenfolge ausgeben / zurückgeben, muss jede Primzahl durch ein oder mehrere nichtstellige Zeichen begrenzt werden. Sie können auswählen, welches Trennzeichen Sie verwenden möchten.
- Dies ist eine Code-Golf- Herausforderung, der kürzeste Code in Bytes gewinnt.
Stapeln Sie Snippet, um Ihren Code zu überprüfen
Sie können das folgende Stack-Snippet verwenden, um zu überprüfen, ob Ihr Code keine Primzahlen enthält:
var primes=[],max=10000;for(var i=2;i<=max;i++){primes.push(i);}for(var N=2;N<Math.sqrt(max);N++){if(primes.indexOf(N)===-1){continue;}primes=primes.filter(function (x){return x===N||x%N!==0;});}function setText(elem,text){var z=('innerText' in elem)? 'innerText' : 'textContent';elem[z]=text;}function verify(inputCode,resultSpan){var invalidChars=[];var success=true;for(var i=0;i<inputCode.length;i++){var cc = inputCode.charCodeAt(i);if (cc>max){setText(resultSpan,"Uh oh! The char code was bigger than the max. prime number calculated by the snippet.");success = false;break;}if (primes.indexOf(cc)!==-1){invalidChars.push(inputCode[i]);}}if (invalidChars.length===0&&success){setText(resultSpan, "Valid code!");}else if(success) { var uniqueInvalidChars = invalidChars.filter(function (x, i, self){return self.indexOf(x)===i;});setText(resultSpan, "Invalid code! Invalid chars: " + uniqueInvalidChars.join("")); }}document.getElementById("verifyBtn").onclick=function(e){e=e||window.event;e.preventDefault();var code=document.getElementById("codeTxt").value;verify(code,document.getElementById("result"));};
Enter your code snippet here:<br /><textarea id="codeTxt" rows="5" cols="70"></textarea><br /><button id="verifyBtn">Verify</button><br /><span id="result"></span>
code-golf
restricted-source
primes
ProgramFOX
quelle
quelle
;
es verboten ist ...+
, erscheint es enttäuschend, diese manuell auszulassen .Antworten:
CJam,
191830343319172120 BytesProbieren Sie es online aus.
Dies ist wahrscheinlich einer der schrecklich ineffizienten Algorithmen, die ich jemals implementiert habe. Aber ich habe es für die Größe getan!
Meine Antwort besteht aus einem Codeblock, der sich in CJam wie eine anonyme Funktion verhält. Führen Sie es mit einer Ganzzahl unmittelbar davor auf dem Stapel aus, und die resultierende Liste wird auf dem Stapel abgelegt. Ich behandle die obere Grenze der Eingabe als unendlich, damit ich diese Grenze nicht überprüfen muss.
Mein Algorithmus beginnt mit der Erhöhung von 3 auf die
input
höchste Potenz, die garantiert eine Zahl ergibt, die größer als dieinput
-te Primzahl ist, wenn die Eingabe gültig ist. Dann wird eine Liste der ganzen Zahlen von 2 bis zu dieser Zahl minus eins erstellt, die groß genug ist, um alle gewünschten Primzahlen aufzunehmen. Um die zusammengesetzten Zahlen loszuwerden ... seufzen ... erstellen wir eine Liste aller paarweisen Produkte, die alle zusammengesetzten Zahlen von 4 bis zu einem für unsere Zwecke ausreichend großen Wert generieren sollten. Dann müssen Sie nur noch jedes Element aus der ursprünglichen Liste in dieser zusammengesetzten Liste entfernen, es auf die ersteninput
Elemente zuschneiden und die Elemente mit dem Zeilenvorschubzeichen verbinden.Der Algorithmus sollte für jede Eingabe funktionieren. Es ist jedoch eine ganz andere Frage, ob der Dolmetscher / Computer über genügend Speicher oder Zeit verfügt, da der Zeit- und Platzbedarf in Bezug auf die Eingabe exponentiell ist. Wenn also die Eingabe für den Online-Dolmetscher größer als 5 oder für den Offline-Dolmetscher größer als 8 ist, lautet die Antwort auf diese Frage wahrscheinlich Nein.
quelle
S*
?S
ein Hauptcharakter?Java. 474 Bytes
Übernimmt Eingaben über Funktionsargumente, Ausgaben über ausgelöste Ausnahmen.
Eingerückt:
Escapezeichen entfernt:
Erläuterung:
Meine ursprüngliche Lösung verwendete eine
return
Aussage. Nachdem Sie diese Frage auf StackOverflow gestellt haben , regettman war er so freundlich, eine Möglichkeit zur Ausgabe / Rückgabe ohne Verwendung von bereitzustellen.Vorschläge sind wie immer willkommen :)
quelle
Rubin, 74
Erläuterung:
*o
Initialisiert ein leeres Ausgabearray. bis esn
Gegenstände gibt, finden wir die kleinste Zahl> = 2, die keinen Gegenstand teilto
, und fügen sie dann hinzuo
. Um die Teilung zu testen, huch. Alle guten Operatoren sind unzulässig, und ich kann nicht einmal verwendendivmod
. Das Beste, was ich sehen konnte, war die Verwendung vonx.div y
x geteilt durch y und abgerundet, dann multiplizieren Sie das mit y erneut. Wenn es gleich x ist, gab es keine Rundung, also dividiert y x.1.>x.^
ist ein Gleichheitstest, bei dem geprüft wird, ob das Ergebnis von xor 0 ist. Der.
Vor-jedem-Operator liegt daran, dass Sie nicht mischen können.
Operatoraufrufe ohne Klammern und Methodenaufrufe ohne Klammern .Bearbeiten: Die Spezifikationen für die Bereichsprüfung wurden hinzugefügt, nachdem ich dies gepostet habe, denke ich. Zur Einhaltung sind 79 Zeichen erforderlich:
quelle
CJam,
383730 BytesProbieren Sie es hier aus
Ich denke, dies sollte mit allen Regeln übereinstimmen und funktioniert für jedes nicht negative N (dh T ist unendlich). Es ist zwar schrecklich ineffizient, also versuchen Sie es nicht für große Zahlen.
Dies ist ein Block, der einer (unbenannten) Funktion am nächsten kommt. Er erwartet eine Ganzzahl auf dem Stapel, gibt alle Primzahlen aus und verlässt den Stapel ohne Eingabe. Für alle ungültigen Eingaben wird entweder ein Fehler ausgegeben oder es wird nichts gedruckt.
Der Großteil des Codes besteht aus der Validierung der Eingabe, gefolgt vom Sieb des Eratosthenes. Ich musste die Eingabebeschränkung nur an drei Stellen umgehen:
)
wird in CJam erhöht. Ich brauchte das einmal, konnte es aber durch~
(bitweise Ergänzung) ersetzen, weil ich die Zahlen danach sowieso quadrierte.%
ist modulo. Ich benutze37c~
stattdessen, was zuerst den Charakter erstellt%
und dann das auswertet. Das macht den Code viel langsamer.;
Öffnet und löscht ein Element aus dem Stapel. Ich muss das am Ende tun. Stattdessen benutze ich,'<(~
was den Charakter schiebt<
, dekrementiert und das bewertet.quelle
Bash + Coreutils, 227 Bytes
Das war ziemlich knifflig. Einige Dinge, auf die ich gestoßen bin:
while
unduntil
) sind unbrauchbar, weil sie am ehesten mitdone
einem Shell-Schlüsselwort übereinstimmen und nicht das Ergebnis einer Variablenerweiterung sein können (eseval
sei denn, sie werden verwendet, aber das ist auch nicht der Fall ). Die einzige verwendbare Schleife istfor
/in
, die{
/}
anstelle vondo
/ erlaubtdone
.for (( ; ; ))
ist auch nicht verwendbar.=
ist aus, also brauchen wir einen anderen Weg, um Variablen zuzuweisen.printf -v
ist gut dafür.jot
generiert die Liste der möglichen Faktoren in der inneren Schleife. Wenn ein möglicher Faktor eine mögliche Primzahl teilt, dann ist es keine Primzahl und wir brechen früh ausbreak
ist eine Shell eingebaut und kein Schlüsselwort, so dass es als Ergebnis einer Erweiterung erzeugt werden kann.dc
wandelt eine Zahl zur Basis 13 in den Bytestream umeak
./
oder%
Shell-Arithmetikoperatoren nicht verwenden . Also das ist ausgelagertdc
s -~
Operator, der Quotient und der Rest auf den Stapel schiebt.-lt
- less-than - ist der einzige verwendbare Shell-Vergleichsoperator.echo
ist keine Verwendung für die Ausgabe.printf
funktioniert aber solange wir vermeiden%
Es ist ein bisschen mühsam, die Eingabevalidierung richtig zu machen. Dies gibt bei ungültiger Eingabe nichts zurück.
Ausgabe:
quelle
Haskell, 90 Bytes
Dies ist eine anonyme Funktion, die eine Ganzzahl
n
als Eingabe verwendet.So funktioniert es:
[p|p<-[2..],not$or[b>p-1&&b-1<p|b<-[u*v|u<-[2..p-1],v<-[2..p-1]]]]
(Erstes Beispiel für Primzahl-Einzeiler im Haskell-Wiki, aber mit derelem
ersetzten Funktion) Erstellt eine unendliche Liste von Primzahlen.zip
es mit den Zahlen von1
bisn
, um eine Liste von(prime, seq. number)
Paaren zu machen . Entfernen seq. Nummer wieder. Ergebnis ist eine Liste von Primzahlen der Längen
.quelle
Rust, 64897 Bytes
(Code wurde aufgrund der Zeichenbeschränkung abgeschnitten, vollständige Lösung hier )
Die folgenden Rostmerkmale sind aufgrund der Primäreinschränkung nicht mehr verfügbar:
Was Sie technisch nutzen können:
Ich konnte mit diesen Werkzeugen einfach nichts Turing-komplettes machen. Es tut mir Leid. Es blieben nur die ersten 10000 Primzahlen, die von 5 gereinigt wurden. Zumindest können Sie es in Scheiben schneiden und haben eine gültige Lösung im engsten Sinne möglich.
Ich hätte gerne Experten für Turing-Tarpit-Tauchen (oder Rust!), Die mir sagten, ob ich etwas Besseres hätte tun können!
quelle
GNU APL,
75 68 67 65 59 5655 Zeichen⎕IO
muss sein1
.Ich kam in diesen Monaten später wieder und stellte fest, dass ich einen zusätzlichen Platz hatte!
quelle
Pyth - 12 Bytes
Verwendet die Primfaktor-Funktion von pyth, um festzustellen, ob # eine Primzahl ist. Benutzt den
!tPT
Trick, der mir bei meiner Antwort für Primzahlen unter Million Problem vorgeschlagen wurde.Da der Filter nur für Primzahlen unter n und nicht für die ersten n funktioniert, habe ich nur die Inverse von pi (x) für 10.000 nachgeschlagen und 104.000 erhalten, also verwende ich Primzahlen unter 10⁶ und erhalte die ersten n. Da dies nicht funktioniert, sollten Sie den Test durch Ersetzen
^T6
mit^T3
und Beschränken von n auf unter 1000 ausführen . Eingabe von stdin und Ausgabe auf stdout.quelle