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
fonte
Respostas:
MATL , 8 bytes
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
,2
etc; e a dimensão "x" é1
, "y" é2
etc.Experimente online!
Explicação
A chave é usar a função
X[
(correspondente aind2sub
Matlab ou Octave), que converte um índice linear em índices multidimensionais. No entanto, a ordem das dimensões, se o oposto definido no desafio, entãoP
(flip
) é necessária antes de chamar a função e novamente após concatenar (v
) suas saídas.fonte
Haskell , 45 bytes
(#)
recebe três argumentos e retorna um número inteiro, use as[2,3,4]#8$1
.Experimente online!
Como funciona
l
é a lista de coordenadas,n
o número do nó.l#n
é uma função que recebe o índice finali
.[2,3,4]
e o nó de exemplo8
, primeiro a cauda da lista é obtida, fornecendo[3,4]
. Então, isso éscan
ned desde o inícior
,div
identificando o número do nó por cada elemento consecutivamente, fornecendo a lista[0,2,8]
.[0,2,8]
eo originall=[2,3,4]
sãozip
pedwith
omod
operador de Ulus, dando[0,2,0]
.!!
operador de indexação de lista é parcialmente aplicado, com a função resultante pronta para receber o índice final.fonte
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ãoFinalmente,
⌷
pega o elemento no índice especificado. O lado esquerdo⎕
lê a terceira e a última entrada de STDIN efonte
Haskell,
38302928 bytesEle usa índices e coordenadas com base em 0 a partir de 1. Experimente on-line!
Transforme cada dimensão
x
da entrada em uma lista[1..x]
, por exemplo[2,3,4]
- ->[[1,2],[1,2,3],[1,2,3,4]]
.mapM
faz 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
89 bytes. Obrigado!fonte
mapM id.map f=mapM f
. E(`take`[0..])
é mais curto.l#n=(mapM(`take`[0..])l!!n!!)
é mais curto. (Aliás você não precisa of=
, as funções podem ser anônimas Oh, eu acho que você não está contando isso..)f=
era uma cópia e cole erro do TIO.Braquilog ,
2523 bytesExperimente online!
O segundo argumento é indexado em 1, os outros 2 são 0.
Explicação
fonte
Mathematica,
2623 bytesUsando 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 atributoFlat
.Exemplo:
fonte
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 elementofonte
Geléia ,
76 bytesExperimente online!
Isso usa a indexação 1 para entrada e saída.
Como funciona
fonte
Oitava , 63 bytes
Porta da minha resposta MATL.
Experimente online!
fonte
Pitão , 12 bytes
Experimente online!
Como funciona
fonte
R, 52 bytes
retorna uma função anônima, indexada em 1.
para o exemplo
expand.grid
gera a lista, mas o primeiro argumento varia mais rápido, então temos que inseri-los na ordem inversa, ou sejaz,y,x
,. Em seguida, podemos simplesmente indexar[n,4-i]
onde4-i
é necessário para a ordem inversa e subtrair 1 para garantir que eles sejam executados0:(x-1)
etc.Experimente online!
fonte
Java , 77 bytes
Experimente online!
fonte
JavaScript (ES6), 44 bytes
Ungolfed:
Infelizmente
reduce
é mais dois bytes:fonte
Python 3 , 57 bytes
Experimente online!
Garfo da minha resposta Java .
fonte