Dada uma matriz ortogonal N-dimensional (não irregular) de números inteiros não negativos e uma indicação de quais dimensões reverter, retorne a matriz, mas invertida ao longo dessas dimensões. A indicação pode ser dada como uma lista booleana de comprimento N ou uma lista de um subconjunto das primeiras N dimensões indexadas de 0 ou 1.
Por favor, indique seus formatos de entrada. As explicações de código são muito apreciadas.
Exemplo percorrido
Recebemos o array 3D de 2 camadas e 3 linhas e 4 colunas
[[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9,10,11,12]],
[[13,14,15,16],
[17,18,19,20],
[21,22,23,24]]]
e um dos
[true,false,true]
(Lista booleana)
[0,2]
(lista indexada 0)
[1,3]
(lista indexada 1)
Precisamos reverter a ordem da primeira e da última dimensão, que são as camadas e os elementos das linhas (as colunas), mas não as linhas de cada camada. Primeiro (a ordem real em que você faz isso não importa), invertemos a ordem das camadas:
[[[13,14,15,16],
[17,18,19,20],
[21,22,23,24]],
[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9,10,11,12]]]
e então invertemos a ordem dos elementos de cada linha:
[[[16,15,14,13],
[20,19,18,17],
[24,23,22,21]],
[[ 4, 3, 2, 1],
[ 8, 7, 6, 5],
[12,11,10, 9]]]
Casos de teste
[[[1,2,3,4],[5,6,7,8],[9,10,11,12]],[[13,14,15,16],[17,18,19,20],[21,22,23,24]]]
[true,false,true]
/ [0,2]
/ [1,3]
↓
[[[16,15,14,13],[20,19,18,17],[24,23,22,21]],[[4,3,2,1],[8,7,6,5],[12,11,10,9]]]
[[1,2,3],[4,5,6]]
[true,false]
/ [0]
/ [1]
↓
[[4,5,6],[1,2,3]]
[[1],[4]]
[true,false]
/ [0]
/ [1]
↓
[[4],[1]]
[[7]]
[true,true]
/ [0,1]
/ [1,2]
↓
[[7]]
[1,2,3,4,5,6,7]
[true]
/ [0]
/ [1]
↓
[7,6,5,4,3,2,1]
[]
[true]
/ [0]
/ [1]
↓
[]
[[],[]]
[false,false]
/ []
/ []
↓
[[],[]]
[[[[3,1,4,1],[5,9,2,6]],[[5,3,5,8],[9,7,9,3]]],[[[2,3,8,4],[6,2,6,4]],[[3,3,8,3],[2,7,9,5]]]]
[true,false,true,true]
/ [0,2,3]
/ [1,3,4]
↓
[[[[4,6,2,6],[4,8,3,2]],[[5,9,7,2],[3,8,3,3]]],[[[6,2,9,5],[1,4,1,3]],[[3,9,7,9],[8,5,3,5]]]]
[[[[3,1,4,1],[5,9,2,6]],[[5,3,5,8],[9,7,9,3]]],[[[2,3,8,4],[6,2,6,4]],[[3,3,8,3],[2,7,9,5]]]]
[false,true,false,false]
/ [1]
/ [2]
↓
[[[[5,3,5,8],[9,7,9,3]],[[3,1,4,1],[5,9,2,6]]],[[[3,3,8,3],[2,7,9,5]],[[2,3,8,4],[6,2,6,4]]]]
[[[[3,1,4,1],[5,9,2,6]],[[5,3,5,8],[9,7,9,3]]],[[[2,3,8,4],[6,2,6,4]],[[3,3,8,3],[2,7,9,5]]]]
[false,false,false,false]
/ []
/ []
↓
[[[[3,1,4,1],[5,9,2,6]],[[5,3,5,8],[9,7,9,3]]],[[[2,3,8,4],[6,2,6,4]],[[3,3,8,3],[2,7,9,5]]]]
reverse
funciona em matrizes arbitrárias, mas se preocupa apenas com o primeiro nível), genéricos ou classes recursivas (classes de tipo / objeto, dependendo da funcionalidade ou OOP, mas caso de uso semelhante). Os dois últimos são geralmente muito mais detalhados.Respostas:
APL (Dyalog) ,
209 bytesExperimente online!
Quão?
/
- reduzir - pegue o elemento mais à direita na entrada (a matriz) e aplique a função com o próximo elemento à esquerda como argumento à esquerda{⌽[⍺]⍵}
- reverter na dimensãoleft argument
(⍺
)⊃
- achatar a matriz fechadafonte
APL (Dyalog Unicode) , 9 bytes
Experimente online!
Parece que Uriel foi editado em algo quase idêntico primeiro, mas eu o desenvolvi de forma independente. Eu pensei que este formato de entrada é inválido.
fonte
JavaScript (Node.js) ,
58555345 bytesGuardado 8 bytes graças a @Shaggy
Recebe entrada como
(indications)(array)
, em que indicações é uma lista booleana.Experimente online!
Comentado
fonte
r
no lugar der||-1
parece funcionar .f=([r,...b])=>a=>1/r?a.sort(_=>r).map(f(b)):a
? No meu telefone, não é possível testar corretamente.Python 2 ,
5655 bytesExperimente online!
fonte
Geléia , 8 bytes
Leva uma lista de dimensões indexada em 0.
Experimente online!
Como funciona
fonte
R ,
807877 bytesCrie a chamada para o extrator de R
[
criando uma lista de sequências revertidas onde indicado. Na verdade, eles contêm zeros, que são ignorados silenciosamente. Adrop=F
é necessária para impedir a queda padrão do R de dimensões. Precisamos darev
chamada para o indicador de reversão de dimensão, devido à maneira como R preenche matrizes.-2 graças @Giuseppe
-1 usando atribuição em linha.
Experimente online!
Menção honrosa a @JayCe, que apresentou uma variação que obtém o mesmo resultado no mesmo comprimento:
Experimente online!
fonte
do.call
- ele é mais comprido em 83 bytes, ainda o postando aqui como um comentário para referência: TIOHaskell,
120119 bytesa função f pega a lista N-dimensional e uma lista de bool como entrada
fonte
F r
.05AB1E ,
231110 bytesExperimente online.
-12 bytes graças a @ Mr.Xcoder .
Insira como valores de verdade indexados a 0 (ou seja
[0,2,3]
), que é a primeira entrada.Explicação:
Por exemplo: se a lista de entrada de índices for
[0,2,3]
, ela criará a seguinte sequência:Qual irá:
Resposta original de 23 bytes:
Entrada como lista booleana (ie
[1,0,1,1]
), que é a primeira entrada.Experimente online.
Explicação:
Por exemplo: Se a lista de entrada booleana for
[1,0,1,1]
, ela criará a seguinte string:Qual irá:
fonte
'x*
o trabalho de repetirx
n quantidade de vezes sem usar ums
wap, mas ele não funciona com'€*
.. EDIT:? Só no legado embora ..€
ainda ser analisado como operador, mesmo que esteja em um literal de caractere? Não tenho certeza para ser honesto. Na nova versão, no*
entanto , não se comporta da mesma maneira.JavaScript (Node.js) , 60 bytes
Uma abordagem diferente (recursiva). não bate a resposta de Arnauld ... ainda ....
Toma a entrada como
array, boolean list
fonte
Pitão , 15 bytes
Experimente aqui!
Irritantemente, manipular o caso da lista de dimensões vazias leva não menos de 2 bytes ... Prefiro usar
ss
no lugar dejk.n
but: | Supõe que a lista a ser transformada possa ser fornecida na sintaxe Pyth nativa, como uma sequência. Eu escrevi um conversor para a sintaxe Pyth para facilitar o teste. No infeliz caso em que o OP opte por não permitir isso, um operador de 17 bytes o "corrigirá":fonte
Japonês ,
1514 bytesCom alguma inspiração da solução de Arnauld .
Toma as indicações como a primeira entrada, como uma matriz booleana de
1
s e0
s.Tente
Explicação
fonte
Limpo ,
122112 bytesExperimente online!
Uma versão da resposta de Damien Haskell usando o sistema de golfe do tipo Clean. Realmente mostra as extensas semelhanças entre os dois idiomas.
Explicado:
fonte
Ruby , 54 bytes
Experimente online!
fonte
(não testado, mas acho correto. A saída do compilador asm se parece com o que eu espero. Será atualizada se / quando encontrar tempo para escrever um equipamento de teste que crie e imprima essa estrutura de dados.)
GNU C ++ (portátil) 148 bytes
GNU C ++ (int = ponteiro e cai de uma função não nula UB) 120 bytes
Esta é uma estrutura do contador de profundidade, comprimento, matriz de {números inteiros ou ponteiros}. No nível inferior desta árvore não binária (
depth==0
), a matriz deintptr_t
é uma matriz de números inteiros. Em níveis mais altos, éstruct m*
armazenadointptr_t
. Traversal leva um elenco.A
R()
função reversa é uma função de membro porque salva a declaração de um argumento e salva muitap->
sintaxe para referenciar os membros da estrutura versus othis
ponteiro implícito .A única extensão GNU é o membro da matriz flexível C99 para criar uma estrutura de tamanho variável , suportada no C ++ como uma extensão GNU. Eu poderia ter usado um
*a
membro apontando para uma matriz alocada separadamente e ter isso como simples ISO C ++. (E isso realmente salvaria um byte sem exigir outras alterações). Eu escrevi isso como uma implementação de maquete / referência para uma versão asm.A versão mais curta com apenas
int
também declaraR()
como retornando emint
vez devoid
. Esses dois bits de hackery não têm relação; esta é apenas a versão "funciona em pelo menos uma implementação".Ele deve funcionar bem em destinos de 32 bits (onde
int
pode conter um ponteiro), desde que você compile com o gcc7 ou mais antigo ou desative as otimizações. (gcc8 -O3
assume que a execução não pode chegar ao fundo de uma não-void
função porque isso seria UB.) x86gcc -m32 -O3
deve funcionar bem com o gcc7, como no Godbolt, onde eu incluí as duas versões (em diferentes espaços de nome) e uma versão sem função de membro .Ungolfed
A função arg,,
int r[]
é uma matriz de 0 / números inteiros diferentes de zero que indica se uma determinada profundidade deve ser trocada, começando com o nível mais externo.Quando recursamos, passamos
r+1
, portanto, verificar a profundidade atual é sempre*r
.Uma versão anterior passou apenas
r
inalterada e verificadar[d]
. Com um membro de matriz flexível, eu precisava armazenar algum tipo de indicador de último nível, porquea[]
não é um ponteiro, é uma matriz verdadeira, sem indireção. Mas com umintptr_t *a
membro, eu não poderia ter isso apenasnullptr
no nível da folha, porque quero que sejam valores.A reversão do nível atual antes ou depois da travessia da árvore não deve importar. Eu não tentei fazer isso durante .
Não tenho certeza de que
std::reverse
vale a contagem de bytes versus um loop manual, especialmente se eu puder trabalhar chamandoR()
cada ponteiro exatamente uma vez em algum lugar dentro desse loop. Mas apenas sed!=0
fonte
Mathematica, 7 bytes
Função. Dê a ele uma lista aninhada como o primeiro argumento e a lista baseada em 1 de níveis / dimensões para reverter como o segundo argumento. Experimente online!
Finalmente, outro desafio em que o Mathematica está embutido!
fonte