Schreiben Sie ein Programm, das den Benutzer auffordert, eine gerade Ganzzahl größer als 2 einzugeben.
Ausgehend von Goldbachs Vermutung, dass jede gerade Zahl größer als 2 als Summe zweier Primzahlen ausgedrückt werden kann, werden zwei Primzahlen ausgedruckt, die zusammen die angeforderte gerade Zahl ergeben. Bearbeiten: Das Programm muss nur ein Paar Primzahlen drucken, nicht alle. Beispielsweise:
4: 2 + 2
6: 3 + 3
8: 3 + 5
10: 5 + 5 oder 3 + 7
Antworten:
APL, 34 oder 44 Bytes
Die erste Version hat eine Länge von 34 Symbolen und ist auf Zeichen aus den ursprünglichen Einzelbyte-APL-Zeichensätzen beschränkt, wie sie in Dyalog APL noch unterstützt werden:
Erläuterung:
Die zweite Version ist nur 22 Zeichen lang, da sie die
π
Funktion zur Prüfung auf Primzahlen ausnutzt. Diese Funktion ist jedoch nur in NARS2000 verfügbar , das Unicode verwendet. Daher beträgt die Bytezahl in UCS-2 44 :Erläuterung:
Beispiele
(⎕: ist die Eingabeaufforderung, die nach einer Nummer fragt)
quelle
¯2π⍳2πn
als Hauptgenerator arbeiten?π
Betreiber genau?π
Schalter mit⍺
:¯2πx
Berechnet die x-te Primzahl,¯1πx
ist die erste Primzahl kleiner als x,0πx
testet x auf Primalität,1πx
ist die erste Primzahl größer als x,2πx
ist die Anzahl der Primzahlen kleiner als x,10πx
ist die Anzahl der Teiler von x,11πx
ist die Summe aller Teiler von x12πx
und13πx
sind die Möbius- bzw. die Totientenfunktion. Last but not leastπx
liefert die Monade die Primfaktorisierung von x.Python 2,
7571 BytesTeste es auf Ideone .
Wie es funktioniert
Wir verwenden eine Folgerung aus dem Satz von Wilson :
Zu jeder Zeit ist die Variable m gleich dem Quadrat der Fakultät von k - 1 ; k beginnt bei Wert 1 und m bei Wert 0! ² = 1 . Die Menge p besteht aus 0 und allen Primzahlen bis zum aktuellen Wert von k .
In jeder Iteration prüfen wir zuerst, ob sowohl n - k als auch k zu p gehören. Dies gilt nur dann, wenn die eingestellte Differenz von {nk, k} und p leer ist. Ist dies der Fall, ist die Bedingung falsch und die Schleife wird fortgesetzt.
Beachten Sie, dass k> 0 und {n - k, k} die Bedingung für einen positiven Wert von n - k erfüllen (unter der Annahme, dass Goldbachs Vermutung wahr ist), sodass die 0 in p nicht zu falsch positiven Ergebnissen führt.
In der Schleife aktualisieren wir k und m . Der neue Wert von m ist m × k² = (k - 1)! ² × k² = k! ² , und der neue Wert von k ist k + 1 , so dass m = (k - 1)! ² immer noch vorher und nachher gilt das Update.
Dann führen wir eine Mengenvereinigung durch, um den Wert von m% k × k zu p zu addieren . In der Folge von Wilsons Theorem addiert sich 1 × k = k, wenn k prim ist, und 0 × k = 0, wenn nicht.
Wenn die Schleife endet, drucken wir die letzten Werte von n - k und k , die Primzahlen mit der Summe n sind .
quelle
Ruby 2.0 (65)
quelle
PHP - 73 Bytes
Die Eingabe wird als Befehlszeilenargument verwendet.
Beispielnutzung:
quelle
GolfScript
413332Akzeptiert Befehlszeilenargumente, z
Findet alle relevanten Partitionen der Eingabenummer mit:
und findet dann die erste Partition, in der keine Zahlen NICHT mit Primzahlen versehen sind:
wo der zusammengesetzte Prüfblock
np
ist:Dieser Block filtert nach allen Zahlen, die eine bestimmte Zahl gleichmäßig teilen. Wenn es keine solchen Zahlen gibt (die Zahl ist also eine Primzahl), lautet das Ergebnis
[]
, was in GolfScript falsch ist.quelle
Perl 6: 69
quelle
R,
17011283 ZeichenEingerückt:
Verwendung:
Alte Lösung mit 112 Zeichen für die Nachwelt
Eingerückt:
quelle
Python - 107
Grundsätzlich eine Verbesserung gegenüber dem zweiten Teil der Antwort von Nutria (ich habe dies auf 2.7 ausgeführt, aber ich denke, es sollte auch für 3.x funktionieren)
quelle
:
obligatorisch?JavaScript (ES6) (Regex), 105
Jetzt haben Sie einen regulären Ausdruck, der die Goldbach-Vermutung testet, bei der nur geringe Anforderungen an spezielle Funktionen (grundlegende Rückverweisunterstützung, positive und negative Vorausschau) gestellt werden.
Dies verwendet
String.prototype.repeat()
, was Teil des EcmaScript 6th Edition-Vorschlags ist. Derzeit funktioniert dieser Code nur in Firefox.Ich brauche wirklich eine bessere Sprache, die bei der Arbeit mit Regex ein knappes Kommando hat ...
quelle
Scala,
286192172148 ZeichenNicht das schnellste aber es funktioniert. Rufen Sie g (10) auf, um die Liste der Goldbach-Paare für 10 zu erhalten.
Die Konvertierung nach C ++ ist unkompliziert.
quelle
C -
139129 Zeichenquelle
int
Deklarationen in Ihrer Funktion entferneni
. Sie können weitere 2 Zeichen speichern, indem Sie das entfernenif
und ein weiteres doppeltes kaufmännisches Und hinzufügen:i(b,2)&&i(a-b,2)&&printf(...)
&&
. (Ich werde mich nie daran gewöhnen, Stummschalten zu argumentieren ...)newLISP -
169148 ZeichenEnthält den Code zum Ausführen. Die Ergebnisse sind zu großzügig ...
quelle
Salbei, 60
In Punktzahl und Spielgefühl ähnlich wie bei res , aber ich denke, es ist anders genug, um etwas zu posten.
quelle
Salbei ,
6562goldbach.sage
Führen Sie die obige Datei aus , während Sage in einem Terminal ausgeführt wird:Vielen Dank an @boothby für die
p=is_prime
Idee.quelle
p=is_prime
.Haskell, 97C
Erläuterung:
g
ist die "Goldbach" -Funktion. Wenng n
Sie anrufen, erhalten Sie die beiden Primzahlen, die sich summierenn
.p
ist eine Funktion, die eine Liste von Primzahlen erzeugt, die kleiner sind alsn
.c
ist die zur Definition verwendete Prim-Checker-Funktionp
.Beispiel läuft:
quelle
Mathematica 56
Dies gibt alle Lösungen für die Eingabe-Ganzzahl zurück.
Zum Beispiel, wenn 1298 eingegeben wird ...
Wie geschrieben, wird jede Lösung zweimal zurückgegeben.
quelle
Julia, 62 Zeichen (85 mit Prompt)
quelle
g(int(readline(STDIN)))
GTB , 31
Für Ihren TI-84 Rechner
Keine erstklassigen Einbauten.
Beispiel läuft
quelle
JavaScript,
139137136quelle
return;
stattreturn 0;
Python 3 -
150143 ZeichenAlte Version (150 Zeichen):
Neue Version (dank ProgramFOX):
Es wird jede Kombination gedruckt, zum Beispiel:
4 2 + 2
10 7 + 3 5 + 5 3 + 7
quelle
|
kann sicher mit boolean - Typ verwendet werden, so(a+b!=n)|p(a)|p(b)
print([(a,b)for b in range(2,n)for a in range(2,n)if not((a+b!=n)|p(a)|p(b))])
(druckt eine Liste von Tupeln, deren Summe n ist). Spart 8 Bytes.r=range(2,n)
und Referenzierenr
spart ein paar mehr.q [116 Zeichen]
Keine eingebaute Funktion zum Finden der Primzahl.
Eingang
Ausgabe
quelle
Python - 206
Ein bisschen zu spät zur Party, aber ich übe meine Golffähigkeiten.
Ich habe das tatsächlich codiert, bevor ich diese Frage gefunden habe! Meine enthält also nicht das schöne Lambda, das die anderen Python-Lösungen verwenden.
quelle
J -
3532 char"Prompt the user" ist der Fluch eines jeden J-Golfers. Da gehen alle meine hart verdienten Charaktere!
Erklärt:
".1!:1]1
- Lesen Sie einen String (1!:1
) aus der Eingabe (Dateizugriff1
) ein und konvertieren Sie ihn in eine Zahl (".
).p:i.n=:
- Weisen Sie der Variablen diese Nummer zun
und nehmen Sie dann die erstenn
Primzahlen.+/~
- Stellen Sie einenn
breiten undn
hohen Beistelltisch auf.i.&n,
- Verwandeln Sie die Tabelle in eine einzelne Liste und suchen Sie dann den Index des ersten Auftretens vonn
, der existiert, wenn Goldbachs Vermutung wahr ist.p:(n,n)#:
- Rufen Sie die Zeile und die Spalte aus dem Index ab und nehmen Sie die entsprechenden Primzahlen.Verwendung:
Wäre die Eingabeaufforderung nicht erforderlich gewesen, ist hier ein 25-stelliges Verb:
quelle
Gelee , 8 Bytes (nicht konkurrierend)
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Julia,
5049 BytesProbieren Sie es online!
Wenn eine Funktion akzeptabel wäre, könnte der Code auf 32 Byte verkürzt werden :
Wie es funktioniert
~=primes
Erstellt einen Alias für die integrierte Primzahlenfunktion , die eine Liste aller Primzahlen bis zu ihrem Argument zurückgibt.n=ARGS[]|>int
Analysiert das erste Befehlszeilenargument, während es in n gespeichert wird .Um ein geeignetes Primpaar zu finden, berechnen wir zunächst den oben genannten Primbereich mit
~n
. Dannn-~n
ergeben sich alle Differenzen dieser Primzahlen und n .Indem
∩
wir ( ) das Ergebnis mit dem Primbereich selbst schneiden , stellen wir sicher, dass die verbleibenden Primzahlen p so sind, dass n - p auch eine Primzahl ist.Nimmt schließlich
extrema
die niedrigste und höchste Primzahl im Schnittpunkt, so muss ihre Summe n sein .quelle
SQL,
295284In postgresql:
Sollte aber in der Lage sein, es in der Hälfte des Raums zu tun, wenn es keine Dinge wie "no left outer join in recursion", "no subquery in recursion" gäbe ...
Hier ist die Ausgabe:
quelle
Charge - 266
Ordentlich aufbrechen -
quelle
Perl 5, 58 Bytes
57 plus 1 für
-nE
Eingabe und Ausgabe sind unär. Beispiel:
Hutspitze.
quelle
Oracle SQL 11.2, 202 Bytes
Nicht golfen
quelle
Python 3, 107 Bytes
b (x) ist ein Primalitätstest für x, und g (x) rekursiert durch Zahlen, um zwei passende Primzahlen zu finden.
quelle