Bei einem n-dimensionalen orthogonalen (nicht zackigen) Array nicht negativer Ganzzahlen und einer Angabe, welche Dimensionen umgekehrt werden sollen, wird das Array zurückgegeben, jedoch entlang dieser Dimensionen umgekehrt. Die Angabe kann als Boolesche Liste der Länge N oder als Liste einer Teilmenge der ersten N Dimensionen erfolgen, die von 0 oder 1 indexiert sind.
Bitte geben Sie Ihre Eingabeformate an. Code-Erklärungen werden sehr geschätzt.
Durchgelaufenes Beispiel
Wir erhalten das 2-lagige 3-zeilige 4-spaltige 3D-Array
[[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9,10,11,12]],
[[13,14,15,16],
[17,18,19,20],
[21,22,23,24]]]
und einer von
[true,false,true]
(Boolesche Liste)
[0,2]
(0-indizierte Liste)
[1,3]
(1-indizierte Liste)
Wir müssen die Reihenfolge der ersten und letzten Bemaßung umkehren, dh die Ebenen und Elemente der Zeilen (die Spalten), aber nicht die Zeilen jeder Ebene. Zuerst (die tatsächliche Reihenfolge, in der Sie dies tun, spielt keine Rolle) kehren wir die Reihenfolge der Ebenen um:
[[[13,14,15,16],
[17,18,19,20],
[21,22,23,24]],
[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9,10,11,12]]]
und dann kehren wir die Reihenfolge der Elemente jeder Zeile um:
[[[16,15,14,13],
[20,19,18,17],
[24,23,22,21]],
[[ 4, 3, 2, 1],
[ 8, 7, 6, 5],
[12,11,10, 9]]]
Testfälle
[[[1,2,3,4],[5,6,7,8],[9,10,11,12]],[[13,14,15,16],[17,18,19,20],[21,22,23,24]]]
[true,false,true]
/ [0,2]
/ [1,3]
↓
[[[16,15,14,13],[20,19,18,17],[24,23,22,21]],[[4,3,2,1],[8,7,6,5],[12,11,10,9]]]
[[1,2,3],[4,5,6]]
[true,false]
/ [0]
/ [1]
↓
[[4,5,6],[1,2,3]]
[[1],[4]]
[true,false]
/ [0]
/ [1]
↓
[[4],[1]]
[[7]]
[true,true]
/ [0,1]
/ [1,2]
↓
[[7]]
[1,2,3,4,5,6,7]
[true]
/ [0]
/ [1]
↓
[7,6,5,4,3,2,1]
[]
[true]
/ [0]
/ [1]
↓
[]
[[],[]]
[false,false]
/ []
/ []
↓
[[],[]]
[[[[3,1,4,1],[5,9,2,6]],[[5,3,5,8],[9,7,9,3]]],[[[2,3,8,4],[6,2,6,4]],[[3,3,8,3],[2,7,9,5]]]]
[true,false,true,true]
/ [0,2,3]
/ [1,3,4]
↓
[[[[4,6,2,6],[4,8,3,2]],[[5,9,7,2],[3,8,3,3]]],[[[6,2,9,5],[1,4,1,3]],[[3,9,7,9],[8,5,3,5]]]]
[[[[3,1,4,1],[5,9,2,6]],[[5,3,5,8],[9,7,9,3]]],[[[2,3,8,4],[6,2,6,4]],[[3,3,8,3],[2,7,9,5]]]]
[false,true,false,false]
/ [1]
/ [2]
↓
[[[[5,3,5,8],[9,7,9,3]],[[3,1,4,1],[5,9,2,6]]],[[[3,3,8,3],[2,7,9,5]],[[2,3,8,4],[6,2,6,4]]]]
[[[[3,1,4,1],[5,9,2,6]],[[5,3,5,8],[9,7,9,3]]],[[[2,3,8,4],[6,2,6,4]],[[3,3,8,3],[2,7,9,5]]]]
[false,false,false,false]
/ []
/ []
↓
[[[[3,1,4,1],[5,9,2,6]],[[5,3,5,8],[9,7,9,3]]],[[[2,3,8,4],[6,2,6,4]],[[3,3,8,3],[2,7,9,5]]]]
reverse
funktioniert bei beliebigen Arrays, kümmert sich aber nur um die erste Ebene), generische oder rekursive Klassen (Typ- / Objektklassen, abhängig von der Funktion) oder OOP, aber ähnlicher Anwendungsfall). Die beiden letzteren sind in der Regel weitaus ausführlicher.Antworten:
APL (Dyalog) ,
209 BytesProbieren Sie es online!
Wie?
/
- reduct - nimm das am weitesten rechts stehende Element in der Eingabe (das Array) und wende die Funktion mit dem nächsten linken Element als linkes Argument an{⌽[⍺]⍵}
- In der Dimensionleft argument
(⍺
) umkehren⊃
- Beiliegendes Array abflachenquelle
APL (Dyalog Unicode) , 9 Bytes
Probieren Sie es online!
Es sieht so aus, als hätte Uriel zuerst etwas fast Identisches bearbeitet , aber ich habe es unabhängig entwickelt. Ich dachte, dieses Eingabeformat ist ungültig.
quelle
JavaScript (Node.js) ,
58555345 Byte8 Bytes dank @Shaggy gespart
Übernimmt die Eingabe als
(indications)(array)
, wobei die Angabe eine Boolesche Liste ist.Probieren Sie es online!
Kommentiert
quelle
r
inplace ofr||-1
scheint zu funktionieren .f=([r,...b])=>a=>1/r?a.sort(_=>r).map(f(b)):a
funktionieren Auf meinem Handy kann man das also nicht richtig testen.Python 2 ,
5655 BytesProbieren Sie es online!
quelle
Gelee , 8 Bytes
Nimmt eine mit 0 indizierte Liste von Dimensionen auf.
Probieren Sie es online!
Wie es funktioniert
quelle
R ,
807877 BytesErstellen Sie den Aufruf für den Extraktor
[
von R, indem Sie eine Liste von Sequenzen erstellen, die an den angegebenen Stellen umgekehrt sind. Sie enthalten tatsächlich Nullen, die unbemerkt ignoriert werden. Diesdrop=F
wird benötigt, um das standardmäßige Löschen von Dimensionen durch R zu verhindern. Wir benötigen denrev
Aufruf des Dimensionsumkehrindikators, da R Arrays füllt.-2 danke @ Giuseppe
-1 mit Inline-Zuweisung.
Probieren Sie es online!
Lobende Erwähnung an @JayCe, der sich eine Variante ausgedacht hat, die das gleiche Ergebnis in der gleichen Länge erzielt:
Probieren Sie es online!
quelle
do.call
- es ist länger bei 83 Bytes undHaskell,
120119 BytesDie Funktion f nimmt die N-dimensionale Liste und eine Liste von Bool als Eingabe
quelle
F r
.05AB1E ,
231110 BytesProbieren Sie es online aus.
-12 Bytes dank @ Mr.Xcoder .
Eingabe als 0-indizierte Wahrheitswerte (dh
[0,2,3]
), die die erste Eingabe ist.Erläuterung:
Beispiel: Wenn die Eingabe-Liste der Indizes lautet
[0,2,3]
, wird die folgende Zeichenfolge erstellt:Welches wird:
Ursprüngliche 23-Byte-Antwort:
Eingabe als Boolesche Liste (dh
[1,0,1,1]
), die die erste Eingabe ist.Probieren Sie es online aus.
Erläuterung:
Beispiel: Wenn die boolesche Eingabeliste "" lautet
[1,0,1,1]
, wird die folgende Zeichenfolge erstellt:Welches wird:
quelle
'x*
esx
n Mal ohne WAP zu wiederholens
, aber es funktioniert nicht mit'€*
? .. EDIT: Nur im Erbe aber ..€
immer noch als Operator analysiert wird, obwohl es sich um ein Zeichenliteral handelt? Ich bin mir nicht sicher, ob ich ehrlich bin. Verhält sich in der neuen Version*
trotzdem nicht so.JavaScript (Node.js) , 60 Byte
Ein anderer (rekursiver) Ansatz. schlägt Arnauld's Antwort noch nicht ...
Übernimmt die Eingabe als
array, boolean list
quelle
Pyth , 15 Bytes
Probieren Sie es hier aus!
Es ist ärgerlich, dass die Bearbeitung des leeren Dimensionslisten-Falls nicht weniger als 2 Byte dauert ... Ich würde lieber
ss
anstelle vonjk.n
but: | verwenden Angenommen, die zu transformierende Liste kann in nativer Pyth-Syntax als Zeichenfolge angegeben werden. Ich habe einen Konverter in Pyth-Syntax geschrieben , um das Testen zu vereinfachen. In dem unglücklichen Fall, dass das OP dies nicht zulässt, wird es von einem 17-Byte-System "behoben":quelle
Japt ,
15 bis14 BytesMit etwas Inspiration von Arnauld's Lösung .
Nimmt die Angaben als erste Eingabe als boolesches Array von
1
s und0
s.Versuch es
Erläuterung
quelle
Sauber ,
122112 BytesProbieren Sie es online!
Eine Version von Damiens Haskell-Antwort unter Verwendung des Golfspielersystems von Clean. Zeigt wirklich die umfangreichen Ähnlichkeiten zwischen den beiden Sprachen.
Erklärt:
quelle
Ruby , 54 Bytes
Probieren Sie es online!
quelle
(ungetestet, aber ich denke korrekt. Die Compiler-ASM-Ausgabe sieht so aus, wie ich es erwartet habe. Wird aktualisiert, wenn ich Zeit finde, ein Test-Harness zu schreiben, das diese Datenstruktur erstellt und druckt.)
GNU C ++ (portabel) 148 Bytes
GNU C ++ (int = Zeiger und fällt von einer nicht leeren Funktion UB ab) 120 Bytes
Dies ist eine Struktur aus Tiefenzähler, Länge, Array von {Ganzzahlen oder Zeigern}. In der untersten Ebene dieses nicht-binären Baums (
depth==0
) ist das Array vonintptr_t
ein Array von Ganzzahlen. In höheren Ebenen ist es instruct m*
gespeichertintptr_t
. Traversal nimmt eine Besetzung.Die
R()
umgekehrte Funktion ist eine Elementfunktion, da dadurch die Deklaration eines Arguments und eine Mengep->
Syntax für die Referenzierung der Strukturelemente gegenüber dem implizitenthis
Zeiger eingespart werden.Die einzige GNU-Erweiterung ist das flexible C99-Array-Mitglied , das eine Struktur mit variabler Größe erstellt , die in C ++ als GNU-Erweiterung unterstützt wird. Ich hätte ein
*a
Mitglied verwenden können, das auf ein separat zugewiesenes Array zeigt, und dies wäre einfach ISO C ++. (Und das würde tatsächlich ein Byte speichern, ohne dass weitere Änderungen erforderlich wären). Ich habe dies als Modell- / Referenzimplementierung für eine asm-Version geschrieben.Die kürzere Version mit
int
deklariert eben auchR()
als zurückkehrendint
stattvoid
. Diese beiden Teile der Hackerei haben nichts miteinander zu tun. Dies ist nur die Version "arbeitet an mindestens einer Implementierung".Es sollte auf 32-Bit-Zielen (wo
int
ein Zeiger enthalten sein kann) einwandfrei funktionieren, solange Sie mit gcc7 oder älter kompilieren oder Optimierungen deaktivieren. ( Nimmt an,gcc8 -O3
dass die Ausführung nicht das Ende einer Nicht-void
Funktion erreichen kann, da dies UB wäre.) x86gcc -m32 -O3
sollte mit gcc7 einwandfrei funktionieren, wie auf Godbolt, wo ich beide Versionen (in verschiedenen Namespaces) und eine Nicht-Member-Funktionsversion aufgenommen habe .Ungolfed
Die Funktion arg,,
int r[]
ist ein Array von Ganzzahlen 0 / ungleich Null, die angeben, ob eine bestimmte Tiefe ausgetauscht werden soll, beginnend mit der äußersten Ebene.Wenn wir wiederkehren, gehen wir vorbei
r+1
, sodass immer die aktuelle Tiefe überprüft wird*r
.Eine frühere Version wurde nur
r
unverändert übergeben und überprüftr[d]
. Bei einem flexiblen Arraymitglied musste ich eine Art Anzeige der letzten Ebene speichern, daa[]
es sich nicht um einen Zeiger handelt, sondern um ein echtes Array ohne Indirektion. Aber mit einemintptr_t *a
Mitglied konnte ich das nicht nurnullptr
für die Blattebene haben, weil ich möchte, dass es Werte sind.Das Umkehren des aktuellen Niveaus vor oder nach dem Durchlaufen des Baums sollte keine Rolle spielen. Ich habe nicht versucht, es während zu tun .
Ich bin mir nicht sicher , ob dies
std::reverse
die Anzahl der Bytes im Vergleich zu einer manuellen Schleife wert ist, insbesondere wenn ichR()
jeden Zeiger genau einmal irgendwo innerhalb dieser Schleife aufrufen kann . Aber nur wennd!=0
quelle
Mathematica, 7 Bytes
Funktion. Geben Sie als erstes Argument eine verschachtelte Liste und als zweites Argument die auf 1 basierende Liste der Ebenen / Dimensionen an, die umgekehrt werden sollen. Probieren Sie es online!
Endlich eine weitere Herausforderung, bei der Mathematica eine eingebaute hat!
quelle