Als Teil seines Komprimierungsalgorithmus entrollt der JPEG-Standard eine Matrix in einen Vektor entlang von Antidiagonalen mit wechselnder Richtung:
Ihre Aufgabe ist es, eine Matrix (nicht unbedingt ein Quadrat) zu nehmen und sie in abgewickelter Form zurückzugeben. Als Beispiel:
[1 2 3 4
5 6 7 8
9 1 2 3]
sollte nachgeben
[1, 2, 5, 9, 6, 3, 4, 7, 1, 2, 8, 3]
Regeln
Sie können davon ausgehen, dass die Matrixelemente positive ganze Zahlen kleiner als sind 10
.
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Die Eingabematrix kann in jedem geeigneten, eindeutigen, verschachtelten Listen- oder Zeichenfolgenformat oder als flache Liste zusammen mit beiden Matrixdimensionen angegeben werden. (Oder natürlich als Matrixtyp, wenn Ihre Sprache diese hat.)
Der Ausgabevektor kann in jedem geeigneten, eindeutigen, flachen Listen- oder Zeichenkettenformat vorliegen.
Es gelten die Standardregeln für Code-Golf .
Testfälle
[[1]] => [1]
[[1 2] [3 1]] => [1 2 3 1]
[[1 2 3 1]] => [1 2 3 1]
[[1 2 3] [5 6 4] [9 7 8] [1 2 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 3 4] [5 6 7 8] [9 1 2 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 6 3 1 2] [5 9 4 7 8 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 5 9 6 3 4 7 1 2 8 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1] [2] [5] [9] [6] [3] [4] [7] [1] [2] [8] [3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
Verwandte Herausforderungen
- Rekonstruiere eine zickzackförmige Matrix (die etwas schwierigere inverse Transformation)
- Drehen Sie die Antidiagonalen
quelle
Antworten:
J,
3130141211 BytesYch . Zu groß.Nimmt eine Matrix als Eingabe.
Erläuterung
J hat hier einen Vorteil. Es gibt einen Befehl namens oblique (
/.
), der die schrägen Linien der Reihe nach verwendet und ein Verb auf sie anwendet. In diesem Fall verwende ich ein Gerundium, um zwei Verben abwechselnd anzuwenden:<
( box ) und<@|.
( reverse und box). Dann geht es nur noch darum, alles mit;
( raze ) auszupacken .quelle
Pyth,
24232120191817 BytesAlternative 17-Byte-Version:
ssuL_G=!T.T+LaYkQ
Vielen Dank an @FryAmTheEggman für ein Byte, @Jakube für 2 Byte und @isaacg für ein Byte!
Erklärung der "schwarzen Magie", auf die oben
m_W=!Td
angespielt wurde : Kehrt im Wesentlichen jedes andere Subarray um. Dies geschieht durch_W=!T
Zuordnen über jedes Subarray.W
ist eine bedingte Anwendung,_
dh es werden alle Subarrays umgekehrt, bei denen dies=!T
zutrifft.T
ist eine Variable vorinitialisiert auf zehn (wahr) und=!T
bedeutet(T = !T)
. Damit wird der Wert einer Variablen umgeschaltet, die mit der Wahrheit beginnt und den neuen Wert zurückgibt. Dies bedeutet, dass zwischen der Rückkehr von Falschem, Wahrem, Falschem, Wahrem ... gewechselt wird (Dank an Jakube für diese Idee).Testsuite hier .
quelle
Jelly,
2419151311 BytesNimmt die Anzahl der Zeilen, die Anzahl der Spalten und eine flache Liste als separate Befehlszeilenargumente.
Probieren Sie es online!
Wie es funktioniert
quelle
⍁
und vorschlagen⍂
? Oder vielleicht skandinavischø
undǿ
?MATL ,
2827 BytesAngepasst von meiner Antwort hier . Die allgemeine Idee ist, ein 2D-Array mit der gleichen Größe wie die Eingabe zu erstellen, das mit Werten gefüllt ist, die in der gleichen Reihenfolge wie der Zick-Zack-Pfad zunehmen. Dann wird die linearisierte (abgeflachte) Version dieses Arrays sortiert, und die Indizes dieser Sortierung werden beibehalten. Dies sind die Indizes, die auf den Eingang angewendet werden müssen, um den Zick-Zack-Pfad zu erzeugen.
Die Eingabe erfolgt im Formular
Erläuterung
Probieren Sie es online!
quelle
Matlab, 134 Bytes
Ich habe gerade mein Bestes versucht, um meinen Code in Matlab zu verkürzen, als würde ich ihn telegraphieren.
Anmerkungen:
M
ist einem×n
Matrix.a
undb
sind beide Matrizen gleich großM
, so besteht jede Zeilea
aus Zahlen, die ihrer Zeilennummer entsprechen, während jede Spalte vonb
ihrer Spaltennummer entspricht. Somit ista
+b
eine Matrix, deren Element gleich der Summe ihrer Zeilen- und Spaltennummer ist, dhmatrix(p,q)=p+q
.A(p,q)=p+q-1
; undB(p,q)=p-q
.C
wird mathematisch als folgende Gleichung angegeben. Mit der Gleichung kann eine zickzackförmig ansteigende Matrix wie nachstehend gezeigt hergestellt werden.C
gibt die Reihenfolge der Elemente von M in zickzackförmigen Ergebnissen an. Dann wird[~,I]=sort(C(:));
die Bestellung zurückgegeben, das heißtI
, alsoV=V(I)'
das Ergebnis.quelle
JavaScript (SpiderMonkey 30+), 99 Byte
Getestet in Firefox 44. Nimmt Eingaben als 2D-Array auf.
quelle
Python 2, 84 Bytes
Portierung der Antwort von Nimi . Nimmt ein flaches Array mit gegebener Breite und Höhe auf. xsot hat ein Byte gespeichert.
88 Bytes:
Nimmt ein flaches Array mit gegebener Breite und Höhe auf. Sortiert die entsprechenden 2D-Koordinaten
(i/w,i%w)
in Zick-Zack-Reihenfolge nach zunehmender Summe, um Diagonalen zu erhalten, die entweder durch Erhöhen oder Verringern des Zeilenwerts unterbrochen werden, je nachdem, ob die Zeile plus Spalte ungerade oder gerade ist.quelle
Haskell,
797873 BytesDie Eingabe ist eine flache Liste mit der Anzahl der Zeilen und Spalten, zB
( [1,2,6,3,1,2,5,9,4,7,8,3] # 2) 6
->[1,2,5,9,6,3,4,7,1,2,8,3]
.So funktioniert es: Gehen Sie in zwei verschachtelten Schleifen durch die x- und y-Koordinaten der Matrix (
h
Zeilen,w
Spalten):dh von oben / rechts nach unten / links, Überspringen von gebundenen Indizes (
y
undx
muss erfülleny<h
undx-y<w
). Wenn geradex
ist, wird die Reihenfolge der inneren Schleife umgekehrt:y
geht vonx
nach0
. Dazu wähle ich eine Änderungsfunktion für den y-Bereich,[0..x]
der dasx
dritte Element von ist[reverse,id,reverse,id,...]
.Edit: @xnor hat die Schleifen neu angeordnet und 5 Bytes gespeichert. Vielen Dank!
quelle
g=id:reverse:g
.(y-x)*w
kann durch Umsetzung des Problems geschnitten werden:(m#h)w=[m!!(x*w+y-x)|y<-[0..h+w],x<-g!!y$[0..y],x<h,y-x<w] g=reverse:id:g
. Das Übersetzen in Python spart 3 Zeichen mehr als das, was ich hatte.Python 2 + NumPy, 122 Bytes
Ich gebe es zu. Ich habe weitergearbeitet. Leider kann dieselbe Methode nicht einfach geändert werden, um die anderen 2 damit verbundenen Herausforderungen zu lösen ...
Nimmt ein Numpy-Array als Eingabe. Gibt eine Liste aus.
Probieren Sie es online aus
Erläuterung:
Ein Lambda hat die gleiche Länge:
quelle
Python 3,
131118115107 BytesBasierend auf dem gleichen Prinzip wie meine Antwort auf Deusovis Herausforderung
Ich gehe davon aus, dass wir in der Eingabematrix keine Null haben können
Erläuterung
wie es funktioniert :
Ergebnisse
quelle
reverse even line
esreverse odd lines
stattdessen sein?