Los lenguajes de nivel inferior, como C y C ++, en realidad no tienen el concepto de matrices multidimensionales. (Aparte de vectores y matrices dinámicas) Cuando crea una matriz multidimensional con
int foo[5][10];
En realidad, esto es solo azúcar sintáctico . Lo que C realmente hace es crear una única matriz contigua de 5 * 10 elementos. Esta
foo[4][2]
También es azúcar sintáctico. Esto realmente se refiere al elemento en
4 * 10 + 2
o, el elemento 42. En general, el índice del elemento [a][b]
en la matriz foo[x][y]
está en
a * y + b
El mismo concepto se aplica a las matrices 3d. Si tenemos foo[x][y][z]
y accedemos al elemento [a][b][c]
, realmente estamos accediendo al elemento:
a * y * z + b * z + c
Este concepto se aplica a matrices n- dimensionales. Si tenemos una matriz con dimensiones D1, D2, D3 ... Dn
y accedemos al elemento, S1, S2, S3 ... Sn
la fórmula es
(S1 * D2 * D3 ... * Dn) + (S2 * D3 * D4 ... * Dn) + (S3 * D4 ... * Dn) ... + (Sn-1 * Dn) + Sn
El reto
Debe escribir un programa o función que calcule el índice de una matriz multidimensional de acuerdo con la fórmula anterior. La entrada será de dos matrices. La primera matriz son las dimensiones, y la segunda matriz son los índices. La longitud de estas dos matrices siempre será igual y al menos 1.
Puede asumir con seguridad que cada número en las matrices será un número entero no negativo. También puede suponer que no obtendrá un 0
en la matriz de dimensiones, aunque 0
podría estar en los índices. También puede suponer que los índices no serán más grandes que las dimensiones.
Prueba 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
fuente
int[10]
.Respuestas:
APL, 1 byte
Pruébelo en TryAPL .
fuente
J, 2 bytes
Donde hay un APL, hay un J! Mas o menos. Toma dimensiones como argumento izquierdo e índice como argumento derecho. "Indexar una matriz multidimensional es esencialmente una conversión de base mixta".
fuente
JavaScript (ES6), 34 bytes
Seguramente
reduce
debe ser mejor quemap
.fuente
Python, 43 bytes
Pruébalo en Ideone .
fuente
Gelatina ,
76 bytesPruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Pyth, 10 bytes
Pruébelo en línea: Demostración o conjunto de pruebas
Usando el método de Horner para calcular el índice.
fuente
MATL , 9 bytes
Utiliza la indexación basada en 1 (ahora permitida por el desafío), que es la opción natural en MATL.
Para comparar con los casos de prueba en el desafío, agregue
1
a cada entrada en el vector de índice de entrada y reste1
de la salida.Pruébalo en línea!
Explicación
El código se basa en la
X]
función incorporada , que convierte los índices multidimensionales en un único índice lineal (como lasub2ind
función de Matlab u Octave ).fuente
Julia,
2927 bytesPruébalo en línea!
fuente
MATL , 11 bytes
Esto usa indexación basada en 0, como en el desafío original.
Pruébalo en línea!
Explicación
El código hace explícitamente las multiplicaciones y adiciones requeridas.
fuente
Python, 85 bytes
Probablemente me patearán el trasero los mejores golfistas de python.
fuente
Python 3.5, 69
Prueba aquí
fuente
Haskell, 34 bytes
Ejemplo de uso:
[10,10,4,62,7] # [1,2,3,4,5]
->22167
.Cómo funciona:
fuente
C ++, 66 bytes
Una macro rápida:
Usar como:
Esto puede ser un poco un abuso de las reglas. Crea una matriz con el tamaño dado, que comprueba hasta qué punto los índices dados compensan el puntero. Salidas a STDOUT.
Esto se siente tan sucio ... Pero me encanta el hecho de que esto es válido.
fuente
Mathematica, 27 bytes
Una función sin nombre que toma la lista de índices como primer argumento y la lista de dimensiones segundo. Basado en la misma observación que la respuesta APL de Dennis de que calcular el índice es realmente solo una conversión de base mixta.
fuente
Octava,
5854 bytesGracias a @AlexA. por su sugerencia, que eliminó 4 bytes
La entrada y la salida están basadas en 1. Para comparar con los casos de prueba, agregue
1
ot cada entrada en la entrada y reste1
de la salida.Esta es una función anónima. Para llamarlo, asígnelo a una variable.
Probar aquí .
Explicación
Esto funciona en realidad la construcción de la matriz multidimensional (
reshape(...)
), lleno de valores1
,2
... en orden lineal (1:prod(d)
), y luego indexando con el índice multidimensional para obtener el valor correspondiente.La indexación se realiza convirtiendo el índice multidimensional de entrada
i
en una matriz de celdas (num2cell(...)
) y luego en una lista separada por comas ({:}
).Las dos
flip
operaciones son necesarias para adaptar el orden de dimensiones de C a Octave.fuente
reshape
? Eso no es sintáctico en Matlab, pero se acepta en Octave. Funciona como un índice@(...) ...
en la primera línea de mi código, seguido porf = ans;
la segunda. Esto hace que la longitud de la primera línea sea igual al número de bytes a reportar.CJam, 7 bytes
Pruébalo en línea!
Cómo funciona
fuente
Haskell, 47 bytes
Dos soluciones de igual longitud:
Llamado como:
((sum.).s)[4,2][5,10]
.Aquí hay una versión infija:
fuente
Octava,
47/43/31 bytes@(d,i)sub2ind(flip(d),num2cell(flip(i+1)){:})-1
Pruébalo aquí .
Dicho esto, como se preguntó en un comentario , se dijo que la indexación basada en 1 estaba bien cuando esto es natural para el lenguaje que se está utilizando. En este caso, podemos guardar 4 bytes:
@(d,i)sub2ind(flip(d),num2cell(flip(i)){:})
En analogía, sostengo que si el objetivo del código es indexar linealmente una matriz dentro de ese lenguaje , tampoco debería ser necesario dar la vuelta y dar cuenta del orden principal de la columna de MATLAB / Octave. En ese caso, mi solución se convierte
@(d,i)sub2ind(d,num2cell(i){:})
Prueba esa aquí .
fuente
Mathematica, 47 bytes
(Unicode es U + F3C7, o
\[Transpose]
.) Para esto, reescribí la expresión como D n ( D n -1 (⋯ ( D 3 ( D 2 S 1 + S 2 ) + S 3 ) ⋯) + S n -1 ) + S n . SimplementeFold
s la función sobre ambas listas.fuente
En realidad, 13 bytes
Pruébalo en línea!
Este programa toma la lista de índices como la primera entrada y la lista de dimensiones como la segunda entrada.
Explicación:
fuente
Raqueta 76 bytes
Sin golf:
Pruebas:
Salida:
fuente
C #, 73 bytes
Programa completo con casos de prueba:
fuente
Perl 6, 39 bytes
Un golf bastante ingenuo aquí, simplemente aplastó a un submarino anónimo.
Perl 6 tiene una variable de estado anónimo
$
que es útil para crear un contador en un bucle (por ejemplo, usando un incremento posterior$++
o un incremento previo++$
). Pre-incrementé esta variable de estado para incrementar el índice inicial del segmento de matriz de dimensión dentro de un mapa.Aquí hay una función no protegida que crea las sublistas
Entonces es solo una cuestión de reducir las sublistas con el
×
operador multiplication ( ), y obtenersum
los resultados.fuente
Perl, 71 bytes
Sin golf:
fuente
C ++ 17,
133bytes-18 bytes para usar
auto...
Sin golf:
Uso:
Alternativa, solo funciones, 116 bytes
Sin golf:
Uso:
fuente