Ob Sie es glauben oder nicht, wir haben noch keine Code Golf Challenge für einen einfachen Primalitätstest . Während es nicht unbedingt die interessanteste Herausforderung ist, insbesondere für "gewöhnliche" Sprachen, kann es in vielen Sprachen nicht trivial sein.
Der Rosetta-Code enthält Listen nach Sprache der idiomatischen Herangehensweisen an Primärtests, wobei einer speziell den Miller-Rabin-Test verwendet und der andere die Probedivision verwendet . Das "idiomatischste" stimmt jedoch oft nicht mit dem "kürzesten" überein. In dem Bestreben, Programming Puzzles und Code Golf zur Anlaufstelle für Code Golf zu machen, soll mit dieser Herausforderung ein Katalog mit den kürzesten Ansätzen in jeder Sprache erstellt werden, ähnlich wie bei "Hello, World!" und Golf du ein Quine für großes Wohl! .
Darüber hinaus ist die Fähigkeit zur Implementierung eines Primalitätstests Teil unserer Definition der Programmiersprache , sodass diese Herausforderung auch als Verzeichnis bewährter Programmiersprachen dienen wird.
Aufgabe
Schreiben Sie ein vollständiges Programm , das bei einer streng positiven Ganzzahl n als Eingabe bestimmt, ob n eine Primzahl ist, und entsprechend einen Wahrheits- oder Falschwert ausgibt .
Für diese Herausforderung ist eine Ganzzahl eine Primzahl, wenn sie genau zwei streng positive Teiler hat. Beachten Sie, dass dies 1 ausschließt , das der einzige rein positive Teiler ist.
Ihr Algorithmus muss deterministisch sein (dh mit Wahrscheinlichkeit 1 die richtige Ausgabe erzeugen) und sollte theoretisch für beliebig große ganze Zahlen funktionieren. In der Praxis können Sie davon ausgehen, dass die Eingabe in Ihrem Datentyp gespeichert werden kann, solange das Programm für ganze Zahlen von 1 bis 255 arbeitet.
Eingang
Wenn Ihre Sprache in der Lage ist, aus STDIN zu lesen, Befehlszeilenargumente oder eine andere alternative Form der Benutzereingabe zu akzeptieren, können Sie die Ganzzahl als Dezimalrepräsentation, unäre Repräsentation (unter Verwendung eines Zeichens Ihrer Wahl), Bytearray (groß oder klein) lesen Little Endian) oder Single Byte (wenn dies der größte Datentyp Ihrer Sprache ist).
Wenn (und nur wenn) Ihre Sprache keine Benutzereingaben akzeptieren kann, können Sie die Eingaben in Ihrem Programm fest codieren.
In diesem Fall muss die fest codierte Ganzzahl leicht austauschbar sein. Insbesondere darf es nur an einer Stelle im gesamten Programm erscheinen.
Reichen Sie für Bewertungszwecke das Programm ein, das der Eingabe 1 entspricht .
Ausgabe
Die Ausgabe muss auf STDOUT oder die nächstgelegene Alternative geschrieben werden.
Wenn möglich, sollte die Ausgabe nur aus einem Wahrheits- oder Falschwert (oder einer Zeichenfolgendarstellung davon) bestehen, optional gefolgt von einer einzelnen neuen Zeile.
Die einzige Ausnahme von dieser Regel ist die konstante Ausgabe des Interpreters Ihrer Sprache, die nicht unterdrückt werden kann, z. B. eine Begrüßung, ANSI-Farbcodes oder Einrückungen.
Zusätzliche Regeln
Dabei geht es nicht darum, die Sprache mit dem kürzesten Ansatz für Primärtests zu finden, sondern in jeder Sprache den kürzesten Ansatz zu finden. Daher wird keine Antwort als angenommen markiert.
Einsendungen in den meisten Sprachen werden in Bytes in einer geeigneten, bereits vorhandenen Codierung bewertet, normalerweise (aber nicht unbedingt) in UTF-8.
Die Sprache Piet wird zum Beispiel in Codels bewertet, was die natürliche Wahl für diese Sprache ist.
Einige Sprachen, wie Ordner , sind etwas schwierig zu bewerten. Im Zweifelsfall bitte nach Meta fragen .
Im Gegensatz zu unseren üblichen Regeln können Sie eine Sprache (oder Sprachversion) auch dann verwenden, wenn diese neuer als diese Herausforderung ist. Wenn jemand dies missbrauchen möchte, indem er eine Sprache erstellt, in der das leere Programm einen Primalitätstest durchführt, dann gratuliert er, dass er den Weg für eine sehr langweilige Antwort ebnet.
Beachten Sie, dass ein Dolmetscher vorhanden sein muss, damit die Einreichung getestet werden kann. Es ist erlaubt (und sogar empfohlen), diesen Dolmetscher für eine zuvor nicht implementierte Sprache selbst zu schreiben.
Wenn Ihre bevorzugte Sprache eine triviale Variante einer anderen (möglicherweise populäreren) Sprache ist, die bereits eine Antwort enthält (denken Sie an BASIC- oder SQL-Dialekte, Unix-Shells oder triviale Brainfuck-Derivate wie Headsecks oder Unary), sollten Sie der vorhandenen Antwort eine Anmerkung hinzufügen Die gleiche oder eine sehr ähnliche Lösung ist auch in der anderen Sprache die kürzeste.
Eingebaute Funktionen zum Testen der Primalität sind zulässig. Mit dieser Herausforderung soll die kürzestmögliche Lösung in jeder Sprache katalogisiert werden. Wenn es also kürzer ist, eine in Ihrer Sprache integrierte Lösung zu verwenden, entscheiden Sie sich für diese.
Sofern sie nicht zuvor außer Kraft gesetzt wurden, gelten alle Standardregeln für Code-Golf , einschließlich der http://meta.codegolf.stackexchange.com/q/1061 .
Bitte stimmen Sie langweiligen (aber gültigen) Antworten in Sprachen nicht ab, in denen es nicht viel zum Golfen gibt. Diese sind für diese Frage nach wie vor hilfreich, da versucht wird, einen Katalog so vollständig wie möglich zusammenzustellen. Stimmen Sie Antworten jedoch in erster Linie in Sprachen ab, in denen sich der Autor tatsächlich um das Golfen des Codes bemühen musste.
Katalog
Das Stapel-Snippet am Ende dieses Beitrags generiert den Katalog aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamt-Bestenliste.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
## Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
## Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Antworten:
Hallo Welt! , 13
quelle
Hexagony , 29 Bytes
Die lesbare Version dieses Codes lautet:
Erläuterung: Es wird geprüft, ob es eine Zahl von 2 bis n-1 gibt, die n dividiert.
Initialisierung:
Schreibe n in eine Speicherzelle und n-1 in eine andere:
Sonderfall n = 1:
0 ausgeben und beenden
Die Schleife
Berechnen Sie n% a und verringern Sie a. Beenden Sie, wenn a = 1 oder n% a = 0 ist.
Fall a = 1:
Erhöhe eine 0 zu einer 1, drucke sie aus und beende sie. (Der Befehlszeiger läuft in nordöstlicher Richtung und durchläuft eine Schleife von der östlichen zur südwestlichen Ecke. Und das $ sorgt dafür, dass der nächste Befehl ignoriert wird.)
Fall a% n = 0:
0 ausgeben und beenden (Der Anweisungszeiger führt SW aus und springt nach oben zum @
quelle
Hexagony ,
218925855 BytesHinweis: Diese Antwort wurde von Etoplay mit einer Lösung mit Seitenlänge 4 deutlich übertroffen.
Das erste nicht-triviale (dh nicht-lineare) Hexagony-Programm! Es basiert auf dem gleichen quadratischen Ansatz wie die Labyrinth-Antwort von Sp3000 . Nachdem ich mit einem Hexagon der Größe 10 angefangen hatte, konnte ich es auf die Größe 5 komprimieren. Allerdings konnte ich einen doppelten Code wiederverwenden, und es gibt immer noch eine ganze Reihe von No-Ops im Code, also könnte Größe 4 genau das Richtige sein möglich sein.
Erläuterung
Um den Code zu verstehen, müssen wir ihn zuerst aufklappen. Hexagony füllt jeden Quellcode mit No-Ops (
.
) auf die nächste zentrierte hexagonale Zahl auf61
. Anschließend wird der Code in ein reguläres Sechseck der entsprechenden Größe umgeordnet:Dies ist mit überkreuzenden und überlappenden Ausführungspfaden und mehreren Anweisungszeigern (IPs) ziemlich schwierig. Um zu erklären, wie es funktioniert, schauen wir uns zunächst eine ungolfed-Version an, bei der der Kontrollfluss nicht durch die Ränder geht, nur eine IP verwendet wird und die Ausführungspfade so einfach wie möglich sind:
Randnotiz: Der obige Code beginnt mit der Ausführung der ersten Zeile, die voller No-Ops ist. Wenn die IP die Nordostkante erreicht, wird sie in die äußerste linke Ecke (die
)
) umgebrochen , in der der eigentliche Code beginnt.Bevor wir beginnen, ein Wort zum Speicherlayout von Hexagony. Es ist ein bisschen wie Brainfucks Band über Steroide. Tatsächlich handelt es sich nicht um ein Band, sondern um ein hexagonales Gitter selbst (ein unendliches), bei dem jede Kante einen ganzzahligen Wert aufweist, der anfänglich 0 ist (und im Gegensatz zu Standard-Brainfuck sind die Werte Ganzzahlen mit willkürlicher Genauigkeit). Für dieses Programm verwenden wir vier Kanten:
Wir werden die Fakultät an Kante A berechnen , unsere Eingabe an Kante C herunterzählen und eine weitere Kopie der Eingabe (für das Modulo) an Kante D speichern . B wird als temporäre Flanke für Berechnungen verwendet.
Der Speicherzeiger (MP) beginnt an der Kante A und zeigt nach Norden (dies ist wichtig, um den MP zu bewegen). Hier ist das erste Bit des Codes:
)
Inkrementiert Kante A auf1
als Basis der Fakultät.}
Der MP macht eine Rechtskurve, dh er bewegt sich zu Kante C (nach Nordosten zeigend). Hier lesen wir die Eingabe als Ganzzahl mit?
. Dann machen wir noch eine Rechtskurve bis zur Kante D mit}
.=
Kehrt den MP so um, dass er auf den mit C geteilten Scheitelpunkt zeigt .&
kopiert den Wert von C (der Eingabe) nach D - der Wert wird von links kopiert, da der aktuelle Wert nicht positiv ist (Null). Schließlich machen wir die MP auf eine Linkskurve zurück C mit{
.Als nächstes
<
ist technisch eine Verzweigung, aber wir wissen, dass der aktuelle Wert positiv ist, so dass die IP immer nach rechts abbiegen wird>
. Ein Branchentreffer von der Seite wirkt wie ein Spiegel, so dass sich die IP wieder horizontal in Richtung der bewegt(
, was den Wert in C dekrementiert .Die nächste Filiale
<
ist eigentlich eine Filiale. So laufen wir vonn-1
unten nach1
. Während der aktuelle Wert in C positiv ist, dreht sich die IP nach rechts (um die Schleife auszuführen). Sobald wir die Null erreicht haben, biegt sie stattdessen links ab.Schauen wir uns die Schleife "body" an. Das
|
ist einfacher Spiegel, die>
und<
wird auch als Spiegel wieder verwendet. Das heißt, der eigentliche Schleifenkörper läuft auf}
Bewegt den MP zu Kante B und=
kehrt seine Richtung zum Scheitelpunkt ABC um .)
erhöht den Wert: Dies ist nur für die erste Iteration relevant, bei der der Wert von B immer noch Null ist. Wir möchten sicherstellen, dass er positiv ist, sodass der nächste Befehl&
den rechten Nachbarn kopiert , dh A , dh den aktuellen Wert der Fakultät Berechnung, in B .}
Verschiebt dann den MP nach A und=
kehrt ihn erneut um, um zum gemeinsamen Scheitelpunkt zu zeigen.*
multipliziert beide Nachbarn, das heißt Kanten B und C und speichert das Ergebnis in A . Schließlich müssen wir noch}=
zu C zurückkehren , das immer noch dem Scheitelpunkt ABC zugewandt ist .Ich hoffe, Sie können sehen, wie dies die Fakultät von
n-1
in A berechnet .Nun haben wir es geschafft, der Schleifenzähler in C ist Null. Wir wollen die Fakultät quadrieren und dann das Modulo mit der Eingabe nehmen. Das macht dieser Code:
Da C Null ist ,
&
Kopien der linke Nachbar, das heißt die Fakultäts in A .}=*
bewegt sich zu B und das Produkt der beiden Kopien des faktoriellen (dh das Quadrat) in den Speichern B . kehrt{
zu C zurück , kehrt den MP jedoch nicht um. Wir wissen , dass der aktuelle Wert nun positiv ist, so&
Kopien Eingabe von D in C .'
das MP rückwärts nach rechts, auf dh A . Denken Sie daran, das Quadrat der faktoriellen ist in B und der Eingang in C . So%
berechnet(n-1)!^2 % n
, genau das, was wir suchen.!
gibt das Ergebnis als Ganzzahl (0 oder 1) aus und@
beendet das Programm.Okay, aber das war die ungolfed version. Was ist mit der Golfversion? Sie müssen zwei weitere Dinge über Hexagony wissen:
]
und mit zur vorherigen IP wechseln[
. (Sie können auch ein bestimmtes mit wählen#
, aber das ist für ein anderes Mal.)Es gibt auch ein paar neue Befehle:
\
und/
sind wie Spiegel|
und~
multipliziert den aktuellen Wert mit-1
.Wie übersetzt sich die ungolfed-Version in die golfed-Version? Den linearen Einrichtungscode
)}?}=&{
und die grundlegende Schleifenstruktur finden Sie hier:Jetzt überquert der Schleifenkörper einige Male die Kanten, aber am wichtigsten ist, dass die eigentliche Berechnung an die vorherige IP übergeben wird (die an der linken Ecke beginnt und sich nach Nordosten bewegt):
Nach dem Abprallen vom Ast in Richtung Südosten wickelt sich die IP um den Rand zu den beiden
=
in der oberen linken Ecke (die zusammen ein No-Op sind) und prallt dann vom/
. Das~
invertiert das Vorzeichen des aktuellen Werts, was für nachfolgende Iterationen wichtig ist. Die IP wickelt sich wieder um dieselbe Kante und trifft schließlich,[
wo die Kontrolle an die andere IP übergeben wird.Dieser führt nun aus,
~}=)&}=*}
was die Negation rückgängig macht und führt dann nur den ungolften Schleifenkörper (abzüglich des=
) aus. Schließlich trifft es,]
welche Hände auf die ursprüngliche IP zurücksteuern. (Beachten Sie, dass diese IP beim nächsten Ausführen an der Stelle beginnt, an der sie aufgehört hat, sodass sie zuerst die Ecke berührt. Der aktuelle Wert muss negativ sein, damit die IP zum Nordwestrand zurückspringt anstelle des Südostens.)Sobald die ursprüngliche IP die Kontrolle wieder aufnimmt, prallt sie von der ab
\
, führt die verbleibenden aus=
und trifft dann>
, um in die nächste Schleifeniteration einzuspeisen.Nun der wirklich verrückte Teil: Was passiert, wenn die Schleife endet?
Die IP bewegt sich nordöstlich von der
<
und verläuft in nordöstlicher Diagonale. Es endet also auf demselben Ausführungspfad wie der Schleifenkörper (&}=*}]
). Was eigentlich ziemlich cool ist, denn genau das ist der Code, den wir an dieser Stelle ausführen möchten, zumindest wenn wir einen weiteren hinzufügen=}
(weil}=}
äquivalent zu{
). Aber wie kommt das eigentlich nicht wieder in die frühere Schleife? Weil]
sich die nächste IP ändert, die jetzt die (bisher nicht verwendete) IP ist, die in der oberen rechten Ecke beginnt und sich nach Südwesten bewegt. Von dort aus wird die IP entlang der Kante fortgesetzt, bis zur oberen linken Ecke umgebrochen, die Diagonale nach unten verschoben, von der abgeprallt|
und bei der@
Ausführung des letzten Bits des linearen Codes beendet:(Das
)(
ist natürlich ein No-Op - ich musste das hinzufügen,(
weil das)
schon da war.)Puh ... was für ein Durcheinander ...
quelle
1
) umgebrochen . Was1
redest du da?)
mal ein1
.Pyth, 4 Bytes
Druckt
True
oderFalse
.quelle
P_
Netzhaut , 16 Bytes
Probieren Sie es online!
Beginnen wir mit einem Klassiker: Primzahlen mit einem regulären Ausdruck erkennen . Die Eingabe sollte unär sein , wobei jedes wiederholte druckbare Zeichen verwendet wird. Die Testsuite enthält eine Konvertierung von dezimal nach unär.
Ein Retina-Programm, das aus einer einzelnen Zeile besteht, behandelt diese Zeile als regulären Ausdruck und gibt die Anzahl der in der Eingabe gefundenen Übereinstimmungen aus, die
0
für zusammengesetzte Zahlen und1
für Primzahlen gelten.Der Lookahead stellt sicher, dass die Eingabe nicht zusammengesetzt ist: Bei der Rückverfolgung wird jede mögliche Teilzeichenfolge (mit mindestens 2 Zeichen)
(..+)
überprüft. Der Lookahead versucht dann, den Rest der Eingabe abzugleichen, indem wiederholt wird, was hier erfasst wurde. Wenn dies möglich ist, bedeutet dies, dass der Eingang einen Divisor hat, der größer als 1 ist, jedoch kleiner als er selbst ist. Wenn dies der Fall ist, schlägt der negative Lookahead die Übereinstimmung fehl. Für Primzahlen gibt es keine solche Möglichkeit und das Match geht weiter.Das einzige Problem ist, dass dieser Lookahead dies ebenfalls akzeptiert. Daher schließen
1
wir dies aus, indem wir mindestens zwei Zeichen mit übereinstimmen..
.quelle
CJam, 4 Bytes
CJam verfügt über einen eingebauten Operator zum Testen der Primalität.
quelle
limp
pimp
meine cjam.pimp
ist objektiv mehr Zuhälterl~mp
q
liest eine Eingabezeile,i
analysiert sie als Ganzzahl undmp
ist das eingebaute Element . CJam hat zwei Gruppen mit zwei eingebauten Zeichen: die "erweiterten" beginnene
und die "mathematischen" beginnenm
HTML + CSS, 254 + n max * 28 Bytes
Wir können die Primalität mit regulären Ausdrücken überprüfen. Mozilla hat
@document
, was definiert ist als:Elemente über CSS basierend auf der aktuellen URL filtern. Dies ist ein einzelner Durchgang, also müssen wir zwei Schritte ausführen:
1. Input bekommen
Der kürzeste Weg, um Eingaben zu erhalten und diese auf die URL zu übertragen, ist ein
GET
Formular mit Kontrollkästchen. Für den regulären Ausdruck benötigen wir nur eine eindeutige Zeichenfolge, um die Auftritte zu zählen.Also fangen wir damit an (61 Bytes):
Wir haben zwei eindeutige
<p>
s, um anzuzeigen, ob die eingegebene Zahl eine Primzahl ist (1) oder nicht (0). Wir definieren auch die Form und ihre Aktion.Gefolgt von n max Kontrollkästchen mit demselben Namen (n max * 28 Bytes):
Gefolgt vom submit-Element (34 Bytes):
2. Antwort anzeigen
Wir benötigen das CSS (159 Bytes), um das
<p>
anzuzeigende auszuwählen (1 oder 0):»Probiere es bei codepen.io aus (nur Firefox)
quelle
Hilfe, WarDoq! 1 Byte
Gibt 1 aus, wenn der Eingang prim ist, sonst 0.
quelle
Hexagony , 28 Bytes
Da mich Etoplay bei dieser Frage absolut auf die Palme brachte , hatte ich das Gefühl, dass ich seine einzige andere Antwort übertreffen musste .
Probieren Sie es online!
Ich verwende den Satz von Wilson, wie Martin es in seiner Antwort getan hat : Gegeben
n
, ich gebe aus(n-1!)² mod n
Hier hat sich das Programm entfaltet:
Und hier ist die lesbare Version:
Erläuterung:
Das Programm besteht aus drei Hauptschritten: Initialisierung , Faktoriell und Ausgabe .
Das Speichermodell von Hexagony ist ein unendliches hexagonales Gitter. Ich benutze 5 Speicherplätze, wie in diesem Diagramm gezeigt:
Ich werde auf diese Speicherorte (und die darin gespeicherten Ganzzahlen) durch ihre Bezeichnungen in diesem Diagramm verweisen.
Initialisierung:
Der Anweisungszeiger ( IP ) beginnt in der oberen linken Ecke und geht nach Osten. Der Speicherzeiger ( MP ) beginnt bei IN .
Zuerst
?
liest die Anzahl von Ein- und speichert sie in IN . Die IP bleibt auf dem blauen Pfad, reflektiert von\
. Die Sequenz"&(
bewegt den MP zurück und nach links (nach A ), kopiert den Wert von IN nach A und dekrementiert ihn.Die IP verlässt dann eine Seite des Sechsecks und tritt wieder in die andere Seite ein (auf den grünen Pfad). Es wird ausgeführt,
'+
was den MP nach B verschiebt und kopiert, was in A war .<
Leitet die IP nach Westen um.Fakultät:
Ich berechne die Fakultät auf eine bestimmte Weise, so dass es einfach ist, sie zu quadrieren. Ich speichere
n-1!
sowohl in B als auch in C wie folgt.Der Anweisungszeiger beginnt auf dem blauen Pfad in Richtung Osten.
='
kehrt die Richtung des MP und bewegt ihn nach hinten zu C . Dies ist gleichbedeutend{=
mit dem,=
wo es später hilfreich war.&{
Kopien von dem Wert A bis C , bewegt dann den MP zurück A . Die IP folgt dann dem grünen Pfad und unternimmt nichts, bevor sie den roten Pfad erreicht\
und auf den orangefarbenen Pfad trifft .Mit
(>
dekrementieren wir A und leiten die IP East um. Hier trifft es eine Branche aus :<
. Für positives A folgen wir dem orangen Pfad. Andernfalls wird die IP nach Nordosten gerichtet.'*
bewegt den MP zu B und speichert A * C in B . Hier war(n-1)*(n-2)
die anfängliche Eingaben
. Die IP tritt dann in die Anfangsschleife zurück und setzt das Dekrementieren und Multiplizieren fort, bis A erreicht ist0
. (Computingn-1!
)NB :
&
Speichert bei folgenden Schleifen den Wert von B in C , da in C jetzt ein positiver Wert gespeichert ist. Dies ist für die Fakultät der Berechnung von entscheidender Bedeutung.Ausgabe:
Wenn A erreicht
0
. Die Verzweigung leitet die IP stattdessen entlang des blauen Pfads.=*
die umkehrt MP und speichert den Wert von B * C in A . Dann verlässt die IP das Sechseck und tritt wieder in den grünen Pfad ein. ausführen"%
. Dies bewegt den MP nach OUT und berechnet A mod IN oder(n-1!)² mod n
.Das Folgende
{"
wirkt wie ein No-Op, da sie sich gegenseitig aufheben.!
druckt die endgültige Ausgabe und*+'(
werden vor der Beendigung ausgeführt:@
.Nach der Ausführung (mit einer Eingabe von
5
) sieht der Speicher folgendermaßen aus:Die schönen Bilder des Kontrollflusses wurden mit Timwis Hexagony Coloror aufgenommen .
Vielen Dank an Martin Ender für das Generieren aller Bilder, da ich es auf meinem PC nicht konnte.
quelle
Mornington Crescent , 2448 Bytes
Wir sind zurück in London!
Timwi war so freundlich, die Kontrollflussstationen
Temple
undAngel
in Esoteric IDE zu implementieren und der Sprachspezifikation Eingabe- und Ganzzahlanalyse hinzuzufügen.Dieser ist wahrscheinlich besser als der "Hallo, Welt!", Weil ich dieses Mal ein CJam-Skript geschrieben habe, um den kürzesten Weg zwischen zwei Stationen zu finden. Wenn Sie es verwenden möchten (obwohl ich nicht weiß, warum jemand es möchte ...), können Sie den Online-Dolmetscher verwenden . Füge diesen Code ein:
Hier sind die ersten beiden Zeilen die Stationen, die Sie überprüfen möchten. Fügen Sie außerdem den Inhalt dieses Pastebins in das Eingabefenster ein.
Die Ausgabe zeigt Ihnen, welche Leitungen an den beiden Stationen verfügbar sind, und dann eine Liste aller Stationen, die die beiden verbinden, sortiert nach der Länge der Stationsnamen. Es werden alle angezeigt, weil es manchmal besser ist, einen längeren Namen zu verwenden, weil entweder eine kürzere Linie zulässig ist oder weil die Station speziell ist (wie Bank oder Temple), damit Sie sie vermeiden möchten. Es gibt einige Randfälle, in denen zwei Stationen nicht durch eine einzige andere Station verbunden sind (insbesondere die Metropolitan- und District-Linien kreuzen sich nie). In diesem Fall müssen Sie etwas anderes herausfinden. ;)
Der eigentliche MC-Code basiert auf dem Quadratfaktor-Ansatz, ebenso wie viele andere Antworten, da MC über Multiplikation, Division und Modulo verfügt. Ich dachte mir auch, dass eine einzelne Schleife praktisch wäre.
Ein Problem ist, dass die Schleifen Do-While-Schleifen sind und das Dekrementieren und Inkrementieren teuer ist, sodass ich
(n-1)!
(fürn > 0
) nicht einfach berechnen kann . Stattdessen rechne ichn!
und teile dannn
am Ende durch. Ich bin sicher, dass es dafür eine bessere Lösung gibt.Als ich anfing, dies zu schreiben, fand ich, dass das Speichern
-1
in Hammersmith eine gute Idee wäre, damit ich billiger sparen kann, aber am Ende hat dies möglicherweise mehr gekostet als gespart. Wenn ich die Geduld finde, dies zu wiederholen, kann ich versuchen,-1
stattdessen nur in Upminster zu bleiben, damit ich Hammersmith für etwas Nützlicheres verwenden kann.quelle
Brachylog (V2), 1 Byte
Probieren Sie es online!
Brachylog (V1), 2 Bytes
Hierbei wird das integrierte Prädikat verwendet
#p - Prime
, wodurch die Eingabe auf eine Primzahl beschränkt wird.Brachylog ist mein Versuch, eine Code-Golf-Version von Prolog zu erstellen, einer deklarativen Code-Golf-Sprache, die Backtracking und Unification verwendet.
Alternative Lösung ohne eingebaute: 14 Bytes
Hier ist eine Aufschlüsselung des obigen Codes:
quelle
Haskell, 49 Bytes
Verwendung von xnors Folgerung zu Wilsons Theorem :
quelle
main=interact$\n-> ...
?interact...read
irgendwo drin brauchen , was es viel länger macht als nurreadLn
. Oftdo
kann die Notation prägnanter sein als erwartet, insbesondere wenn die Alternative ein Lambda ist.Labyrinth , 29 Bytes
Liest eine Ganzzahl aus STDIN und gibt sie aus
((n-1)!)^2 mod n
. Wilsons Satz ist für diese Herausforderung ziemlich nützlich.Das Programm beginnt in der oberen linken Ecke, beginnend mit
1
dem 10-fachen des oberen Stapels und dem 1-fachen. Auf diese Weise werden in Labyrinth große Zahlen gebildet. Da die Stapel in Labyrinth jedoch mit Nullen gefüllt sind, ist der Endeffekt wie bei uns habe gerade eine 1 gedrückt.?
liest dannn
aus STDIN und:
dupliziert es.}
wechseltn
zum Hilfsstapel, der am Ende für das Modulo verwendet wird.(
Dann wird dekrementiertn
, und wir sind bereit, mit der Berechnung der quadratischen Fakultät zu beginnen.Unser zweites
:
(Duplikat) befindet sich an einer Kreuzung, und hier kommen die Kontrollflussfunktionen von Labyrinth ins Spiel. An einer Kreuzung, nachdem ein Befehl ausgeführt wurde, biegen wir nach rechts ab, wenn die Spitze des Stapels positiv ist, nach links ab und nach null fahren wir geradeaus. Wenn Sie versuchen, sich zu drehen, aber gegen eine Wand stoßen, lässt Labyrinth Sie stattdessen in die andere Richtung drehen.Denn
n = 1
da die Spitze des Stapelsn
dekrementiert ist0
, gehen wir geradeaus. Wir haben dann einen No-Op getroffen,'
gefolgt von einem weiteren Dekrement, bei(
dem wir ankommen-1
. Das ist negativ, also wenden wir uns nach links und führen+
plus (-1 + 0 = -1
) aus,{
umn
vom Hilfsstapel zum Haupt- und%
Modulo (-1 % 1 = 0
) zurückzukehren. Dann geben wir mit aus!
und beenden mit@
.Denn
n > 1
beim zweiten:
biegen wir rechts ab. Wir verschieben dann}
unseren kopierten Schleifenzähler auf den Hilfsstapel, duplizieren:
und multiplizieren ihn zweimal**
, bevor wir den Zähler zurückschieben{
und dekrementieren(
. Wenn wir uns immer noch sicher sind, versuchen wir, nach rechts abzubiegen, können es aber nicht. Labyrinth lässt uns stattdessen nach links abbiegen und setzt die Schleife fort. Ansonsten ist die Spitze des Stapels unser Schleifenzähler, der auf 0 reduziert wurde und den wir+
zu unserem berechneten addieren((n-1)!)^2
. Schließlich verschieben wir unsn
mit{
dann modulo zurück%
, geben aus!
und beenden@
.Ich sagte, das
'
ist ein No-Op, aber es kann auch zum Debuggen verwendet werden. Laufen Sie mit der-d
Flagge, um den Status des Stapels jedes Mal zu sehen, wenn der'
übergangen wird!quelle
Bash + GNU-Dienstprogramme, 16
4 Bytes gespart dank @Dennis
2 Bytes gespart dank @Lekensteyn
Die Eingabe erfolgt in einer Zeile von STDIN. Die Ausgabe ist eine leere Zeichenfolge für Falsey und eine nicht leere Zeichenfolge für Truthy. Z.B:
quelle
factor|awk NF==2
Java,
126121 BytesIch denke, wir brauchen eine Java-Antwort für den Anzeiger ... also hier ist eine einfache Testteilungsschleife:
Wie bei Java üblich, ist dies aufgrund der "Vollprogramm" -Anforderung viel größer als bei einer Funktion, was hauptsächlich auf die
main
Signatur zurückzuführen ist.In erweiterter Form:
Edit: Von Peter in Kommentaren korrigiert und korrigiert. Vielen Dank!
quelle
1
das Prime ist. Sonst würde ein 4-char rettend sein , indemp
und sagenfor(;i<n;)n=n%i++<1?0:n;System.out.print(n>0);
class P{public static void main(String[]a){int i=2,n=Short.valueOf(a[0]);for(;i<n;)n=n%i++<1?0:n;System.out.print(n>1);}}
arbeitet.valueOf
Sienew
, wie innew Short(a[0])
, oder verwendennew Long(a[0])
, was etwas kürzer ist.public
Modifikator löschen.Brain-Flak ,
112108 BytesProbieren Sie es online!
Wie es funktioniert
Anfangs enthält der erste Stapel eine positive ganze Zahl n , der zweite Stapel ist leer.
Wir beginnen damit, n wie folgt zu dekrementieren .
n = 1
Wenn n = 1 ist Null, die while-Schleife
wird komplett übersprungen. Schließlich wird der verbleibende Code ausgeführt.
n> 1
Wenn n - 1 nicht Null ist, geben wir die Schleife ein, die n = 1 überspringt. Es ist keine "echte" Schleife; Der Code wird nur einmal ausgeführt. Es wird folgendes erreicht.
n% k wird mit dem 42-Byte-Modul-Algorithmus aus meiner Antwort auf den Teilbarkeitstest berechnet .
Schließlich interpretieren wir die Ergebnisse, um die Primalität von n zu bestimmen .
quelle
{}
.1 0
ist zwei Werte. Auf der anderen Seite würden wir Arrays akzeptieren, solange die Sprache sie für wahr oder falsch hält und mehrere Stapelelemente das nächste sind, was Brain-Flak zu Arrays hat. Könnte es wert sein, dies zu Meta zu nehmen.1 0
wahr ist. chat.stackexchange.com/transcript/message/32746241#32746241R,
3729 BytesVerwendet die Probeabteilung.
scan()
Liest eine Ganzzahl von STDIN undcat()
schreibt nach STDOUT.Wir erzeugen einen Längenvektor
n
, der aus den ganzen Zahlen 1 bisn
Modulo bestehtn
. Wir testen, ob jeder!
Wert 0 ist, indem wir ( ) negieren , was einen logischen Wert zurückgibt, der wahr ist, wenn die Zahl 0 ist, und falsch, wenn sie größer als 0 ist. Die Summe eines logischen Vektors ist die Anzahl der wahren Elemente, und für Primzahlen erwarten wir Die einzigen von Null verschiedenen Module sind 1 undn
daher erwarten wir, dass die Summe 2 ist.8 Bytes gespart dank flodel!
quelle
f=function(x)sum(!x%%1:x)==2
können Sie es in 28 Bytes tun.TI-BASIC, 12 Bytes
Ziemlich einfach.
randIntNoRep(
gibt eine zufällige Permutation aller ganzen Zahlen von 1 bisAns
.Dies verbiegt die Regeln ein wenig; weil Listen in TI-BASIC auf 999 Elemente beschränkt sind, die ich interpretiert habe
Dies bedeutet, dass davon ausgegangen werden kann, dass alle Datentypen für die Eingabe geeignet sind. OP stimmt dieser Interpretation zu.
Eine 17-Byte-Lösung, die tatsächlich bis zu 10 ^ 12 oder so funktioniert:
quelle
randIntNoRep(
zwei.PARI / GP, 21 Bytes
Funktioniert für lächerlich große Inputs, denn genau dafür ist PARI / GP gemacht.
quelle
isprime
Führt einen APR-CL-Primalitätsnachweis durch und verlangsamt sich daher erheblich, wenn die Eingaben sehr groß werden.ispseudoprime(input)
führt einen AES BPSW Probable Prime Test durch, der für über 100 Stellen viel schneller ist. Noch keine bekannten Gegenbeispiele nach 35 Jahren. Version 2.1 und frühere Versionen von Pari aus der Zeit vor 2002 verwenden eine andere Methode, die leicht zu falschen Ergebnissen führen kann, aber das sollte niemand verwenden.TI-BASIC, 24 Byte
Beachten Sie, dass TI-Basic-Programme ein Tokensystem verwenden, sodass das Zählen von Zeichen nicht den tatsächlichen Bytewert des Programms zurückgibt.
Die Antwort von Thomas Kwa ist positiv , sie ist überlegen.
Stichprobe:
Gibt jetzt zurück,
0
wenn keine Primzahl vorhanden ist oder1
wenn dies der Fall ist.quelle
Stapel Katzen , 62 + 4 = 66 Bytes
Muss mit den
-ln
Befehlszeilen-Flags ausgeführt werden (daher +4 Byte). Druckt0
für zusammengesetzte Zahlen und1
für Primzahlen.Probieren Sie es online!
Ich denke, dies ist das erste nicht triviale Stack Cats-Programm.
Erläuterung
Eine kurze Einführung in Stack Cats:
-1
wird a auf den Anfangsstapel geschoben, und dann wird die gesamte Eingabe darüber geschoben. In diesem Fall wird-n
die Eingabe aufgrund des Flags als dezimale Ganzzahl gelesen.-1
unten ein steht, wird es ignoriert. Aufgrund des-n
Flags werden die Werte aus dem Stapel einfach als durch Zeilenvorschub getrennte Dezimalzahlen gedruckt.<<(\-_)
wird(_-/)>>
. Dieses Entwurfsziel schränkt ziemlich stark ein, welche Arten von Operatoren und Steuerungsflusskonstrukten in der Sprache existieren und welche Arten von Funktionen für den globalen Speicherstatus berechnet werden können.Um das Ganze abzurunden, muss jedes Stack Cats-Programm selbstsymmetrisch sein. Möglicherweise stellen Sie fest, dass dies für den obigen Quellcode nicht der Fall ist. Das ist, wofür das
-l
Flag ist: Es spiegelt implizit den Code auf der linken Seite, wobei das erste Zeichen für die Mitte verwendet wird. Daher ist das eigentliche Programm:Effektiv mit dem gesamten Code zu programmieren ist höchst nicht trivial und nicht intuitiv und hat noch nicht wirklich herausgefunden, wie ein Mensch es möglicherweise tun kann. Wir haben ein solches Programm brutal für einfachere Aufgaben gezwungen , wären aber nicht in der Lage gewesen, dies von Hand zu erreichen. Zum Glück haben wir ein Grundmuster gefunden, mit dem Sie eine Hälfte des Programms ignorieren können. Dies ist sicherlich nicht optimal, aber derzeit die einzige bekannte Methode, um in Stack Cats effektiv zu programmieren.
In dieser Antwort lautet die Vorlage des Musters also wie folgt (es gibt einige Unterschiede in der Art und Weise, wie es ausgeführt wird):
Wenn das Programm startet, sieht das Stapelband folgendermaßen aus (zum Beispiel für die Eingabe
4
):Der
[
bewegt die Oberseite des Stapels nach links (und den Bandkopf entlang) - wir nennen dies "Pushing". Und das<
bewegt den Tonkopf alleine. Nach den ersten beiden Befehlen haben wir folgende Situation:Nun
(...)
ist die eine Schleife, die ganz einfach als Bedingung verwendet werden kann: Die Schleife wird nur betreten und verlassen, wenn die Oberseite des aktuellen Stapels positiv ist. Da es momentan null ist, überspringen wir die gesamte erste Hälfte des Programms. Jetzt ist der mittlere Befehl*
. Dies ist einfachXOR 1
, dh es schaltet das niedrigstwertige Bit oben auf dem Stapel um und verwandelt in diesem Fall das0
in ein1
:Nun begegnen wir dem Spiegelbild der
(...)
. Dieses Mal ist die Oberseite des Stapels ist positiv und wir tun den Code eingeben. Bevor wir uns ansehen, was in den Klammern vor sich geht, lassen Sie mich erklären, wie wir am Ende abschließen: Wir möchten sicherstellen, dass am Ende dieses Blocks der Bandkopf wieder einen positiven Wert aufweist (so dass die Die Schleife endet nach einer einzelnen Iteration und wird einfach als lineare Bedingung verwendet.) Der Stapel rechts enthält die Ausgabe und der Stapel rechts davon enthält a-1
. Wenn dies der Fall ist, verlassen wir die Schleife,>
bewegen uns auf den Ausgabewert und verschieben]
ihn auf den,-1
so dass wir einen sauberen Stapel für die Ausgabe haben.Das ist das. Jetzt können wir in den Klammern tun, was immer wir wollen, um die Primalität zu überprüfen, solange wir sicherstellen, dass wir die Dinge wie im vorherigen Abschnitt am Ende beschrieben einrichten (was leicht mit etwas Schieben und Bewegen des Bandkopfs erledigt werden kann). Ich habe zuerst versucht, das Problem mit Wilsons Theorem zu lösen, bin aber zu weit über 100 Bytes gekommen, weil die Berechnung der faktoriellen Quadrate in Stack Cats eigentlich ziemlich teuer ist (zumindest habe ich keinen kurzen Weg gefunden). Also ging ich stattdessen zur Probedivision und das stellte sich tatsächlich als viel einfacher heraus. Schauen wir uns das erste lineare Bit an:
Sie haben bereits zwei dieser Befehle gesehen. Außerdem
:
tauscht die oberen zwei Werte des aktuellen Stapels und^
XORs den zweiten Wert in den Spitzenwert. Dies:^
ergibt ein allgemeines Muster, um einen Wert auf einem leeren Stapel zu duplizieren (wir ziehen eine Null über den Wert und wandeln die Null in um0 XOR x = x
). Danach sieht unser Band so aus:Der von mir implementierte Trial-Division-Algorithmus funktioniert nicht für Eingaben
1
, daher sollten wir den Code in diesem Fall überspringen. Wir können leicht Karte1
auf0
und alles andere auf positive Werte mit*
, so ist hier, wie wir das tun:Das heißt, wir verwandeln uns
1
in0
, überspringen einen großen Teil des Codes, wenn wir ihn tatsächlich erhalten0
, aber innerhalb machen wir den Code sofort rückgängig,*
damit wir unseren Eingabewert zurückbekommen. Wir müssen nur noch einmal sicherstellen, dass wir am Ende der Klammern mit einem positiven Wert enden, damit sie keine Schleife bilden. Innerhalb der Bedingung bewegen wir einen Stapel nach rechts>
und starten dann die Hauptversuchs-Teilungsschleife:Klammern (im Gegensatz zu Klammern) definieren eine andere Art von Schleife: Es handelt sich um eine Do-While-Schleife, dh, sie wird immer für mindestens eine Iteration ausgeführt. Der andere Unterschied ist die Abbruchbedingung: Bei der Eingabe der Schleife merkt sich Stack Cat den Höchstwert des aktuellen Stacks (
0
in unserem Fall). Die Schleife wird dann ausgeführt, bis derselbe Wert am Ende einer Iteration wieder angezeigt wird. Das ist für uns praktisch: In jeder Iteration berechnen wir einfach den Rest des nächsten potenziellen Divisors und verschieben ihn auf diesen Stapel, mit dem wir die Schleife beginnen. Wenn wir einen Divisor finden, ist der Rest0
und die Schleife stoppt. Wir werden versuchen, Divisoren abn-1
und dann bis zu dekrementieren1
. Das heißt, a) wir wissen, dass dies endet, wenn wir erreichen1
spätestens dann und b) können wir feststellen, ob es sich bei der Zahl um eine Primzahl handelt oder nicht, indem wir den letzten Divisor untersuchen, den wir ausprobiert haben (wenn es sich um1
eine Primzahl handelt, ist es keine).Lasst uns anfangen. Am Anfang gibt es einen kurzen linearen Abschnitt:
Sie wissen, was die meisten dieser Dinge inzwischen tun. Die neuen Befehle sind
-
und!
. Stack Cats hat keine Inkrementierungs- oder Dekrementierungsoperatoren. Es hat jedoch-
(Negation, dh Multiplikation mit-1
) und!
(bitweise NICHT, dh Multiplikation mit-1
und Dekrementierung). Diese können entweder zu einem Inkrement!-
oder einem Dekrement kombiniert werden-!
. Also dekrementieren wir die Kopie vonn
oben auf-1
, machen dann eine weitere Kopie vonn
links auf dem Stapel, holen dann den neuen Testteiler und legen ihn daruntern
. Bei der ersten Iteration erhalten wir also Folgendes:Bei weiteren Iterationen wird der Wert
3
durch den nächsten Testteiler usw. ersetzt (wobei die beiden Kopien vonn
an dieser Stelle immer den gleichen Wert haben).Dies ist die Modulo-Berechnung. Da Schleifen bei positiven Werten enden, besteht die Idee darin, mit
-n
dem Trial-Divisord
zu beginnen und diesen wiederholt hinzuzufügen , bis ein positiver Wert erhalten wird. Sobald wir dies tun, subtrahieren wir das Ergebnis vond
und dies gibt uns den Rest. Das Knifflige dabei ist, dass wir nicht einfach einen-n
auf den Stapel legen und eine Schleife starten können, die sich addiertd
: Wenn der obere Teil des Stapels negativ ist, wird die Schleife nicht betreten. Dies sind die Einschränkungen einer umkehrbaren Programmiersprache.Um dieses Problem zu umgehen, beginnen wir
n
oben auf dem Stapel, negieren es jedoch nur bei der ersten Iteration. Das klingt wieder einfacher, als es sich herausstellt ...Wenn die Oberseite des Stapels positiv ist (dh nur bei der ersten Iteration), negieren wir sie mit
-
. Dies können wir jedoch nicht einfach tun,(-)
da wir dann die Schleife erst verlassen würden, wenn sie-
zweimal angewendet wurde. Wir verschieben also eine Zelle nach links,<
weil wir wissen, dass es dort einen positiven Wert gibt1
. Okay, jetzt haben wirn
die erste Iteration verlässlich negiert . Aber wir haben ein neues Problem: Der Bandkopf befindet sich jetzt bei der ersten Iteration an einer anderen Position als bei jeder anderen. Wir müssen dies konsolidieren, bevor wir weitermachen. Der nächste<
bewegt den Bandkopf nach links. Die Situation bei der ersten Iteration:Und in der zweiten Iteration (denken Sie daran, wir haben
d
einmal in-n
jetzt hinzugefügt ):Die nächste Bedingung führt diese Pfade erneut zusammen:
Bei der ersten Iteration zeigt der Bandkopf auf eine Null, sodass diese vollständig übersprungen wird. Bei weiteren Iterationen zeigt der Bandkopf jedoch auf eine Eins. Führen Sie dies also aus, bewegen Sie sich nach links und erhöhen Sie die Zelle dort. Da wir wissen, dass die Zelle bei Null beginnt, ist sie jetzt immer positiv, sodass wir die Schleife verlassen können. Dies stellt sicher, dass wir immer zwei Stapel vom Hauptstapel übrig haben und jetzt mit zurückgehen können
>>
. Dann machen wir am Ende der Modulo-Schleife-_
. Du weißt es schon-
._
ist Subtraktion , was^
zu XOR ist: Wenn die Oberseite des Stapels ista
und der Wert darunter istb
es ersetzta
mitb-a
. Da wir zuerst negierta
jedoch-_
ersetzta
mitb+a
, wodurch das Hinzufügend
in unsere laufende Summe.Nachdem die Schleife beendet ist (wir haben einen positiven Wert erreicht), sieht das Band folgendermaßen aus:
Der am weitesten links stehende Wert kann eine beliebige positive Zahl sein. In der Tat ist es die Anzahl der Iterationen minus eins. Es gibt jetzt noch ein kurzes lineares Bit:
Wie ich bereits sagte, müssen wir das Ergebnis von subtrahieren
d
, um den tatsächlichen Rest (3-2 = 1 = 4 % 3
) zu erhalten, also machen wir es einfach noch_
einmal. Als nächstes müssen wir den Stapel bereinigen, den wir links erhöht haben: Wenn wir den nächsten Divisor versuchen, muss er wieder Null sein, damit die erste Iteration funktioniert. Also bewegen wir uns dorthin und schieben diesen positiven Wert mit auf den anderen Hilfsstapel<<]
und bewegen uns dann mit einem anderen auf unseren operativen Stapel zurück>
. Wir ziehend
mit:
und schieben es zurück auf das-1
mit]
und dann bewegen wir den Rest auf unseren bedingten Stapel mit<]]
. Das ist das Ende der Testteilungsschleife: Dies wird fortgesetzt, bis wir einen Rest von Null erhalten. In diesem Fall enthält der Stapel auf der linken Seiten
der größte Teiler (außern
).Nachdem die Schleife beendet ist, müssen
*<
wir die Pfade erst wieder mit der Eingabe verbinden1
. Das*
verwandelt die Null einfach in eine1
, die wir gleich brauchen, und dann bewegen wir uns zum Divisor mit<
(so dass wir uns auf dem gleichen Stapel wie für die Eingabe befinden1
).An dieser Stelle hilft es, drei verschiedene Arten von Eingaben zu vergleichen. Erstens, der Sonderfall,
n = 1
in dem wir nichts von diesem Teilprozess gemacht haben:Dann ist unser vorheriges Beispiel
n = 4
eine zusammengesetzte Zahl:Und schließlich
n = 3
eine Primzahl:Für Primzahlen haben wir also einen
1
auf diesem Stapel, und für zusammengesetzte Zahlen haben wir entweder eine0
oder eine positive Zahl größer als2
. Wir machen aus dieser Situation das0
oder das, was1
wir brauchen, mit dem folgenden abschließenden Code:]
schiebt diesen Wert einfach nach rechts. Dann*
verwendet die bedingte Situation stark zu vereinfachen: durch das niedrigstwertige Bit Makeln, wir drehen1
(prime) in0
,0
(Composite) in den positiven Wert1
, und alle anderen positiven Werte bleiben nach wie vor positiv. Jetzt müssen wir nur noch zwischen0
positiv und positiv unterscheiden. Dort setzen wir einen anderen ein(:)
. Wenn die Spitze des Stapels ist0
(und die Eingabe eine Primzahl war), wird dies einfach übersprungen. Aber wenn die Spitze des Stapels positiv ist (und die Eingabe eine zusammengesetzte Zahl war), wird sie durch die vertauscht1
, so dass wir nun0
für zusammengesetzte und haben1
für Primzahlen - nur zwei unterschiedliche Werte. Natürlich sind sie das Gegenteil von dem, was wir ausgeben wollen, aber das kann leicht mit einem anderen behoben werden*
.Jetzt müssen wir nur noch das von unserem umgebenden Framework erwartete Stapelmuster wiederherstellen: Bandkopf auf einen positiven Wert, Ergebnis oben rechts
-1
auf dem Stapel und ein einzelnes auf dem Stapel rechts davon . Dafür ist=<*
.=
tauscht die Oberseiten der beiden benachbarten Stapel aus und verschiebt dabei den-1
nach rechts vom Ergebnis, z. B. für die4
erneute Eingabe :Dann bewegen wir uns einfach nach links
<
und machen aus dieser Null eine Eins mit*
. Und das ist das.Wenn Sie mehr über die Funktionsweise des Programms erfahren möchten, können Sie die Debug-Optionen verwenden. Fügen Sie entweder das
-d
Flag hinzu und fügen"
Sie es an einer beliebigen Stelle ein, an der Sie den aktuellen Speicherstatus anzeigen möchten, z. B. so , oder verwenden Sie das-D
Flag , um eine vollständige Ablaufverfolgung des gesamten Programms abzurufen . Alternativ können Sie Timwis EsotericIDE verwenden, das einen Stack Cats-Interpreter mit einem schrittweisen Debugger enthält.quelle
>:^]
sollte das offizielle Stack Cats-Logo seinHaskell, 54 Bytes
Es gibt nicht viel zu erklären.
quelle
main=do n<-readLn;print$n>1&&mod(product[1..n-1]+1)n<1
main=do n<-readLn;print$mod(product[1..n-1]^2)n>0
ist 49 Bytes.Ruby, 15 + 8 = 23 Bytes
Probelauf:
quelle
JavaScript,
3936 BytesDank ETHproductions 3 Bytes gespart:
Zeigt true für eine Primzahl an, andernfalls false.
Die for- Schleife testet jede Zahl i von n-1 bis i ein Divisor ist. Wenn der erste gefundene Divisor 1 ist, ist es eine Primzahl.
Vorherige Lösung (39 Bytes):
Wie blieb ein nicht benötigter Test:
Ich habe nur die 39-Byte-Lösung gepostet, da die beste JavaScript-Antwort bereits 40 Byte war.
quelle
&&i
macht eigentlich nichts in diesem Programm, also können Sie es entfernen.n>1
die endgültige Bedingung jedoch ergänzen , wenn du nicht primer sein willst1
.1
die for-Schleife ist, wird sien%--i
einmal ausgeführt: Gibt die Schleife1%0
zurückNaN
und stoppt sie. Wann gerufenalert
wirdi
ist schon gleich0
so1==i
kehrt zurückfalse
.Schnecken, 122
Die Eingabe sollte in unary erfolgen. Bei den Ziffern kann es sich um beliebige Zeichenmischungen handeln, mit Ausnahme von Zeilenumbrüchen.
In dieser 2D-Pattern-Matching-Sprache besteht der Programmstatus ausschließlich aus der aktuellen Rasterposition, der Menge der übereinstimmenden Zellen und der Position im Pattern-Code. Es ist auch illegal, auf ein gleiches Feld zu fahren. Es ist schwierig, aber es ist möglich, Informationen zu speichern und abzurufen. Die Einschränkung, in eine übereinstimmende Zelle zu gelangen, kann durch Backtracking, Teleporting (
t
) und Assertions (=
,!
) überwunden werden , die das Gitter nach dem Abschluss unverändert lassen.Die Faktorisierung für eine ungerade zusammengesetzte Zahl beginnt mit der Markierung eines Satzes nicht benachbarter Zellen (blau im Diagramm). Anschließend überprüft das Programm anhand jeder gelben Zelle, ob sich auf beiden Seiten der benachbarten blauen Zelle eine gleiche Anzahl von nicht blauen Zellen befindet, indem es zwischen den beiden Seiten hin und her fährt. Das Diagramm zeigt dieses Muster für eine der vier gelben Zellen, die überprüft werden müssen.
Kommentierter Code:
quelle
C 67 Bytes
Druck
!1
(a Falsey Wert, von Peter Taylor Definition )0
, wenn(n-1)!^2 == 0 (mod n)
und1
sonst.BEARBEITEN : Nach einigen Diskussionen im Chat,
puts("!1"+p%n)
scheint ein bisschen betrogen zu werden, also habe ich es ersetzt. Das Ergebnis ist ein Byte länger.BEARBEITEN : Bei großen Eingaben behoben.
Kürzere Lösungen
56 Bytes : Wie in den Kommentaren von pawel.boczarski empfohlen, könnte ich die Eingabe unärgerlich machen, indem ich die Anzahl der Befehlszeilenargumente lese:
Aufrufen des Programms wie
51 Bytes : Wenn Sie die "Ausgabe" über Returncodes erlauben:
quelle
puts("!1"+p%n)
Wie könnten Sie jemalsa+b
fürchar*
Werte tun ?"!1"
an der Adresse beginnta
,a+1
finden Sie die Zeichenfolge an"1"
.strcat(const char*,const char*)
.)p=p*i*i%n
zup*=i*i%n
Python 3, 59 Bytes
Verwendet jetzt
input()
anstelle von Befehlszeilenargumenten. Vielen Dank an @Beta Decayquelle
input()
wäre viel kürzern=m=int(input())
,print(all(n%m for m in range(2,n)))
n%i<1
stattdessen.APL,
4013 BytesVersuchsteilung mit dem gleichen Algorithmus wie meine R-Antwort . Wir ordnen
x
die Eingabe von STDIN (⎕
) zu und erhalten den Rest fürx
geteilt durch jede ganze Zahl von 1 bisx
. Jeder Rest wird mit 0 verglichen, was uns einen Vektor aus Einsen und Nullen gibt, der angibt, welche ganzen Zahlen sich teilenx
. Dies wird mit+/
der Anzahl der Teiler summiert . Wenn diese Zahl genau 2 ist, bedeutet dies, dass die einzigen Teiler 1 undx
und somitx
Primzahl sind.quelle
Python 2, 44
Wie die Python-Antwort von Sp3000 , vermeidet jedoch das Speichern der Eingabe, indem die Variable
n
vom1
bis zum Eingabewert hochgezählt wird.quelle
Metaprogrammierung von C ++ - Vorlagen.
166131119 Bytes.Code wird kompiliert, wenn die Konstante eine Primzahl ist, und wird nicht kompiliert, wenn composite oder 1.
(Alle Zeilenumbrüche außer dem letzten werden in der "echten" Version entfernt).
Ich nehme an, "Fehler beim Kompilieren" ist ein falscher Rückgabewert für eine Metaprogrammiersprache. Beachten Sie, dass es nicht als vollständiges C ++ - Programm verknüpft wird (wenn Sie es also als Primzahl angeben, werden Verknüpfungsfehler angezeigt).
Der zu testende Wert ist die Ganzzahl in der letzten "Zeile".
Live-Beispiel .
quelle