Untergeordnete Sprachen wie C und C ++ haben eigentlich kein Konzept für mehrdimensionale Arrays. (Andere als Vektoren und dynamische Arrays) Wenn Sie ein mehrdimensionales Array mit erstellen
int foo[5][10];
Dies ist eigentlich nur syntaktischer Zucker . Was C wirklich tut, ist, ein einzelnes zusammenhängendes Array von 5 * 10 Elementen zu erstellen . Dies
foo[4][2]
ist auch syntaktischer Zucker. Das bezieht sich wirklich auf das Element bei
4 * 10 + 2
oder das 42. Element. Im Allgemeinen ist der Index des Elements [a][b]
im Array foo[x][y]
at
a * y + b
Das gleiche Konzept gilt für 3D-Arrays. Wenn wir haben foo[x][y][z]
und auf element [a][b][c]
zugreifen, greifen wir wirklich auf element zu:
a * y * z + b * z + c
Dieses Konzept gilt für n- dimensionale Arrays. Wenn wir ein Array mit Dimensionen haben D1, D2, D3 ... Dn
und auf das Element zugreifen, S1, S2, S3 ... Sn
lautet die Formel
(S1 * D2 * D3 ... * Dn) + (S2 * D3 * D4 ... * Dn) + (S3 * D4 ... * Dn) ... + (Sn-1 * Dn) + Sn
Die Herausforderung
Sie müssen ein Programm oder eine Funktion schreiben, die den Index eines mehrdimensionalen Arrays gemäß der obigen Formel berechnet. Die Eingabe erfolgt über zwei Arrays. Das erste Array sind die Dimensionen und das zweite Array sind die Indizes. Die Länge dieser beiden Arrays ist immer gleich und mindestens 1.
Sie können davon ausgehen, dass jede Zahl in den Arrays eine nicht negative Ganzzahl ist. Sie können auch davon ausgehen, dass Sie kein a 0
im Dimensionsarray erhalten, obwohl a 0
möglicherweise in den Indizes enthalten ist. Sie können auch davon ausgehen, dass die Indizes nicht größer als die Dimensionen sind.
Testen Sie IO
Dimensions: [5, 10]
Indices: [4, 2]
Output: 42
Dimensions: [10, 10, 4, 62, 7]
Indices: [1, 2, 3, 4, 5]
Output: 22167
Dimensions: [5, 1, 10]
Indices: [3, 0, 7]
Output: 37
Dimensions: [6, 6, 6, 6, 6, 6, 6, 6, 6, 6]
Indices: [3, 1, 5, 5, 3, 0, 5, 2, 5, 4]
Output: 33570178
quelle
int[10]
.Antworten:
APL, 1 Byte
Testen Sie es auf TryAPL .
quelle
J, 2 Bytes
Wo es eine APL gibt, gibt es ein J! So'ne Art. Nimmt Dimensionen als linkes Argument und Index als rechtes Argument. "Das Indizieren eines mehrdimensionalen Arrays ist im Wesentlichen eine gemischte Basiskonvertierung."
quelle
JavaScript (ES6), 34 Byte
Sicherlich
reduce
muss besser sein alsmap
.quelle
Python, 43 Bytes
Teste es auf Ideone .
quelle
Gelee ,
76 BytesProbieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Pyth, 10 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Verwenden Sie die Horner-Methode, um den Index zu berechnen.
quelle
MATL , 9 Bytes
Dies verwendet eine 1-basierte Indizierung (die jetzt von der Challenge zugelassen wird), was in MATL die natürliche Wahl ist.
Fügen Sie
1
zu jedem Eintrag im Eingabeindexvektor einen Wert hinzu und subtrahieren Sie1
den Wert von der Ausgabe, um ihn mit den Testfällen in der Abfrage zu vergleichen .Probieren Sie es online!
Erläuterung
Der Code basiert auf der eingebauten
X]
Funktion, die mehrdimensionale Indizes in einen einzelnen linearen Index konvertiert (wie die Matlab- oder Octave-sub2ind
Funktion).quelle
Julia,
2927 BytesProbieren Sie es online!
quelle
MATL , 11 Bytes
Dies verwendet eine 0-basierte Indizierung, wie bei der ursprünglichen Abfrage.
Probieren Sie es online!
Erläuterung
Der Code führt explizit die erforderlichen Multiplikationen und Additionen durch.
quelle
Python, 85 Bytes
Ich werde wahrscheinlich meinen Hintern von den besseren Python-Golfern da draußen treten lassen.
quelle
Python 3.5, 69
testen Sie hier
quelle
Haskell, 34 Bytes
Anwendungsbeispiel:
[10,10,4,62,7] # [1,2,3,4,5]
->22167
.Wie es funktioniert:
quelle
C ++, 66 Bytes
Ein kurzes Makro:
Verwenden Sie wie:
Dies könnte ein Missbrauch der Regeln sein. Erstellt ein Array mit der angegebenen Größe und überprüft dann, inwieweit die angegebenen Indizes den Zeiger versetzen. Ausgänge zu STDOUT.
Das fühlt sich so dreckig an ... Aber ich liebe die Tatsache, dass dies gültig ist.
quelle
Mathematica, 27 Bytes
Eine unbenannte Funktion, die die Liste der Indizes als erstes Argument und die Liste der Dimensionen als zweites verwendet. Basierend auf derselben Beobachtung wie Dennis 'APL-Antwort, dass die Berechnung des Index nur eine Mixed-Base-Konvertierung ist.
quelle
Oktave,
5854 BytesVielen Dank an @AlexA. für seinen Vorschlag, der 4 Bytes entfernte
Eingang und Ausgang sind 1-basiert. Fügen Sie zum Vergleich mit den Testfällen
1
jeden Eintrag in der Eingabe hinzu und subtrahieren Sie ihn1
von der Ausgabe.Dies ist eine anonyme Funktion. Um es aufzurufen, weisen Sie es einer Variablen zu.
Probieren Sie es hier aus .
Erläuterung
Dies funktioniert , indem tatsächlich den mehrdimensionale Array Aufbau (
reshape(...)
), mit Werten gefüllt1
,2
... in linearer Reihenfolge (1:prod(d)
) und dann die Indizierung mit dem mehrdimensionalen Index den corrresponding Wert zu erhalten.Die Indizierung erfolgt durch Konvertieren des mehrdimensionalen Eingabeindex
i
in ein Zellenarray (num2cell(...)
) und anschließend in eine durch Kommas getrennte Liste ({:}
).Diese beiden
flip
Operationen sind erforderlich, um die Reihenfolge der Dimensionen von C bis Oktave anzupassen.quelle
reshape
? Das ist in Matlab nicht syntaktisch, wird aber in Octave akzeptiert. Es funktioniert als Index@(...) ...
in der ersten Zeile meines Codes, gefolgt vonf = ans;
der zweiten. Dadurch entspricht die Länge der ersten Zeile der Anzahl der zu meldenden Bytes.CJam, 7 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Haskell, 47 Bytes
Zwei gleichlange Lösungen:
Genannt wie:
((sum.).s)[4,2][5,10]
.Hier ist eine Infix-Version:
quelle
Octave,
47/43/31 Byte@(d,i)sub2ind(flip(d),num2cell(flip(i+1)){:})-1
Teste es hier .
Allerdings wurde, wie in einem Kommentar gefordert , die 1-basierte Indizierung als OK eingestuft, wenn dies für die verwendete Sprache natürlich ist. In diesem Fall können wir 4 Bytes sparen:
@(d,i)sub2ind(flip(d),num2cell(flip(i)){:})
In Analogie dazu behaupte ich, dass, wenn das Ziel des Codes darin besteht, ein Array innerhalb dieser Sprache linear zu indizieren , das gesamte Umblättern und Berücksichtigen der Spaltenhauptreihenfolge von MATLAB / Octave ebenfalls nicht erforderlich sein sollte. In diesem Fall wird meine Lösung
@(d,i)sub2ind(d,num2cell(i){:})
Testen Sie das hier .
quelle
Mathematica, 47 Bytes
(Unicode ist U + F3C7 oder
\[Transpose]
.) Dazu habe ich den Ausdruck umgeschrieben als D n ( D n –1 (⋯ ( D 3 ( D 2 S 1 + S 2 ) + S 3 ) ⋯) + S n –1 ) + S n . EinfachFold
s die Funktion über beide Listen.quelle
Eigentlich 13 Bytes
Probieren Sie es online!
Dieses Programm verwendet die Liste der Indizes als erste Eingabe und die Liste der Dimensionen als zweite Eingabe.
Erläuterung:
quelle
Schläger 76 Bytes
Ungolfed:
Testen:
Ausgabe:
quelle
C #, 73 Bytes
Volles Programm mit Testfällen:
quelle
Perl 6, 39 Bytes
Ein eher naiver Golf hier, der gerade ein anonymes U-Boot gequetscht hat.
Perl 6 verfügt über eine anonyme Statusvariable,
$
die zum Erstellen eines Zählers in einer Schleife nützlich ist (z. B. mithilfe von Post-Inkrement$++
oder Pre-Inkrement++$
). Ich inkrementiere diese Statusvariable vorab, um den Startindex des Dimensionsarray-Slice innerhalb einer Karte zu inkrementieren.Hier ist eine ungolfed Funktion, die die Unterlisten erstellt
Dann geht es nur noch darum, die Unterlisten mit dem multiplication (
×
) -Operator zusum
verkleinern und die Ergebnisse zu erhalten.quelle
Perl, 71 Bytes
Ungolfed:
quelle
C ++ 17,
133115 Bytes-18 Bytes für die Verwendung
auto...
Ungolfed:
Verwendung:
Alternativ nur Funktionen, 116 Bytes
Ungolfed:
Verwendung:
quelle