Detalles
Escriba una función o programa que, dada una matriz (o lista), que contiene solo enteros, devuelve o genera una matriz con todos los subelementos invertidos. Es decir, invierta todos los elementos de la matriz más profunda, luego la segunda más profunda, etc. No es necesario especificar las dimensiones, pero la función o el programa deben funcionar para matrices irregulares en el formato nativo de su lenguaje de programación.
Ejemplos
Esta:
[[1,2], [3,4]]
Se convertiría en esto:
[[4,3], [2,1]]
Esta:
[[[ 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 convertiría en esto:
[[[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]]]
Esta:
[[[1,2]],
[[3,4], [5]],
[[6,7,8], [9], [10,11]],
[[[12,13], [14,15]], [16], [17,18,19,20]],
[21]]
Se convertiría en esto:
[[21],
[[20,19,18,17], [16], [[15,14], [13,12]]],
[[11,10], [9], [8,7,6]],
[[5], [4,3]],
[[2,1]]]
Prima
Con suerte, esto alentará las respuestas en algunos lenguajes de programación orientados a objetos ...
-50% Bytecount Si su programa puede tomar como entrada una matriz (o lista) con sus miembros de varios tipos (estos pueden ser en forma de objetos) y revertir con éxito todas las matrices.
Esta:
[["Foo",["Bar",1]],
2,
["Baz"],
[[["Qux"],3],3.14]]
Se convertiría en esto:
[[3.14,[3,["Qux"]]],
["Baz"],
2,
[[1,"Bar"],"Foo"]]
Respuestas:
Pyth, 11 - 50% = 5.5 bytes
Pruébelo en línea: Demostración o Test Suite .
Esto define una función
y
. Los 3 bytes adicionales<newline>yQ
simplemente llaman a la función con la lista de entrada y, por lo tanto, no es necesario contarlos para el total de bytes.Explicación:
fuente
Dyalog APL , 14-50 % = 7 bytes
⌽⍵
argumento inverso⍣(×|≡⍵)
si el argumento no es un átomo (signo de la profundidad [absoluta]) ...∇¨
... aplique la función a cada elemento (del argumento inverso).Si
⎕ML←3
(estilo IBM), como es el caso en los sistemas que migraron desde APL2, se puede guardar un byte al eliminarlo|
.Prueba APL en línea.
Por curiosidad, la inversión propuesta de int y float:
La función interna:
0::⌽⍵
si ocurre algún error, simplemente devuelva el argumento invertido⍎⌽⍕
make en cadena, revierta, haga en númerofuente
Prólogo, 40 - 50% = 20 bytes
Esto recursivamente llama al predicado
a/2
conmaplist/3
, para cada miembro de la lista, hasta quereverse/2
falla (es decir, el último elemento no era una lista).fuente
Python 2, 40 - 50% = 20
Solo se necesitan algunas modificaciones menores de la forma básica para hacerlo para obtener la bonificación. Utiliza el hecho de que todas las listas son menores que la cadena vacía y todos los números son menores que la lista vacía.
Todos los casos de prueba
fuente
f=lambda x:map(f,x)[::-1]if x>[]else x
.Emacs Lisp, 46 bytes * 0.5 = 23
Ejemplo de uso:
(g '((1 2) 3 (four 5)))
->((5 four) 3 (2 1))
Enfoque recursivo clásico: si el argumento no es una lista, no lo modifique, si es una lista, asigne la función al reverso de la lista.
fuente
Mathematica, 34/2 = 17 bytes
O simplemente
Reverse//@#&
si quieres un montón de errores yReverse
s en todas partes.fuente
Clojure 43/2 = 21.5 bytes
fuente
JavaScript ES6, 42 - 50% = 21 bytes
Mi puntaje es perfecto en muchos sentidos. Implementa una función
r
que se aplica recursivamente a los miembros de su entrada.Si suponemos que ningún objeto tiene la propiedad
pop
, esto se convierte en (31 - 50% = 15.5), gracias a dev-null:O, si suponemos que el objeto tiene una
reverse
propiedad sensata , podríamos hacer eso también (35 - 50% = 17.5):fuente
a.pop?a.reverse().map(r):a
. Asumiendo que no hay necesidad de manipularvoid 0
y personalizar objetos.Lua,
11199 * .5 =55.549.5 bytesBuen poco de recursividad
fuente
CJam, 20 bytes * 50% = 10
Define el bloque con nombre
F
que se puede aplicar a una matriz en la parte superior de la pila (o cualquier otra cosa, en cuyo caso es un no-op).Pruébalo aquí.
fuente
Brachylog , 5 - 50% = 2.5 bytes
Pruébalo en línea!
Como
↔
también puede revertir cadenas y enteros, tenemos que fallar explícitamente con las no listasċ
.fuente
Wolfram Language (Mathematica) , 23 -50% = 11.5 bytes
Pruébalo en línea!
List
s en Mathematica ({...}
) son equivalentes aList[...]
.@*
es el operador de composición, por lo que al reemplazar cada aparición deList
conReverse@*List
invierte cada lista que ocurre en la entrada (Reverse@*List[...]
=Reverse[{...}]
).24 -50% = 12 bytes
Pruébalo en línea!
No solo funciona en
List
s.fuente
Clojure, 38 bytes
(y una bonificación, supongo, pero Clojure es un lenguaje dinámico, por lo que es gratis)
Este es un buen comienzo, pero no empleó estas optimizaciones:
fn
lugar de una con nombredefn
. Pero aún necesitamos un nombre "con alcance"f
para la recursividadseq?
lugar decoll?
(into () ...)
lugar dereverse
x
antes del mapeo, no necesitamos tantos espacios entoncesfuente
Ruby , 32 - 50% = 16 bytes
Función recursiva. Usar
rescue
para detectar elNoMethodError
que se dispara al intentarreverse
un número omap
una cadena resulta ser 2 bytes más corto que verificar si la entrada es una matriz víaa==[*a]
.Pruébalo en línea!
fuente