Diese Herausforderung ist inspiriert von dieser nun gelöschten Frage.
Nehmen Sie eine positive ganze Zahl N als Eingabe und geben Sie eine Matrix mit den Zahlen 1 .. N 2 aus , die dem folgenden Muster folgt:
Füllen Sie die erste Zeile mit 1 .. N, dann füllen Sie die letzte Zeile (Zeilennummer N ) mit (N + 1) .. 2N , dann füllen Sie die zweite Zeile mit (2N + 1) .. 3N und fahren Sie fort, bis Sie gefüllt haben alle reihen.
Das Ausgabeformat ist flexibel, daher werden Listen usw. akzeptiert.
N = 1
1
N = 2
1 2
3 4
N = 3
1 2 3
7 8 9
4 5 6
N = 4
1 2 3 4
9 10 11 12
13 14 15 16
5 6 7 8
N = 5
1 2 3 4 5
11 12 13 14 15
21 22 23 24 25
16 17 18 19 20
6 7 8 9 10
Es gelten Standardregeln. Die kürzeste Antwort in Bytes in jeder Sprache gewinnt. Erklärungen sind wie immer erwünscht.
code-golf
number
array-manipulation
matrix
Stewie Griffin
quelle
quelle
1 2 3 7 8 9 4 5 6
Ist das Ausgabeformat so flexibel?Antworten:
05AB1E ,
138 Bytes5 Bytes gespart dank Rod
Probieren Sie es online!
Erläuterung
quelle
Ruby , 53 Bytes
Erläuterung:
Fügen Sie zuerst alle Zahlen in ein einzelnes Array ein und schneiden Sie dann das Array, wobei Sie bei jeder Iteration eine Zeile überspringen. Nach den ersten (n / 2 + n% 2) Iterationen ist nichts mehr zu überspringen, und alle verbleibenden Zeilen werden rückwärts abgerufen.
Probieren Sie es online!
quelle
Python 2 , 75 Bytes
Probieren Sie es online!
quelle
JavaScript, 68 Bytes
Bearbeiten Sie 3 Bytes, die von @ user71546 gespeichert wurden
Versuchen Sie zunächstden offensichtlichen Weg zu gehen: Zählen Sie von 1 und füllen Sie das Array von beiden Seiten, von außen nach innenPrüfung
quelle
Haskell , 62 Bytes
Probieren Sie es online! Ausgabe ist eine Liste von Listen, zB
(0#) 3
Erträge[[1,2,3],[7,8,9],[4,5,6]]
.quelle
> <> ,
51 + 3 = 5447 BytesProbieren Sie es online!
Die Eingabe wird beim Programmstart über das
-v
Flag auf dem Stack erwartet . Die Ausgabe besteht aus nicht ausgerichteten Zahlen, die durch einzelne Leerzeichen voneinander getrennt sind. Jede Zeile wird durch eine neue Zeile voneinander getrennt. Beispielausgabe fürN=5
:... gefolgt von einer einzelnen Zeile. Das Programm wird mit einem Fehler (
something smells fishy...
) beendet, aber das steht auf STDERR und nicht auf STDOUT.Erklärung:
In der ersten Zeile wird einfach eine Kopie von
N
im Register gespeichert.In der zweiten Zeile wird der Versatz für jede Ausgabezeile durch Subtrahieren von 1
N
, Multiplizieren mitN
, Drehen auf den Boden des Stapels und anschließendes Umkehren des gesamten Stapels gebildet. Wenn die Zahl oben auf dem Stapel 0 erreicht, sollte der Stapel folgendermaßen aussehen (Beispiel verwendetN=5
):In der dritten Zeile wird das Duplikat
0
oben im Stapel verworfen.Die vierte Zeile erhöht den oberen Bereich des Stapels und gibt eine Kopie davon aus. Dies wird dann mod genommen
N
, und dies wird verwendet, um zu entscheiden, ob ein Leerzeichen oder eine neue Zeile gedruckt werden soll und ob die Oberseite des Stapels verworfen werden soll - wenn die letzte gedruckte Zahl istx
,x mod N == 0
zeigt dies an, dass das Ende dieser Ausgabezeile erreicht wurde . Die Ausführung endet, wenn1+
sie auf einem leeren Stapel ausgeführt wird, wodurch der Beendigungsfehler ausgelöst wird.Vorherige Version
Dies prüfte explizit, ob ein leerer Stapel vorhanden war, um die Ausführung zu beenden, und ich bezog auch 3 Bytes für die
-v
Flag-Verwendung ein.Probieren Sie es online!
quelle
Perl 5 ,
-p
5251 BytesProbieren Sie es online!
quelle
Java (OpenJDK 9) , 101 Byte
Probieren Sie es online!
Credits
quelle
j++
: 102 Bytesn-i/2-1
zun+~i/2
101 Bytesn->{int i=n*n,x[]=new int[i],r;for(;i-->0;x[(r%2<1?r/2:n+~r/2)*n+i%n]=i+1)r=i/n;return x;}
JavaScript (ES6),
69 bis68 ByteNun, es hat sich herausgerissen, bevor ich es posten konnte, aber hier ist es trotzdem.Bearbeiten: 1 Byte dank @KevinCruijssen gespeichert.quelle
n+n-i-1
kannn+n+~i
für -1 Byte sein, so dass Sie mit der anderen JavaScript-Antwort wieder von Kopf bis Fuß sind. :)Gelee , 10 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Stax , 10 Bytes
Führen Sie es online aus und debuggen Sie es
Die entsprechende ASCII-Darstellung desselben Programms umfasst 12 Zeichen.
So funktioniert das.
quelle
Jelly ,
13...6 BytesDanke JonathanAllan für -1 Byte!
Probieren Sie es online!
Verwenden Sie einen identischen Algorithmus wie die 05AB1E-Antwort.
quelle
R
das
der implizite Bereich von left ist.R ,
705947 ByteProbieren Sie es online!
Vielen Dank an Robin Ryder für ein 4-Byte-Golf, das ich dann weiter ausbaute.
Gibt eine Matrix zurück; erstellt die
matrix
in-Sequenz,[[1 2 3] [4 5 6] [7 8 9]]
ordnet dann z. B. die Zeilen neu an.quelle
rbind
.Python 2 ,
726863 Bytes-4 Bytes dank Neil
Probieren Sie es online!
quelle
x
entfernen.Oktave , 102 Bytes
Probieren Sie es online!
quelle
until
Befehl hatte. Und ich wusste nicht übervec2mat
:( Leider die gleiche Länge:A=B=vec2mat(1:(n=input(''))*n,n)
:(while j++<n
ist auch genau gleich lang ... Hast du die verschiedenen Optionen ausprobiert oder sind das nur Zufälle?while
Schleife gleich lang, ich habe es in beide Richtungen versucht. Oftdo ... until
ist jedoch ein Byte kürzer alswhile ... end
.C (gcc) , 110 Bytes
Probieren Sie es online!
Füllt ein Array aus, indem zwischen zwei Indizes für Zeilen gewechselt wird: Ein Index beginnt oben und einer beginnt unten. Der Index der obersten Zeile beginnt bei 0 und wird alle 2 Zeilen erhöht. Der untere Zeilenindex beginnt bei n-1 und wird alle 2 Zeilen dekrementiert.
Ungolfed:
quelle
C ++ + Range V3 , 159 Bytes
Live auf Wandbox
Ohne die 2 Zeilen nach
using namespace range::view
; Sie sind nur dazu da, Importe vom Lambda zu trennen.Leicht interessante Tatsache: Diese Lösung nimmt keine Heap-Zuweisungen vor. Es löst das Problem im
O(1)
Weltraum.Erläuterung:
iota(1, n*n+1)
->[1 ... n*n]
chunk(n)
: allen
Elemente zusammen, so[1 ... n] [n+1 ... 2*n] ...
r
r | stride(2)
: nimm jedes andere Element:[1 ... n] [2*n+1...] ...
r | reverse | drop(n % 2)
: umkehren, dann den[1 ... n]
Begriff fallen lassen, wennn
ungerade ist (es wird eine ungerade Anzahl von Zeilen geben und wir möchten den ersten Begriff nur einmal drucken). Es scheint, als könnte ich das einfach tunr | reverse | take
, aber das funktioniert aus irgendeinem Grund nicht.stride(2)
nimm wieder jedes andere Element. Diesmal ist es umgekehrt.Mehr lesbar und testbar:
quelle
int n
ich für einlog(n)
Bit benötige , um die Eingabe zu speichern? Aber das ist die Eingabe wie auch immer, und wir beschäftigen uns mit ein ,int
wosizeof(int) == 4
( die meisten Systeme), so dass es eine konstante Anzahl von Bytes ist unabhängig vom verwendeten Eingang.Jelly , 11 Bytes
Probieren Sie es online!
quelle
CJam , 22 Bytes
Probieren Sie es online!
quelle
C (gcc)
8078Ich sehe jetzt, dass diese Lösung falsch ist
Probieren Sie es online!
quelle
C (gcc) , 36 + 8 + 61 = 105 Bytes
kompilieren mit
-Dp=printf("%d ",i),i++%n;);puts("")
-Dq=i,n)
Probieren Sie es online!
quelle