Ulams Spirale ist ein wirklich faszinierendes und dennoch rätselhaftes Thema in der Mathematik. Wie es im Detail funktioniert, können Sie hier nachlesen , aber eine kurze Zusammenfassung kann so erklärt werden:
Ich schreibe zuerst eine Eins, dann eine Zwei rechts daneben. Über den beiden schreibe ich eine Drei, und links davon schreibe ich vier. Ich setze dieses Muster des Kreisens um 1 (und alle Zahlen zwischen mir und 1) fort und bilde ein spiralförmiges Muster. (siehe Beispiel unten)
Das Ziel
Erstellen Sie ein Programm, das n (immer eine ungerade Zahl größer als Null) als Eingabe akzeptiert , die mit der Anzahl der Zeilen korreliert, und drucken Sie dann die Werte der Primzahlen Zeile für Zeile der Ulam-Spirale aus. Die Formatierung kann beliebig sein, muss jedoch für den Menschen lesbar und offensichtlich sein.
Wenn Sie beispielsweise die Eingabe 3 eingeben, sollte Ihr Programm eine Ausgabe durchführen 5,3,2,7
, da 3 Zeilen die folgende Spirale erzeugen:
5 4 3 <-- first row has the primes 5 and 3
6 1 2 <-- second row has the prime 2
7 8 9 <-- third row has the prime 7
Da dies ein Codegolf ist, gewinnt die Antwort mit den wenigsten Bytes (egal wie ineffizient)! Standardlücken sind nicht akzeptabel.
Antworten:
Pyth, 20 Bytes
Probieren Sie es online aus: Demonstration
Dieser Code generiert die vollständige Ulam-Spirale, verbindet alle Linien und Filter für Primzahlen.
Erläuterung:
quelle
MATLAB, 48
Grundsätzlich wird eine Spirale der erforderlichen Größe erstellt (vom Benutzer angefordert) und dann so angeordnet, dass sie in der richtigen Zeilenreihenfolge angezeigt wird. Dies ist in einem gespeichert. Als nächstes werden alle Werte in a angezeigt, die Primzahlen sind.
Wie Sie bereits gesagt haben, habe ich ein Byte gespeichert und die Standardausgabe von disp () gewählt, nämlich (in Ihrem Testfall n = 3):
Als zusätzlichen Bonus funktioniert dies für jedes n> 0, einschließlich gerader Zahlen. Die Ausgabe für n = 10 lautet beispielsweise:
quelle
spiral
FunktionCJam,
4233 BytesProbieren Sie es online aus
Die neueste Version enthält wesentliche Verbesserungen, die von @Martin vorgeschlagen wurden.
Die Methode zum Aufbau der Spirale besteht darin, in jedem Schritt die bisherige Matrix um 90 Grad zu drehen und eine Zeile mit zusätzlichen Zahlen hinzuzufügen. Dies wird mehrfach wiederholt
(n / 2) * 4
.Die Werte in der resultierenden Matrix werden dann als Primzahlen gefiltert.
Erläuterung:
quelle
2/4*
durch ersetzt werden2*
, oder haben Sie es absichtlich so belassen?(2*
sollte richtig sein.Mathematica 223
Dies entspricht Kubas Code für eine Ulam-Spirale. Deshalb reiche ich es als Community-Wiki ein. Ich habe nur Golf gespielt und die Primzahlen ausgewählt, die in der Zeile aufgelistet sind, in der sie sich befinden.
Beispiel
So verbessern Sie die Anzeige:
quelle
Mathematica, 118 Bytes
Dies erzeugt die Ulam-Spirale in linearer Form, indem bemerkt wird, dass die Position jeder nachfolgenden Zahl als akkumuliert werden kann
dh von der Mitte aus starten, dann 1 nach rechts, 1 nach oben, 2 nach links, 2 nach unten, 3 nach rechts, 3 nach oben, ...
Ausgabe:
quelle
Javascript,
516363304276243240 BytesMeine Lösung erstellt mit der Spirale keine dichte Matrix, sondern gibt den Index zurück, der der angegebenen Zahl in der Ulam-Matrix der angegebenen Reihenfolge entspricht. Es durchläuft also die Zahlen zwischen 2 und M * M und erzeugt ein Array von Primzahlen mit der durch die fn ulamIdx gegebenen idx
Minimiert sieht so aus:
Für Eingang 15 ist der Ausgang:
,,,,,,,,,,,,,,, 197 ,,,, 193, 191 ,,,,,,,,,,,,,,, 139, 137 ,,,,, , 199,, 101 ,,,, 97 ,,,,,,, 181 ,,,,,, 61, 59 ,,, 131 ,,, 103, 37 ,,,,, 31,, 89,, 179,, 149,, 67,, 17 ,,,, 13 ,,,,,,,,,, 5 ,,, 3 ,,, 29 ,,,,, 151 ,,, , 19 ,,, 2,11,, 53,, 127 ,,,, 107, 41,, 7 ,,,,,,,,,,, 71 ,,,, 23 ,,,,,, ,,, 109,, 43 ,,,, 47 ,,,, 83,, 173 ,,,, 73 ,,,,, 79 ,,,,,,,,, 113 ,,,,,,, ,,,,, 157 ,,,,,, 163 ,,,, 167 ,,,, 211 ,,,,,,,,,,, 223
quelle