Detalhes
Escreva uma função ou programa que, dada uma matriz (ou lista), contendo apenas números inteiros, retorne ou produza uma matriz com todos os subelementos invertidos. Ou seja, inverta todos os elementos da matriz mais profunda, depois a segunda mais profunda etc. As dimensões não precisam ser especificadas, mas a função ou o programa deve funcionar com matrizes irregulares no formato nativo da sua linguagem de programação.
Exemplos
Este:
[[1,2], [3,4]]
Se tornaria este:
[[4,3], [2,1]]
Este:
[[[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9]],
[[10,11,12], [13,14,15], [16,17,18]],
[[19,20,21], [22,23,24], [25,26,27]],
[[28,29,30], [31,32,33], [34,35,36]],
[[37,38,39], [40,41,42], [43,44,45]],
[[46,47,48], [49,50,51], [52,53,54]]]
Se tornaria este:
[[[54,53,52], [51,50,49], [48,47,46]],
[[45,44,43], [42,41,40], [39,38,37]],
[[36,35,34], [33,32,31], [30,29,28]],
[[27,26,25], [24,23,22], [21,20,19]],
[[18,17,16], [15,14,13], [12,11,10]],
[[ 9, 8, 7], [ 6, 5, 4], [ 3, 2, 1]]]
Este:
[[[1,2]],
[[3,4], [5]],
[[6,7,8], [9], [10,11]],
[[[12,13], [14,15]], [16], [17,18,19,20]],
[21]]
Se tornaria este:
[[21],
[[20,19,18,17], [16], [[15,14], [13,12]]],
[[11,10], [9], [8,7,6]],
[[5], [4,3]],
[[2,1]]]
Bônus
Espero que isso encoraje respostas em algumas linguagens de programação orientadas a objetos ...
-50% Bytecount Se o seu programa pode tomar como entrada uma matriz (ou lista) com seus membros de vários tipos (eles podem estar na forma de objetos) e reverter com êxito todas as matrizes.
Este:
[["Foo",["Bar",1]],
2,
["Baz"],
[[["Qux"],3],3.14]]
Se tornaria este:
[[3.14,[3,["Qux"]]],
["Baz"],
2,
[[1,"Bar"],"Foo"]]
Respostas:
Pitão, 11 - 50% = 5,5 bytes
Experimente on-line: Demonstration ou Test Suite .
Isso define uma função
y
. Os 3 bytes adicionais<newline>yQ
simplesmente chamam a função com a lista de entrada e, portanto, não precisam ser contados no total de bytes.Explicação:
fonte
Dyalog APL , 14 - 50% = 7 bytes
⌽⍵
argumento reverso⍣(×|≡⍵)
se o argumento não for um átomo (sinal da profundidade [absoluta]) ...∇¨
... aplique a função a cada elemento (do argumento reverso).Se
⎕ML←3
(estilo IBM), que é o caso de sistemas que migraram do APL2, um byte pode ser salvo removendo|
.Experimente o APL online.
Por curiosidade, o int e float reversos propostos :
A função interna:
0::⌽⍵
se ocorrer algum erro, basta retornar o argumento revisado⍎⌽⍕
make para string, reverse, make into numberfonte
Prolog, 40 - 50% = 20 bytes
Isso chama recursivamente o predicado
a/2
commaplist/3
, para cada membro da lista, atéreverse/2
falhar (ou seja, o último elemento não era uma lista).fonte
Python 2, 40 - 50% = 20
Apenas algumas pequenas modificações necessárias da maneira básica de fazer isso são necessárias para obter o bônus. Usa o fato de que todas as listas são menores que a sequência vazia e todos os números são menores que a lista vazia.
Todos os casos de teste
fonte
f=lambda x:map(f,x)[::-1]if x>[]else x
.Emacs Lisp, 46 bytes * 0,5 = 23
Exemplo de uso:
(g '((1 2) 3 (four 5)))
->((5 four) 3 (2 1))
Abordagem recursiva clássica: se o argumento não for uma lista, mantenha-o inalterado; se for uma lista, mapeie a função no verso da lista.
fonte
Mathematica, 34/2 = 17 bytes
Ou apenas
Reverse//@#&
se você quiser uma tonelada de errosReverse
es em todos os lugares.fonte
Clojure 43/2 = 21,5 bytes
fonte
JavaScript ES6, 42 - 50% = 21 bytes
Minha pontuação é perfeita de várias maneiras. Implementa uma função
r
que se aplica recursivamente aos membros de sua entrada.Se assumirmos que nenhum objeto tem a propriedade
pop
, isso se tornará (31 - 50% = 15.5), graças a dev-null:Ou, se assumirmos que o objeto tem uma
reverse
propriedade sã , também poderíamos fazer isso (35 - 50% = 17,5):fonte
a.pop?a.reverse().map(r):a
. Supondo que não há necessidade de manipularvoid 0
objetos personalizados.Lua,
11199 * .5 =55,549,5 bytesBom recursão
fonte
CJam, 20 bytes * 50% = 10
Define o bloco nomeado
F
que pode ser aplicado a uma matriz no topo da pilha (ou qualquer outra coisa, nesse caso, é um não operacional).Teste aqui.
fonte
Braquilog , 5 - 50% = 2,5 bytes
Experimente online!
Como
↔
também podemos reverter seqüências de caracteres e números inteiros, temos que explicitamente falhar as não listas comċ
.fonte
Wolfram Language (Mathematica) , 23 -50% = 11,5 bytes
Experimente online!
List
s no Mathematica ({...}
) são equivalentes aList[...]
.@*
é o operador de composição, portanto, substituir cada ocorrência deList
porReverse@*List
reverte todas as listas que ocorrem na entrada (Reverse@*List[...]
=Reverse[{...}]
).24 -50% = 12 bytes
Experimente online!
Não funciona apenas em
List
s.fonte
Clojure, 38 bytes
(e um bônus, eu acho, mas o Clojure é uma linguagem dinâmica, por isso é de graça)
Este é um bom começo, mas não empregou essas otimizações:
fn
vez de uma nomeada comdefn
. Mas ainda precisamos de um nome com "escopo"f
para recursãoseq?
vez decoll?
(into () ...)
vez dereverse
x
antes do mapeamento, não precisamos de tantos espaçosfonte
Rubi , 32 - 50% = 16 bytes
Função recursiva. Usar
rescue
para capturar oNoMethodError
que dispara ao tentarreverse
um número oumap
uma sequência acaba por ser 2 bytes mais curto do que verificar se a entrada é uma matriz viaa==[*a]
.Experimente online!
fonte