Evaluar el índice de coordenadas multidimensionales

9

Se proporciona una colección de coordenadas N dimensionales. A continuación se muestra un ejemplo:

{2,3,4}

Esto puede considerarse como una matriz tridimensional con 2x, 3y y 4z; Puede haber cualquier cantidad de dimensiones. En el ejemplo, hay 24 nodos totales. Cada nodo puede indexarse ​​usando {x, y, z}. Para acceder al quinto nodo, los índices proporcionados serían {0, 1, 0} según la tabla a continuación.

## | 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

El propósito de esta aplicación es trabajar hacia atrás para determinar un índice si se le da un número de nodo.

Si se le solicita el índice "y" del octavo nodo, el programa debe imprimir "2".

Con la siguiente entrada proporcionada:

{2,3,4}|8|1
<List of Coordinates>|<Node>|<Index>

Se debe imprimir lo siguiente:

2

Puede suponer que la entrada se proporcionará de manera conveniente en el idioma de su elección y no requiere verificación de límites. Por ejemplo, puede suponer que el índice de elección proporcionado ("y" en el ejemplo) es válido con respecto a las coordenadas proporcionadas. Puede usar 0 o 1 indexación basada; el ejemplo supone 0 basado.

Esto es una especie de reverso de esta pregunta: índice de una matriz multidimensional

Mark Johnson
fuente
1
Quizás agregue algunos casos de prueba
Luis Mendo
1
¿Podemos dejar que las coordenadas vayan de 1 a x en lugar de 0 a x-1? Entonces el nodo # 0 sería (1,1,1) y el nodo # 23 (2,3,4).
nimi
@nimi Sí, 1 indexación basada está bien.
Mark Johnson

Respuestas:

4

MATL , 8 bytes

PiX[vPi)

Esto usa indexación basada en 1 para el nodo y para las dimensiones. Entonces los primeros nodos son 1, 2etc; y la dimensión "x" es 1, "y" es 2etc.

Pruébalo en línea!

Explicación

La clave es utilizar la función X[(correspondiente a ind2subMatlab u Octave), que convierte un índice lineal en índices multidimensionales. Sin embargo, el orden de las dimensiones si es lo opuesto a lo definido en el desafío, entonces P( flip) es necesario antes de llamar a la función, y nuevamente después de concatenar ( v) sus salidas.

P    % Implicit input: size as a row vector. Flip
i    % Input: node (linear) index
X[   % Convert from linear index to multidimensional indices. Produces
     % as many outputs as entries there are in the size vector
v    % Concatenate all outputs into a column vector
P    % Flip
i    % Input: dimension
)    % Index: select result for that dimension. Implicitly display
Luis Mendo
fuente
3

Haskell , 45 bytes

(#)toma tres argumentos y devuelve un entero, se usa como [2,3,4]#8$1.

l#n=(zipWith mod(scanr(flip div)n$tail l)l!!)

Pruébalo en línea!

Cómo funciona

  • les la lista de coordenadas, nel número de nodo. l#nes una función que toma el índice final i.
  • Dado el ejemplo de lista [2,3,4]y nodo 8, primero se toma la cola de la lista, dando [3,4]. Entonces esto se scannifica desde el ight r, dividentificando el número de nodo por cada elemento consecutivamente, dando la lista [0,2,8].
  • Entonces la lista [0,2,8]y el original l=[2,3,4]son zipped withel modoperador ulus, dando [0,2,0].
  • Finalmente, el !!operador de indexación de lista se aplica parcialmente, con la función resultante lista para recibir el índice final.
Ørjan Johansen
fuente
3

APL (Dyalog Classic) , 5 bytes

⎕⌷⎕⊤⎕

No, no te falta una fuente. Así es como se supone que debe verse.

Este es un programa REPL que toma información de STDIN: el número de nodo, las dimensiones y el índice (en ese orden). Este último puede estar basado en 0 o 1, dependiendo del valor de ⎕IO.

Pruébalo en línea!

Cómo funciona

La indexación de matriz multidimensional es esencialmente una conversión de base mixta, al igual que lo que pide la primera parte del desafío. Cada aparición de lee y evalúa una línea de STDIN, por lo que

        
⎕:
      8
⎕:
      2 3 4
0 2 0

Finalmente, toma el elemento en el índice especificado. El extremo izquierdo lee la tercera y última entrada de STDIN y

        (0 2 0)
⎕:
      1
2
Dennis
fuente
¡La conversión de bases mixtas ataca de nuevo!
Adám
3

Haskell, 38 30 29 28 bytes

l#n=(mapM(\x->[1..x])l!!n!!)

Utiliza índices y coordenadas basados ​​en 0 a partir de 1. ¡ Pruébelo en línea!

Convierta cada dimensión xde la entrada en una lista [1..x], por ejemplo, [2,3,4]-> [[1,2],[1,2,3],[1,2,3,4]]. mapMhace una lista de todas las n-tuplas posibles donde se toma el primer elemento de la primera lista, etc. Dos veces !!para indexar la n-tupla y la dimensión.

Editar: @ Ørjan Johansen guardó 8 9 bytes. ¡Gracias!

nimi
fuente
¡Oh, listo! Pero mapM id.map f=mapM f. Y (`take`[0..])es más corto.
Ørjan Johansen
@ ØrjanJohansen: 8 bytes, ¡eso es enorme! ¡Muchas gracias! Todavía estoy esperando una respuesta del OP si se permiten coordenadas basadas en 1.
nimi
Además, l#n=(mapM(`take`[0..])l!!n!!)es más corto. (Por cierto que no era necesario el f=, las funciones pueden ser anónimas Oh, supongo que no se está contando..)
Ørjan Johansen
@ ØrjanJohansen: Gracias de nuevo. El f=fue un error de copiar y pegar de TIO.
nimi
2

Brachylog , 25 23 bytes

tT&bhH&h{>ℕ}ᵐ:H≜ᶠ⁾t:T∋₎

Pruébalo en línea!

El segundo argumento está indexado en 1, los otros 2 están indexados en 0.

Explicación

tT                          Input = [_, _, T]
  &bhH                      Input = [_, H, T]
      &h{>ℕ}ᵐ               Create a list where each element is between 0 and the
                              corresponding element in the first element of the Input
             :H≜ᶠ⁾          Find the first H possible labelings of that list
                  t         Take the last one
                   :T∋₎     Output is the T'th element
Fatalizar
fuente
1

Mathematica, 26 23 bytes

Array[f,#,0,Or][[##2]]&

Uso de indexación basada en 1 para entrada e indexación basada en 0 para salida.

¿Por qué Or? Porque es la función incorporada más corta con el atributo Flat.

Ejemplo:

In[1]:= Array[f,#,0,Or][[##2]]&[{2,3,4},9,2]

Out[1]= 2
alephalpha
fuente
1

APL (Dyalog) , 6 bytes

Para obtener una indexación basada en 0 ⎕IO←0, que es predeterminada en muchos sistemas. Solicita dimensiones, luego lista adjunta de (nodo, coordenada).

⎕⊃↑,⍳⎕

Pruébalo en línea!

 solicitud de dimensiones

 generar una matriz de esa forma con cada elemento siendo los i ndices de ese elemento

, ravel (incluir en la lista de índices)

 convertir un nivel de profundidad a un nivel adicional de rango

⎕⊃ solicite la lista adjunta de (nodo, coordenada) y úsela para elegir un elemento de ese

Adán
fuente
1

Gelatina , 7 6 bytes

Œp⁴ị⁵ị

Pruébalo en línea!

Esto utiliza la indexación 1 para entrada y salida.

Cómo funciona

Œp⁴ị⁵ị
Œp      Cartesian product of the first input
        numbers are converted to 1-based ranges
  ⁴ị    index specified by second input
    ⁵ị  index specified by third input
Monja permeable
fuente
0

Pyth , 12 bytes

@.n]@*FUMQEE

Pruébalo en línea!

Cómo funciona

@.n]@*FUMQEE
       UMQ    map each element in the first input to
              [0,1,...,that element]
     *F       reduce by Cartesian product
    @     E   obtain index at second input
 .n]          listify and flatten
@          E  obtain index at third input
Monja permeable
fuente
0

R, 52 bytes

function(x,y,z,n,i)expand.grid(1:z,1:y,1:x)[n,4-i]-1

devuelve una función anónima, 1 indexada.

Por el ejemplo. expand.gridgenera la lista, pero el primer argumento varía el más rápido, por lo que tenemos que introducirlos en el orden inverso, es decir, z,y,x. Luego podemos simplemente indexar [n,4-i], donde 4-isea ​​necesario para el orden inverso, y restar 1 para asegurarnos de que se ejecutan 0:(x-1), etc.

Pruébalo en línea!

Giuseppe
fuente
0

JavaScript (ES6), 44 bytes

(a,n,i,g=j=>a[++j]?g(j)/a[j]|0:n)=>g(i)%a[i]

Sin golf:

(a,n,i)=>a.reduceRight(([n,...a],e)=>[n/e|0,n%e,...a],[n])[i+1]

Lamentablemente reduceson dos bytes más largos:

(a,n,i)=>a.reduce((r,d,j)=>j>i?r/d|0:r,n)%a[i]
Neil
fuente
Parece que se nos ocurrió la misma idea \ o /
Leaky Nun
@LeakyNun Bueno, en realidad no es sorprendente, dado cómo funciona la indexación.
Neil