Les langages de niveau inférieur, tels que C et C ++, n'ont en réalité aucun concept de tableaux multidimensionnels. (Autre que les vecteurs et les tableaux dynamiques) Lorsque vous créez un tableau multidimensionnel avec
int foo[5][10];
Ce n'est en fait que du sucre syntaxique . Ce que C fait vraiment, c'est créer un seul tableau contigu de 5 * 10 éléments. Cette
foo[4][2]
est également du sucre syntaxique. Cela fait vraiment référence à l'élément
4 * 10 + 2
ou, le 42e élément. En général, l'indice de l'élément [a][b]
dans le tableau foo[x][y]
est à
a * y + b
Le même concept s'applique aux tableaux 3D. Si nous avons foo[x][y][z]
et nous [a][b][c]
accédons à l'élément, nous accédons vraiment à l'élément:
a * y * z + b * z + c
Ce concept s'applique aux tableaux à n dimensions. Si nous avons un tableau avec des dimensions D1, D2, D3 ... Dn
et que nous accédons à l'élément, S1, S2, S3 ... Sn
la formule est
(S1 * D2 * D3 ... * Dn) + (S2 * D3 * D4 ... * Dn) + (S3 * D4 ... * Dn) ... + (Sn-1 * Dn) + Sn
Le défi
Vous devez écrire un programme ou une fonction qui calcule l'index d'un tableau multidimensionnel selon la formule ci-dessus. L'entrée sera deux tableaux. Le premier tableau correspond aux dimensions et le second tableau aux indices. La longueur de ces deux tableaux sera toujours égale et d'au moins 1.
Vous pouvez supposer en toute sécurité que chaque nombre dans les tableaux sera un entier non négatif. Vous pouvez également supposer que vous n'obtiendrez pas a 0
dans le tableau de dimensions, bien que a 0
puisse être dans les indices. Vous pouvez également supposer que les indices ne seront pas supérieurs aux dimensions.
Test 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
la source
int[10]
.Réponses:
APL, 1 octet
Testez-le sur TryAPL .
la source
J, 2 octets
Là où il y a un APL, il y a un J! Genre de. Prend les dimensions comme arg gauche et l'index comme arg droite. "L'indexation d'un tableau multidimensionnel est essentiellement une conversion de base mixte."
la source
JavaScript (ES6), 34 octets
Ça
reduce
doit sûrement être mieux quemap
.la source
Python, 43 octets
Testez-le sur Ideone .
la source
Gelée ,
76 octetsEssayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça marche
la source
Pyth, 10 octets
Essayez-le en ligne: démonstration ou suite de tests
Utilisation de la méthode de Horner pour calculer l'indice.
la source
MATL , 9 octets
Cela utilise l'indexation basée sur 1 (désormais autorisée par le défi), ce qui est le choix naturel dans MATL.
Pour comparer avec les cas de test du défi, ajoutez
1
à chaque entrée dans le vecteur d'index d'entrée et soustrayez1
de la sortie.Essayez-le en ligne!
Explication
Le code est basé sur la
X]
fonction intégrée , qui convertit les indices multidimensionnels en un seul index linéaire (comme lasub2ind
fonction Matlab ou Octave ).la source
Julia,
2927 octetsEssayez-le en ligne!
la source
MATL , 11 octets
Cela utilise une indexation basée sur 0, comme dans le défi d'origine.
Essayez-le en ligne!
Explication
Le code effectue explicitement les multiplications et ajouts requis.
la source
Python, 85 octets
Je vais probablement me faire botter les fesses par les meilleurs golfeurs de python.
la source
Python 3.5, 69
Testez ici
la source
Haskell, 34 octets
Exemple d'utilisation:
[10,10,4,62,7] # [1,2,3,4,5]
->22167
.Comment ça marche:
la source
C ++, 66 octets
Une macro rapide:
Utilisez comme:
Cela peut être un peu un abus des règles. Crée un tableau avec la taille donnée, puis vérifie pour voir dans quelle mesure les index donnés compensent le pointeur. Sorties vers STDOUT.
C'est tellement sale ... Mais j'adore le fait que cela soit valable.
la source
Mathematica, 27 octets
Une fonction sans nom qui prend la liste des indices comme premier argument et la liste des dimensions en second. Basé sur la même observation que la réponse APL de Dennis selon laquelle le calcul de l'indice n'est en réalité qu'une conversion à base mixte.
la source
Octave,
5854 octetsMerci à @AlexA. pour sa suggestion, qui a supprimé 4 octets
L'entrée et la sortie sont basées sur 1. Pour comparer avec les cas de test, ajoutez
1
ot chaque entrée dans l'entrée et soustrayez1
de la sortie.Il s'agit d'une fonction anonyme. Pour l'appeler, affectez-le à une variable.
Essayez-le ici .
Explication
Cela fonctionne en construisant en fait le tableau multidimensionnel (
reshape(...)
), rempli de valeurs1
,2
... dans un ordre linéaire (1:prod(d)
), puis l' indexation à l'indice multidimensionnel pour obtenir la valeur corrresponding.L'indexation se fait en convertissant l'index multidimensionnel d'entrée
i
en un tableau de cellules (num2cell(...)
) puis en une liste séparée par des virgules ({:}
).Les deux
flip
opérations sont nécessaires pour adapter l'ordre des dimensions de C à Octave.la source
reshape
? C'est non syntaxique dans Matlab, mais accepté dans Octave. Cela fonctionne comme un index@(...) ...
dans la première ligne de mon code, puisf = ans;
dans la seconde. Cela rend la longueur de la première ligne égale au nombre d'octets à signaler.CJam, 7 octets
Essayez-le en ligne!
Comment ça marche
la source
Haskell, 47 octets
Deux solutions de longueur égale:
Appelé comme:
((sum.).s)[4,2][5,10]
.Voici une version infixe:
la source
Octave,
47/43/31 octets@(d,i)sub2ind(flip(d),num2cell(flip(i+1)){:})-1
Testez-le ici .
Cela dit, comme cela a été demandé dans un commentaire , l'indexation basée sur 1 a été jugée correcte lorsque cela est naturel pour la langue utilisée. Dans ce cas, nous pouvons économiser 4 octets:
@(d,i)sub2ind(flip(d),num2cell(flip(i)){:})
Par analogie, je soutiens que si l'objectif du code est d'indexer linéairement un tableau dans ce langage , le retournement complet et la prise en compte de l'ordre majeur de la colonne MATLAB / Octave ne devraient pas non plus être nécessaires. Dans ce cas, ma solution devient
@(d,i)sub2ind(d,num2cell(i){:})
Testez celui-là ici .
la source
Mathematica, 47 octets
(Unicode est U + F3C7, ou
\[Transpose]
.) Pour cela, j'ai réécrit l'expression comme D n ( D n -1 (⋯ ( D 3 ( D 2 S 1 + S 2 ) + S 3 ) ⋯) + S n -1 ) + S n . Il suffit deFold
la fonction sur les deux listes.la source
En fait, 13 octets
Essayez-le en ligne!
Ce programme prend la liste des indices comme première entrée et la liste des dimensions comme deuxième entrée.
Explication:
la source
Raquette 76 octets
Non golfé:
Essai:
Sortie:
la source
C #, 73 octets
Programme complet avec cas de test:
la source
Perl 6, 39 octets
Un golf plutôt naïf ici, vient d'écraser un sous anonyme.
Perl 6 a une variable d'état anonyme
$
qui est utile pour créer un compteur dans une boucle (par exemple, en utilisant post-incrémentation$++
ou pré-incrémentation++$
). Je pré-incrémente cette variable d'état pour incrémenter l'index de départ de la tranche du tableau de dimensions à l'intérieur d'une carte.Voici une fonction non golfée qui crée les sous-listes
Ensuite, il suffit de réduire les sous-listes avec l'
×
opérateur multiplication ( ) et d'obtenirsum
les résultats.la source
Perl, 71 octets
Non golfé:
la source
C ++ 17,
133115 octets-18 octets pour l'utilisation
auto...
Non golfé:
Usage:
Alternative, seulement fonctions, 116 octets
Non golfé:
Usage:
la source