Une collection de coordonnées dimensionnelles N est fournie. Un exemple est ci-dessous:
{2,3,4}
Cela peut être considéré comme un tableau tridimensionnel avec 2x, 3y et 4z; il peut y avoir n'importe quel nombre de dimensions. Dans l'exemple, il y a 24 nœuds au total. Chaque nœud peut être indexé à l'aide de {x, y, z}. Pour accéder au 5e nœud, les indices fournis seraient {0, 1, 0} sur la base du tableau ci-dessous.
## | 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
Le but de cette application est de travailler en arrière pour déterminer un index si on lui donne un numéro de nœud.
Si on lui demande l'index "y" du 8ème nœud, le programme devrait afficher "2".
Avec l'entrée suivante fournie:
{2,3,4}|8|1
<List of Coordinates>|<Node>|<Index>
Les éléments suivants doivent être imprimés:
2
Vous pouvez supposer que l'entrée sera fournie d'une manière pratique dans la langue de votre choix et ne nécessite pas de vérification des limites. Par exemple, vous pouvez supposer que l'index de choix fourni ("y" dans l'exemple) est valide par rapport aux coordonnées fournies. Vous pouvez utiliser une indexation basée sur 0 ou 1; l'exemple suppose une base de 0.
C'est en quelque sorte l'inverse de cette question: Index d'un tableau multidimensionnel
la source
Réponses:
MATL , 8 octets
Cela utilise une indexation basée sur 1 pour le nœud et pour les dimensions. Ainsi, les premiers nœuds sont
1
,2
etc; et la dimension "x" est1
, "y" est2
etc.Essayez-le en ligne!
Explication
La clé est d'utiliser la fonction
X[
(correspondant àind2sub
Matlab ou Octave), qui convertit un indice linéaire en indices multidimensionnels. Cependant, l'ordre des dimensions si l'opposé tel que défini dans le défi, soP
(flip
) est nécessaire avant d'appeler la fonction, et de nouveau après avoir concaténé (v
) ses sorties.la source
Haskell , 45 octets
(#)
prend trois arguments et retourne un entier, utilisez as[2,3,4]#8$1
.Essayez-le en ligne!
Comment ça fonctionne
l
est la liste des coordonnées,n
le numéro de nœud.l#n
est une fonction qui prend l'index finali
.[2,3,4]
et de nœud8
, la queue de la liste est d'abord prise, donnant[3,4]
. Ensuite, c'estscan
ned à partir dur
ight,div
identifiant le numéro de nœud par chaque élément consécutivement, donnant la liste[0,2,8]
.[0,2,8]
et l'originall=[2,3,4]
sontzip
consultés parwith
l'mod
opérateur ulus, donnant[0,2,0]
.!!
opérateur d'indexation de liste est enfin partiellement appliqué, la fonction résultante étant prête à recevoir l'index final.la source
APL (Dyalog Classic) , 5 octets
Non, vous ne manquez pas de police. Voilà à quoi ça doit ressembler.
Il s'agit d'un programme REPL qui prend en entrée STDIN: le numéro de nœud, les dimensions et l'index (dans cet ordre). Ce dernier peut être basé sur 0 ou 1, selon la valeur de
⎕IO
.Essayez-le en ligne!
Comment ça fonctionne
L'indexation de tableaux multidimensionnels est essentiellement une conversion de base mixte, tout
⊤
comme ce que demande la première partie du défi. Chaque occurrence de⎕
lit et évalue une ligne de STDIN, doncEnfin,
⌷
prend l'élément à l'index spécifié. Le plus à gauche⎕
lit la troisième et dernière entrée de STDIN etla source
Haskell,
38302928 octetsIl utilise des indices et des coordonnées basés sur 0 à partir de 1. Essayez-le en ligne!
Transformez chaque dimension
x
de l'entrée en une liste[1..x]
, par exemple[2,3,4]
->[[1,2],[1,2,3],[1,2,3,4]]
.mapM
fait une liste de tous les n-tuples possibles où le premier élément est tiré de la première liste, etc. Deux fois!!
pour indexer le n-tuple et la dimension.Edit: @ Ørjan Johansen a enregistré
89 octets. Merci!la source
mapM id.map f=mapM f
. Et(`take`[0..])
est plus court.l#n=(mapM(`take`[0..])l!!n!!)
est plus court. (Soit dit en passant, vous n'aviez pas besoin desf=
fonctions, elles peuvent être anonymes. Oh, je suppose que vous ne les comptez pas.)f=
s'agissait d'une erreur de copier-coller de TIO.Brachylog ,
2523 octetsEssayez-le en ligne!
Le deuxième argument est indexé 1, les 2 autres sont indexés 0.
Explication
la source
Mathematica,
2623 octetsUtilisation d'une indexation basée sur 1 pour l'entrée et d'une indexation basée sur 0 pour la sortie.
Pourquoi
Or
? Parce que c'est la fonction intégrée la plus courte avec l'attributFlat
.Exemple:
la source
APL (Dyalog) , 6 octets
Pour obtenir une indexation basée sur 0
⎕IO←0
, qui est par défaut sur de nombreux systèmes. Demande les dimensions, puis la liste jointe de (nœud, coordonnées).Essayez-le en ligne!
⎕
demander des dimensions⍳
générer un tableau de cette forme avec chaque élément étant le i ndices pour cet élément,
ravel (faire dans la liste des indices)↑
convertir un niveau de profondeur en un niveau de rang supplémentaire⎕⊃
demander la liste jointe de (nœud, coordonnées) et l'utiliser pour choisir un élémentla source
Gelée ,
76 octetsEssayez-le en ligne!
Cela utilise l'indexation 1 pour l'entrée et la sortie.
Comment ça fonctionne
la source
Octave , 63 octets
Port de ma réponse MATL.
Essayez-le en ligne!
la source
Pyth , 12 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
R, 52 octets
renvoie une fonction anonyme, indexée sur 1.
pour l'exemple.
expand.grid
génère la liste, mais le premier argument varie le plus rapidement, nous devons donc les saisir dans l'ordre inverse, c'est-à-direz,y,x
. Ensuite, nous pouvons simplement indexer[n,4-i]
, où cela4-i
est nécessaire pour l'ordre inversé, et soustraire 1 pour nous assurer qu'ils partent de0:(x-1)
, etc.Essayez-le en ligne!
la source
Java , 77 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 44 octets
Non golfé:
Malheureusement,
reduce
deux octets de plus:la source
Python 3 , 57 octets
Essayez-le en ligne!
Fourchette de ma réponse Java .
la source