Avaliar índice de coordenadas multidimensionais

9

Uma coleção de coordenadas dimensionais em N é fornecida. Um exemplo está abaixo:

{2,3,4}

Isso pode ser pensado como uma matriz tridimensional com 2x, 3y e 4z; pode haver qualquer número de dimensões. No exemplo, existem 24 nós no total. Cada nó pode ser indexado usando {x, y, z}. Para acessar o quinto nó, os índices fornecidos seriam {0, 1, 0} com base na tabela abaixo.

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

O objetivo deste aplicativo é trabalhar para trás para determinar um índice se for fornecido um número de nó.

Se solicitado o índice "y" do 8º nó, o programa deve imprimir "2".

Com a seguinte entrada fornecida:

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

O seguinte deve ser impresso:

2

Você pode supor que a entrada será fornecida de alguma maneira conveniente no idioma de sua escolha e não requer verificação de limites. Por exemplo, você pode assumir que o índice de escolha fornecido ("y" no exemplo) é válido com relação às coordenadas fornecidas. Você pode usar a indexação baseada em 0 ou 1; o exemplo presume 0 com base.

Este é o inverso desta pergunta: Índice de uma matriz multidimensional

Mark Johnson
fonte
11
Talvez adicione alguns casos de teste
Luis Mendo
11
Podemos deixar as coordenadas correrem de 1 a x em vez de 0 a x-1? Portanto, o nó # 0 seria (1,1,1) e o nó 23 (2,3,4).
Nimi
@nimi Sim, 1 indexação baseada está bem.
Mark Johnson

Respostas:

4

MATL , 8 bytes

PiX[vPi)

Isso usa a indexação baseada em 1 para o nó e para as dimensões. Então os primeiros nós são 1, 2etc; e a dimensão "x" é 1, "y" é 2etc.

Experimente online!

Explicação

A chave é usar a função X[(correspondente a ind2subMatlab ou Octave), que converte um índice linear em índices multidimensionais. No entanto, a ordem das dimensões, se o oposto definido no desafio, então P( flip) é necessária antes de chamar a função e novamente após concatenar ( v) suas saídas.

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
fonte
3

Haskell , 45 bytes

(#)recebe três argumentos e retorna um número inteiro, use as [2,3,4]#8$1.

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

Experimente online!

Como funciona

  • lé a lista de coordenadas, no número do nó. l#né uma função que recebe o índice final i.
  • Dada a lista [2,3,4]e o nó de exemplo 8, primeiro a cauda da lista é obtida, fornecendo [3,4]. Então, isso é scanned desde o início r, dividentificando o número do nó por cada elemento consecutivamente, fornecendo a lista [0,2,8].
  • Em seguida, a lista [0,2,8]eo original l=[2,3,4]são zipped witho modoperador de Ulus, dando [0,2,0].
  • Por fim, o !!operador de indexação de lista é parcialmente aplicado, com a função resultante pronta para receber o índice final.
Ørjan Johansen
fonte
3

APL (Dyalog Classic) , 5 bytes

⎕⌷⎕⊤⎕

Não, você não está perdendo uma fonte. É assim que deve parecer.

Este é um programa REPL que recebe informações do STDIN: o número do nó, as dimensões e o índice (nessa ordem). O último pode ser baseado em 0 ou 1, dependendo do valor de ⎕IO.

Experimente online!

Como funciona

A indexação de matriz multidimensional é essencialmente a conversão de bases mistas, o que a primeira parte do desafio pede. Cada ocorrência de lê e avalia uma linha de STDIN, então

        
⎕:
      8
⎕:
      2 3 4
0 2 0

Finalmente, pega o elemento no índice especificado. O lado esquerdo lê a terceira e a última entrada de STDIN e

        (0 2 0)
⎕:
      1
2
Dennis
fonte
A conversão de base mista ataca novamente!
Adám
3

Haskell, 38 30 29 28 bytes

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

Ele usa índices e coordenadas com base em 0 a partir de 1. Experimente on-line!

Transforme cada dimensão xda entrada em uma lista [1..x], por exemplo [2,3,4]- -> [[1,2],[1,2,3],[1,2,3,4]]. mapMfaz uma lista de todas as n-tuplas possíveis onde o primeiro elemento é retirado da primeira lista, etc. Duas vezes !!para indexar a n-tupla e a dimensão.

Edit: @ Ørjan Johansen salvou 8 9 bytes. Obrigado!

nimi
fonte
Ooh, esperto! Mas mapM id.map f=mapM f. E (`take`[0..])é mais curto.
Ørjan Johansen
@ ØrjanJohansen: 8 bytes, isso é enorme! Muito obrigado! Ainda aguardando uma resposta do OP se coordenadas baseadas em 1 forem permitidas.
nimi 5/05
Além disso, l#n=(mapM(`take`[0..])l!!n!!)é mais curto. (Aliás você não precisa o f=, as funções podem ser anônimas Oh, eu acho que você não está contando isso..)
Ørjan Johansen
@ ØrjanJohansen: Obrigado novamente. A f=era uma cópia e cole erro do TIO.
Nimi 5/05
2

Braquilog , 25 23 bytes

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

Experimente online!

O segundo argumento é indexado em 1, os outros 2 são 0.

Explicação

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
fonte
1

Mathematica, 26 23 bytes

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

Usando indexação baseada em 1 para entrada e indexação baseada em 0 para saída.

Por que Or? Uma vez que é a mais curta incorporada na função com o atributo Flat.

Exemplo:

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

Out[1]= 2
alefalpha
fonte
1

APL (Dyalog) , 6 bytes

Para obter a indexação baseada em 0 ⎕IO←0, que é padrão em muitos sistemas. Solicita dimensões e lista anexa de (nó, coordenada).

⎕⊃↑,⍳⎕

Experimente online!

 solicitação de dimensões

 gerar uma matriz de forma que com cada item sendo as i ndices para esse item

, ravel (transformar em lista de índices)

 converter um nível de profundidade em um nível adicional de classificação

⎕⊃ solicitar a lista fechada de (nó, coordenada) e usá-lo para selecionar um elemento

Adão
fonte
1

Geléia , 7 6 bytes

Œp⁴ị⁵ị

Experimente online!

Isso usa a indexação 1 para entrada e saída.

Como 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
Freira Furada
fonte
0

Oitava , 63 bytes

function z=f(s,n,d)
[c{nnz(s):-1:1}]=ind2sub(flip(s),n);z=c{d};

Porta da minha resposta MATL.

Experimente online!

Luis Mendo
fonte
0

Pitão , 12 bytes

@.n]@*FUMQEE

Experimente online!

Como 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
Freira Furada
fonte
0

R, 52 bytes

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

retorna uma função anônima, indexada em 1.

para o exemplo expand.gridgera a lista, mas o primeiro argumento varia mais rápido, então temos que inseri-los na ordem inversa, ou seja z,y,x,. Em seguida, podemos simplesmente indexar [n,4-i]onde 4-ié necessário para a ordem inversa e subtrair 1 para garantir que eles sejam executados 0:(x-1)etc.

Experimente online!

Giuseppe
fonte
0

Java , 77 bytes

int f(int[]a,int m,int n){for(int i=a.length-1;i>n;m/=a[i--]);return m%a[n];}

Experimente online!

Freira Furada
fonte
0

JavaScript (ES6), 44 bytes

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

Ungolfed:

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

Infelizmente reduceé mais dois bytes:

(a,n,i)=>a.reduce((r,d,j)=>j>i?r/d|0:r,n)%a[i]
Neil
fonte
Parece que tivemos a mesma ideia \ o /
Leaky Nun 6/17
@LeakyNun Bem, na verdade não é surpreendente, dado o funcionamento da indexação.
Neil