Eine Sammlung von N Dimensionskoordinaten wird bereitgestellt. Ein Beispiel ist unten:
{2,3,4}
Dies kann als dreidimensionales Array mit 2x, 3y und 4z betrachtet werden; Es kann eine beliebige Anzahl von Dimensionen geben. Im Beispiel gibt es insgesamt 24 Knoten. Jeder Knoten kann mit {x, y, z} indiziert werden. Um auf den 5. Knoten zuzugreifen, wären die bereitgestellten Indizes {0, 1, 0} basierend auf der folgenden Tabelle.
## | x y z
0 1 2
-----------
0 | 0 0 0
1 | 0 0 1
2 | 0 0 2
3 | 0 0 3
4 | 0 1 0
5 | 0 1 1
6 | 0 1 2
7 | 0 1 3
8 | 0 2 0
...
23 | 1 2 3
Der Zweck dieser Anwendung besteht darin, rückwärts zu arbeiten, um einen Index zu bestimmen, wenn eine Knotennummer angegeben wird.
Wenn Sie nach dem "y" -Index des 8. Knotens gefragt werden, sollte das Programm "2" ausgeben.
Mit folgender Eingabe:
{2,3,4}|8|1
<List of Coordinates>|<Node>|<Index>
Folgendes sollte gedruckt werden:
2
Sie können davon ausgehen, dass die Eingabe in einer Sprache Ihrer Wahl auf bequeme Weise bereitgestellt wird und keine Überprüfung der Grenzen erforderlich ist. Beispielsweise können Sie davon ausgehen, dass der angegebene Index der Wahl (im Beispiel "y") in Bezug auf die angegebenen Koordinaten gültig ist. Sie können eine 0- oder 1-basierte Indizierung verwenden. Das Beispiel setzt 0 basierend voraus.
Dies ist eine Art Umkehrung dieser Frage: Index eines mehrdimensionalen Arrays
quelle
Antworten:
MATL , 8 Bytes
Dies verwendet eine 1-basierte Indizierung für den Knoten und für die Dimensionen. So sind die ersten Knoten sind
1
,2
etc; und die "x" Dimension ist1
, "y" ist2
usw.Probieren Sie es online aus!
Erläuterung
Der Schlüssel ist die Verwendung einer Funktion
X[
(entsprechendind2sub
Matlab oder Octave), die einen linearen Index in mehrdimensionale Indizes konvertiert. Die Reihenfolge der Dimensionen ist jedoch erforderlich, wenn das Gegenteil wie in der Herausforderung definiert ist, alsoP
(flip
) vor dem Aufrufen der Funktion und erneut nach dem Verketten (v
) ihrer Ausgaben.quelle
Haskell , 45 Bytes
(#)
Nimmt drei Argumente und gibt eine Ganzzahl zurück, verwenden Sie als[2,3,4]#8$1
.Probieren Sie es online aus!
Wie es funktioniert
l
ist die Liste der Koordinaten,n
die Knotennummer.l#n
ist eine Funktion, die den endgültigen Index übernimmti
.[2,3,4]
und des Knotens8
wird zuerst der Schwanz der Liste genommen und gegeben[3,4]
. Dann wird diesscan
von derr
Nacht an ned ,div
wobei die Knotennummer durch jedes Element nacheinander identifiziert wird und die Liste gegeben wird[0,2,8]
.[0,2,8]
und das Originall=[2,3,4]
werdenzip
pedwith
denmod
ulus Betreiber geben[0,2,0]
.!!
Listenindizierungsoperator teilweise angewendet, wobei die resultierende Funktion bereit ist, den endgültigen Index zu erhalten.quelle
APL (Dyalog Classic) , 5 Bytes
Nein, Ihnen fehlt keine Schriftart. So soll es aussehen.
Dies ist ein REPL-Programm, das Eingaben von STDIN entgegennimmt: die Knotennummer, die Dimensionen und den Index (in dieser Reihenfolge). Letzteres kann je nach Wert von 0- oder 1-basiert sein
⎕IO
.Probieren Sie es online aus!
Wie es funktioniert
Bei der mehrdimensionalen Array-Indizierung handelt es sich im Wesentlichen um eine gemischte Basiskonvertierung. Dies
⊤
gilt auch für den ersten Teil der Herausforderung. Jedes Auftreten von⎕
liest und wertet eine Zeile von STDIN aus, alsoNimmt schließlich
⌷
das Element am angegebenen Index.⎕
Ganz links liest die dritte und letzte Eingabe von STDIN undquelle
Haskell,
38302928 BytesDies verwendet 0-basierte Indizes und Koordinaten ab 1. Probieren Sie es online aus!
Verwandeln Sie jede Dimension
x
der Eingabe in eine Liste[1..x]
, z . B.[2,3,4]
->[[1,2],[1,2,3],[1,2,3,4]]
.mapM
Erstellt eine Liste aller möglichen n-Tupel, bei denen das erste Element aus der ersten Liste usw. entnommen wird. Zweimal,!!
um das n-Tupel und die Dimension zu indizieren.Edit: @ Ørjan Johansen hat
89 Bytes gespeichert . Vielen Dank!quelle
mapM id.map f=mapM f
. Und(`take`[0..])
ist kürzer.l#n=(mapM(`take`[0..])l!!n!!)
ist kürzer. (Übrigens brauchten Sie das nichtf=
, Funktionen können anonym sein. Oh, ich denke, Sie zählen es nicht.)f=
war ein Fehler beim Kopieren und Einfügen von TIO.Brachylog ,
2523 BytesProbieren Sie es online aus!
Das zweite Argument ist 1-indiziert, die anderen 2 sind 0-indiziert.
Erläuterung
quelle
Mathematica,
2623 BytesVerwenden der 1-basierten Indizierung für die Eingabe und der 0-basierten Indizierung für die Ausgabe.
Warum
Or
? Weil es die kürzeste integrierte Funktion mit dem Attribut istFlat
.Beispiel:
quelle
APL (Dyalog) , 6 Bytes
So erhalten Sie eine 0-basierte Indizierung
⎕IO←0
, die auf vielen Systemen standardmäßig verwendet wird. Fordert zur Eingabe von Dimensionen auf und enthält dann eine Liste von (Knoten, Koordinate).Probieren Sie es online aus!
⎕
Eingabeaufforderung für Dimensionen⍳
ein Array von dieser Form erzeugen , die jedes Element das Wesen i ndices für das Element,
Ravel (in Liste der Indizes einarbeiten)↑
Wandle eine Tiefenstufe in eine zusätzliche Rangstufe um⎕⊃
Eingabeaufforderung für die beiliegende Liste von (Knoten, Koordinate) und verwenden Sie diese, um ein Element daraus auszuwählenquelle
Gelee ,
76 BytesProbieren Sie es online aus!
Dies verwendet 1-Indizierung für Eingabe und Ausgabe.
Wie es funktioniert
quelle
Oktave , 63 Bytes
Port meiner MATL-Antwort.
Probieren Sie es online aus!
quelle
Pyth , 12 Bytes
Probieren Sie es online aus!
Wie es funktioniert
quelle
R, 52 Bytes
Gibt eine anonyme Funktion mit 1 Index zurück.
für das Beispiel.
expand.grid
generiert die Liste, aber das erste Argument variiert am schnellsten, daher müssen wir sie in umgekehrter Reihenfolge eingeben, dz,y,x
. h . Dann können wir einfach indizieren[n,4-i]
, wo4-i
dies für die umgekehrte Reihenfolge erforderlich ist, und 1 subtrahieren, um sicherzustellen, dass sie ablaufen0:(x-1)
usw.Probieren Sie es online aus!
quelle
Java , 77 Bytes
Probieren Sie es online aus!
quelle
JavaScript (ES6), 44 Byte
Ungolfed:
Leider
reduce
sind zwei Bytes länger:quelle
Python 3 , 57 Bytes
Probieren Sie es online aus!
Gabel meiner Java-Antwort .
quelle