Anscheinend ja! In drei einfachen Schritten.
Schritt 1
Sei f ( n ) die Primzahlfunktion (Anzahl der Primzahlen kleiner oder gleich n ).
Definieren der ganzzahlige Sequenz s ( n ) wie folgt. Für jede positive ganze Zahl n ,
- Initiiere t zu n .
- Solange t weder Primzahl noch 1 ist, ersetzen Sie t durch f ( t ) und iterieren Sie.
- Die Anzahl der Iterationen ist s ( n ).
Es ist garantiert, dass der iterative Prozess endet, da f ( n ) < n für alle n .
Betrachten Sie zum Beispiel n = 25. Wir initialisieren t = 25. Da dies weder eine Primzahl noch eine 1 ist, berechnen wir f (25), was 9 ist. Dies wird der neue Wert für t . Dies ist weder eine Primzahl noch eine 1, also fahren wir fort: f (9) ist 4. Wir fahren erneut fort: f (4) ist 2. Da dies eine Primzahl ist, hören wir hier auf. Wir haben 3 Iterationen durchgeführt (von 25 bis 9, dann bis 4, dann bis 2). Somit ist s (25) 3.
Die ersten 40 Terme der Sequenz lauten wie folgt. Die Sequenz ist nicht in OEIS.
0 0 0 1 0 1 0 2 2 2 0 1 0 2 2 2 0 1 0 3 3 3 0 3 3 3 3 3 0 3 0 1 1 1 1 1 0 2 2 2
Schritt 2
Gegeben eine ungerade positive ganze Zahl N , bauen eine N × N - Matrix (Matrix) durch die endliche Sequenz Wicklung s (1), s (2), ..., s ( N 2 ) ein Quadrat nach außen bilden Spirale . Zum Beispiel ist die Spirale bei N = 5
s(21) s(22) s(23) s(24) s(25)
s(20) s(7) s(8) s(9) s(10)
s(19) s(6) s(1) s(2) s(11)
s(18) s(5) s(4) s(3) s(12)
s(17) s(16) s(15) s(14) s(13)
oder durch Ersetzen der Werte
3 3 0 3 3
3 0 2 2 2
0 1 0 0 0
1 0 1 0 1
0 2 2 2 0
Schritt 3
Stellen Sie das N × N-Array als Bild mit einer grauen Farbkarte oder einer anderen Farbkarte nach Ihrem Geschmack dar. Die Karte sollte graduell sein, damit die Reihenfolge der Zahlen einer visuell offensichtlichen Reihenfolge der Farben entspricht. Die folgenden Testfälle zeigen einige Beispiele für Farbkarten.
Die Herausforderung
Erzeugen Sie bei einer ungeraden positiven ganzen Zahl N das oben beschriebene Bild.
Regeln
Die Spirale muss nach außen zeigen, kann jedoch im oder gegen den Uhrzeigersinn verlaufen und sich nach rechts (wie im obigen Beispiel), links, unten oder oben bewegen.
Die Maßstäbe der horizontalen und vertikalen Achse müssen nicht identisch sein. Auch Achsenbeschriftungen, Farbbalken und ähnliche Elemente sind optional. Solange die Spirale gut sichtbar ist, ist das Bild gültig.
Bilder können mit jedem der Standardmittel ausgegeben werden . Insbesondere kann das Bild auf dem Bildschirm angezeigt werden, oder es kann eine Grafikdatei erzeugt werden, oder es kann ein Array von RGB-Werten ausgegeben werden. Wenn Sie eine Datei oder ein Array ausgeben, veröffentlichen Sie bitte ein Beispiel dafür, wie es bei der Anzeige aussieht.
Eingabemittel und Format sind wie gewohnt flexibel . Ein Programm oder eine Funktion kann bereitgestellt werden . Standardlücken sind verboten .
Kürzester Code in Bytes gewinnt.
Testfälle
Die folgenden Bilder (Klicken für volle Auflösung) entsprechen mehrere Werte von N . Eine im Uhrzeigersinn nach rechts gerichtete erste Spirale wird wie im obigen Beispiel verwendet. Die Bilder veranschaulichen auch mehrere gültige Farbkarten.
quelle
s(n)
/ ein Paketimshow
eingegeben werden kann, ohne dass dies geändert wird (ich denke, dass matplotlib dies zum Beispiel handhaben könnte), ist dies eine akzeptable Ausgabeform?imshow
tunimshow
das so ist.Antworten:
Dyalog APL, 94 Bytes
geht davon aus
⎕IO=0
Ausgabe für n = 701 (konvertiert von .pgm nach .png):
quelle
MATLAB -
197185178175184163162148142140 BytesDank Ander und Andras 12 Bytes rasiert, und vielen Dank an Luis für die Zusammenstellung der beiden. Rasiert 16 dank Remco, 6 dank flawr
Ergebnis für
N=301
(F(301)
):Erläuterung:
quelle
Wolfram Language (Mathematica) , 124 Byte
Vielen Dank an Martin Ender für das Speichern von 12 Bytes!
Probieren Sie es online!
Das erzeugte Bild ist:
Geschlossene Formel des Spiralwertes, der direkt aus meiner Antwort entnommen wurde .
quelle
#/2-.5
Speichert ein Byte.p
bis Sie es brauchen:...,{y,p=(1-#)/2,-p},{x,p,-p}
MATLAB:
115114110 BytesEin Liner (ausgeführt in R2016b + als Funktion im Skript ) 115 Bytes
Platzieren Sie die Funktion in einer separaten Datei, wie von flawr vorgeschlagen, und verwenden Sie die Regel 1 zusätzliches Byte pro zusätzlicher Datei
In der Datei
s.m
64 + 1 Byte für Code + DateiBefehlsfenster zu definieren
I
, 45 BytesGesamt: 110 Bytes
Dies verwendet eine Rekursion, anstatt
while
wie die anderen MATLAB-Implementierungen ( gnovice , Adriaan ) eine Schleife auszuführen . Führen Sie es als Skript aus (in R2016b oder neuer), dies definiert die Funktion,I
die ausgeführt werden kannI(n)
.Strukturierte Version:
Beispiel:
Anmerkungen:
Ich habe auch versucht, die
s
Funktion zu anonymisieren, das würde natürlich die Anzahl erheblich reduzieren. Es gibt jedoch zwei Probleme:Eine unendliche Rekursion ist schwer zu vermeiden, wenn anonyme Funktionen verwendet werden, da MATLAB keinen ternären Operator hat, der eine Unterbrechungsbedingung bietet. Ein ternärer Operator (siehe unten) kostet ebenfalls Bytes, da wir die Bedingung zweimal benötigen.
Sie müssen eine anonyme Funktion an sich selbst übergeben, wenn sie rekursiv ist (siehe hier ), wodurch Bytes hinzugefügt werden.
Als nächstes habe ich die folgenden Zeilen verwendet, die möglicherweise geändert werden können, um zu funktionieren:
quelle
MATLAB -
126121 * BytesIch habe einen vektorisierteren Ansatz als Adriaan versucht und konnte mehr Bytes einsparen. Hier ist die einzeilige Lösung:
Und hier ist die schön formatierte Lösung:
* Hinweis: Wenn Sie bereit sind, eine Metrik mit unnötigen Iterationen zuzulassen, können Sie die Zeile
while any(i),
in ändernfor m=v,
und 5 Bytes sparen.quelle
cumsum
zu vektorisieren und zu vermeidennnz(primes(...)
while any(i)
durchfor m=M
. Wen kümmert es, wenn der Code stundenlang ausgeführt wird :-)n^2
oder mehrere Iterationen wehtun werden! ;)Python 3,
299265 Bytes5 Bytes gespart dank Formatierungsvorschlägen von Jonathan Frech und NoOneIsHere. Zusätzliche 34 Byte wurden entfernt, indem eine Funktionsdefinition entfernt wurde, die nur einmal aufgerufen wurde.
Dies ist etwas länger als bei einigen anderen, da Python keinen Befehl zum Bestimmen der Primzahl oder zum Spiralisieren eines Arrays hat. Es läuft jedoch relativ schnell, etwa eine Minute lang
n = 700
.Testen Sie es mit
quelle
import
und entfernen*
.J, 121 Bytes
Definiert eine Funktion:
quelle
R, 231 Bytes
Etwas weniger Golf gespielt:
Anonyme Funktion. Ausgabe in einem Grafikfenster. Die Skala ist auf der roten Skala, wobei der dunkelste Farbton gleich 0 ist und klarere Farbtöne die Werte erhöhen.
Ergebnis für n = 101:
quelle