Bei einer gegebenen Eingang ganzer Zahl n
, eine Anzahl Schlange zeichnen, die ein Gitter ist die Messung des n x n
aus den Zahlen 1
durch , n^2
die um miteinander in der folgenden Art und Weise gewickelt sind:
Eingabe n = 3
:
7 8 9
6 1 2
5 4 3
Eingabe n = 4
:
7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13
Eingabe n = 5
:
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
(Inspiriert von diesem Problem von Project Euler.)
Das ist Code-Golf , die kürzeste Antwort in Bytes gewinnt!
4
:? Oder eine gerade Zahl.Antworten:
MATL , 3 Bytes
Probieren Sie es online!
Erläuterung
Eingebaut ... ¯ \ _ (ツ) _ / ¯
quelle
C #
203202196193178 BytesDank @StefanDelport ein Byte gespeichert.
22 Bytes dank @FelipeNardiBatista gespeichert.
Dies funktioniert anhand der folgenden Beobachtung, wie die Quadrate aufgebaut sind:
Wie Sie sehen, wird jedes Bit zum vorherigen Quadrat hinzugefügt. Bei geraden Zahlen gehen wir nach rechts, wo wir waren, runter, bis einer niedriger als der Platz war und dann bis zum Ende. Ungerade Zahlen sind im Wesentlichen das Gegenteil, wir gehen nach links, bis eine über der aktuellen Höhe und dann bis zum Ende.
Voll / Formatierte Version:
quelle
++i<=n;
kann werdenn>++i
, nichts anderes kann ich sehen, +1.n%2<1?2:1
zu2-x%2
? Ich habe es nicht in C # getestet, aber in C und Python hat es funktioniert.for(int o=n-2+n%2>>1,i=r[o,o]=1,c=2,w=o,h=o,j;n>i++;){var b=i%2<1; ....
ein bisschen Golf gespieltvar b=1-2*(i%2);r[h,w+=b]=c++;for(j=0;j<i-1;++j)r[h+=b,w]=c++;for(j=0;j<i-1;++j)r[h,w-=b]=c++;
Dyalog APL,
70564541 BytesProbieren Sie es online!
Wie?
berechnet die Differenzen zwischen den Indizes;
1
und¯1
für rechts und links¯⍵
und⍵
für oben und unten.1,⊢,¯1,-
Kommt als1 ⍵ ¯1 ¯⍵
,+⍨⍴
streckt dieses Array auf die Länge von⍵×2
, so dass das Finale2/⍳
jedes von ihnen wiederholen kann, wobei die Anzahl der Wiederholungen mit jedem zweiten Element zunimmt:dann,
stellt das obere linke Element der Spirale voran,
begrenzen Sie die ersten ⍵ 2 Elemente dieser Abstandsliste,
führt kumulative Summe,
sortiert die Indizes (
⍵[i] = ⍵[⍵[i]]
), um die ursprüngliche Matrix mit den Indizes jedes Elements zu übersetzen, und schließlichFormen als
⍵×⍵
Matrix.quelle
C,
321307295284283282 BytesVielen Dank an @Zachary T und @Jonathan Frech für das Golfen eines Bytes!
Weist ein zweidimensionales Array von Nullen zu und füllt es dann von einer Stelle in der Mitte aus. Zuletzt werden die Werte gedruckt, die größer als Null, aber kleiner oder gleich dem Quadrat der Eingabe sind.
Probieren Sie es online!
Formatiert:
quelle
i,j,k,a,b,m;f(n){n*=n;int**l=calloc(a=m=3*n,4);
miti,j,k,a,b,m,**l;f(n){n*=n;l=calloc(a=m=3*n,4);
einem Byte speichern?k<=n;
mitn>k;
zu speichern ein Byte.PHP , 192 Bytes
Probieren Sie es online!
Auf die gleiche Weise wird eine Zeichenfolge anstelle eines Arrays erstellt
PHP , 217 Bytes
Probieren Sie es online!
quelle
[-1,1][$d&1]
->$d&1?:-1
for(;$k<$a;print join($o)."\n")ksort($o=&$e[+$k++]);
. Und noch eines:"%$l".d
. Und noch eins:$x*$l*$a+$y*$l
->($x*$a+$y)*$l
.$s
auf einen gepolsterten Unterstrich (oder Buchstaben oder Ziffern) initialisieren können ; Dieses Zeichen wird überschrieben..d
in Ihrem eigenen Ansatz verwenden, um 2 Bytes zu sparenPHP,
185 176174 BytesLaufen Sie als Pipe mit
-nR
oder testen Sie es online .Nervenzusammenbruch
quelle
APL (Dyalog Classic) ,
32 bis29 ByteProbieren Sie es online!
Verwendet
⎕io←1
. Beginnt mit einer 0-mal-1-Matrix (⍪⍬
). 2N times (⍣2⍣⍵
) fügt die Höhe der Matrix (≢⍵
) zu jedem ihrer Elemente hinzu, setzt sie1 2...height
rechts (,⌸
) und dreht (⌽⍉
). Wenn dies abgeschlossen ist, korrigiert die Ausrichtung des Ergebnisses (⊖∘⌽⍣⍵⌽
) und kehrt die Zahlen um, indem sie von N 2 +1 (1+×⍨-
) subtrahiert werden .quelle
Mathematica, 177 Bytes
quelle
C ++,
245228 BytesProbieren Sie es online!
Die Funktion berechnet und druckt den Wert jeder Zahl der Matrix abhängig von ihrer x-, y- Position, indem sie diese Logik anwendet:
Formatierte Version :
quelle
Python 3 ,
249247 BytesIch initialisiere ein 2D-Array und finde den Startpunkt, der der Mittelpunkt für ungerades n oder der Versatz (-1, -1) für gerades n ist, skaliere dann das Füll- / Cursormuster mit der aktuellen "Ring" -Nummer. Ich habe das Gefühl, dass mir ein Trick für die Interpretation der Anweisungen fehlt, aber ich habe mir nichts Billigeres ausgedacht.
Probieren Sie es online!
-2 danke an Zachary T!
quelle
\t
und\n
als 1 Byte und immer noch 249 Byteslen("def f(n): M=[n*[0]for a in range(n)] x=y=n//2-(n%2<1) M[x][y]=i=s=1 while 1: t=s*2 for d in'R'+'D'*(t-1)+'L'*t+'U'*t+'R'*t: if i==n*n:print(*M,sep='\n');return v=[1,-1][d in'LU'] if d in'UD':x+=v else:y+=v M[x][y]=i=i+1 s+=1") 223
Wolfram-Sprache (Mathematica) ,
(...)83 BytesIn UTF8 gemessene Bytes
\[LeftFloor]
(⌊
) und\[RightFloor]
(⌋
) kosten jeweils 3 Bytes. Mathematica hat keinen speziellen Byte-Zeichensatz.Probieren Sie es online!
Verwendet das geschlossene Formular für jeden der 4 Fälle und verwendet dann das Maximum, um das gewünschte Ergebnis zu erzielen.
Gibt ein 2D-Array von Ganzzahlen zurück. Ich bin nicht sicher, ob dies zulässig ist, und obwohl dies in den Kommentaren angefragt wurde , antwortete das OP nicht.
quelle
Clojure, 206 Bytes
Ich denke, dies ist ein anständiger Anfang, baut das Board nacheinander zu einer Hash-Map auf und partitioniert es dann in
n x n
Listen. Dasdefmacro
endete ziemlich lang, aber der Code ist immer noch kürzer als ohne. Gibt es eine genauere Syntax, um dies zu beschreiben?Eine große Anzahl von Bytes berechnet den Startpunkt und erstellt die Nachschlagelogik für die nächste Geschwindigkeit
v
. Vielleicht wäre ein verschachteltesvec
besser, aber dann haben Sie zwei Indizes und Geschwindigkeiten, die Sie im Auge behalten müssen.quelle
J , 41 Bytes
Probieren Sie es online!
Entspricht der APL-Übermittlung von ngn , beginnt jedoch mit einer 1-zu-1-Matrix und wird 2 × N-2-mal wiederholt.
quelle
Python 165 (oder 144)
Dadurch wird ein numpy-Array erstellt, dann gedreht und eine Seite hinzugefügt, bis die richtige Größe erreicht ist. In der Frage wurde nicht angegeben, ob derselbe Startpunkt für gerade und ungerade Zahlen verwendet werden muss. Ist dies nicht der Fall,
if n%2==0:a=r(r(a))
kann die Zeile entfernt werden, wodurch 21 Byte gespart werden.quelle
J , 41 Bytes
Standardformatierung
Dieser Ansatz basiert auf At Play With J Volutes (Uriels APL verwendet eine ähnliche Technik).
Es ist unerwartet und elegant genug, um eine zweite Antwort zu rechtfertigen, dachte ich.
Grundsätzlich machen wir nichts Prozedurales oder gar Geometrisches. Stattdessen erstellen wir arithmetisch eine einfache Sequenz, die beim Aufsummieren und Skalieren die richtige Reihenfolge der spiralförmigen Zahl von links nach rechts von oben nach unten angibt. Wir formen das dann zu einer Matrix und sind fertig.
Ich werde eine detailliertere Erklärung hinzufügen, wenn es die Zeit erlaubt, aber der verlinkte Artikel erklärt es ausführlich.
Probieren Sie es online!
quelle
Python 3 (ohne Stapel) ,
192188179150 BytesProbieren Sie es online!
4 Bytes gespart, da eine 90-Grad-Phasendrehung ohne komplexe Zahlen problemlos möglich ist
quelle
R , 183 Bytes
Probieren Sie es online!
Die Ausgabe ist eine Matrixschlange (oder eine Schlangenmatrix, was auch immer). Es ist wahrscheinlich nicht die effizienteste Methode, und es könnte wahrscheinlich Golf gespielt werden, aber ich dachte, es wäre es wert, gezeigt zu werden. Darauf bin ich eigentlich ziemlich stolz!
Die Methode erstellt die Matrix von innen nach außen und fügt vor dem Anhängen immer eine zusätzliche Anzahl von Ganzzahlen hinzu, die der Anzahl der Spalten in der Matrix entspricht. Das folgende Muster ist entweder spalten- oder zeilengebunden, wobei einige Werte umgekehrt werden, sodass sie in der richtigen Reihenfolge angehängt werden.
193 Bytes
Exakt gleiche wie oben, aber endgültig
b
heißtProbieren Sie es online!
Das gibt eine etwas sauberere Ausgabe, aber ich habe keine speziellen Kriterien für die Ausgabe gesehen, daher sollte die erste Antwort funktionieren, wenn ich mich nicht irre.
quelle