Dado un conjunto ortogonal N-dimensional (no desigual) de enteros no negativos, y una indicación de qué dimensiones invertir, devuelve el conjunto pero invertido a lo largo de esas dimensiones. La indicación puede darse como una lista booleana de longitud N o una lista de un subconjunto de las primeras N dimensiones indexadas desde 0 o 1.
Por favor, indique sus formatos de entrada. Las explicaciones del código son muy apreciadas.
Ejemplo de recorrido
Se nos proporciona la matriz 3D de 2 capas, 3 filas y 4 columnas.
[[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9,10,11,12]],
[[13,14,15,16],
[17,18,19,20],
[21,22,23,24]]]
y uno de
[true,false,true]
(Lista booleana)
[0,2]
(lista indexada 0)
[1,3]
(lista indexada 1)
Necesitamos invertir el orden de las dimensiones primera y última, es decir, las capas y los elementos de las filas (las columnas), pero no las filas de cada capa. Primero (el orden real en el que haces esto no importa) invertimos el orden de las capas:
[[[13,14,15,16],
[17,18,19,20],
[21,22,23,24]],
[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9,10,11,12]]]
y luego revertimos el orden de los elementos de cada fila:
[[[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 prueba
[[[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 en matrices arbitrarias pero solo se preocupa por el primer nivel), genéricos o clases recursivas (clases de tipo / objeto dependiendo de la funcionalidad o POO, pero caso de uso similar). Los dos últimos suelen ser mucho más detallados.Respuestas:
APL (Dyalog) ,
209 bytesPruébalo en línea!
¿Cómo?
/
- reducir - tomar el elemento más a la derecha en la entrada (la matriz) y aplicar la función con el siguiente elemento izquierdo como argumento izquierdo{⌽[⍺]⍵}
- invertir en la dimensiónleft argument
(⍺
)⊃
- aplanar la matriz cerradafuente
APL (Dyalog Unicode) , 9 bytes
Pruébalo en línea!
Parece que Uriel editó algo casi idéntico primero, pero lo desarrollé de forma independiente. Pensé que este formato de entrada no es válido.
fuente
JavaScript (Node.js) ,
58555345 bytesGuardado 8 bytes gracias a @Shaggy
Toma la entrada como
(indications)(array)
, donde las indicaciones son una lista booleana.Pruébalo en línea!
Comentado
fuente
r
lugar der||-1
parece funcionar .f=([r,...b])=>a=>1/r?a.sort(_=>r).map(f(b)):a
? En mi teléfono, así que no puedo probarlo correctamente.Python 2 ,
5655 bytesPruébalo en línea!
fuente
Jalea , 8 bytes
Toma una lista indexada de 0 de dimensiones.
Pruébalo en línea!
Cómo funciona
fuente
R ,
807877 bytesCree la llamada al extractor de R
[
creando una lista de secuencias invertidas donde se indica. En realidad contienen ceros, que se ignoran en silencio. Sedrop=F
necesita para evitar la caída predeterminada de dimensiones de R. Necesitamos larev
llamada al indicador de inversión de dimensión, debido a la forma en que R llena las matrices.-2 gracias @Giuseppe
-1 utilizando la asignación en línea.
Pruébalo en línea!
Mención de honor a @JayCe, quien presentó una variación que obtiene el mismo resultado en la misma duración:
Pruébalo en línea!
fuente
do.call
; es más largo en 83 bytes, todavía publico esto aquí como comentario para referencia: TIOHaskell,
120119 bytesla función f toma la lista N-dimensional y una lista de bool como entrada
fuente
F r
.05AB1E ,
231110 bytesPruébalo en línea.
-12 bytes gracias a @ Mr.Xcoder .
Ingrese como valores de verdad indexados en 0 (es decir
[0,2,3]
), que es la primera entrada.Explicación:
Por ejemplo: si la lista de entrada de índices es
[0,2,3]
, creará la siguiente cadena:Que lo hará:
Respuesta original de 23 bytes:
Ingrese como boolean-list (ie
[1,0,1,1]
), que es la primera entrada.Pruébalo en línea.
Explicación:
Por ejemplo: si la lista de entrada booleana es
[1,0,1,1]
, creará la siguiente cadena:Que lo hará:
fuente
'x*
funciona repetirx
n cantidad de veces sin usar uns
wap, pero no funciona'€*
? ... EDITAR: solo en el legado ...€
todavía se analiza como un operador a pesar de que está en un carácter literal? No estoy seguro de ser honesto. En la nueva versión,*
no se comporta de la misma manera.JavaScript (Node.js) , 60 bytes
Un enfoque diferente (recursivo). no supera la respuesta de Arnauld ... todavía ...
Toma la entrada como
array, boolean list
fuente
Pyth , 15 bytes
Pruébalo aquí!
Molesto, manejar el caso de la lista de dimensiones vacía toma no menos de 2 bytes ... Prefiero usar
ss
en lugar dejk.n
pero: | Asume que la lista a transformar se puede dar en sintaxis nativa de Pyth, como una cadena. He escrito un convertidor a la sintaxis de Pyth para facilitar las pruebas. En el desafortunado caso de que el OP opta por no permitir esto, un 17-byter lo "arreglará":fuente
Japt ,
1514 bytesCon un poco de inspiración de la solución de Arnauld .
Toma las indicaciones como la primera entrada, como una matriz booleana de
1
sy0
s.Intentalo
Explicación
fuente
Limpio ,
122112 bytesPruébalo en línea!
Una versión de la respuesta de Damien Haskell usando el sistema de tipo golfista de Clean. Realmente muestra las amplias similitudes entre los dos idiomas.
Explicado:
fuente
Ruby , 54 bytes
Pruébalo en línea!
fuente
(no probado pero creo que es correcto. La salida del compilador asm se parece a lo que esperaba. Se actualizará si encuentro tiempo para escribir un arnés de prueba que cree e imprima esta estructura de datos).
GNU C ++ (portátil) 148 bytes
GNU C ++ (int = puntero y se cae de una función no vacía UB) 120 bytes
Esta es una estructura de contador de profundidad, longitud, matriz de {enteros o punteros}. En el nivel inferior de este árbol no binario (
depth==0
), la matriz deintptr_t
es una matriz de enteros. En niveles superiores, sestruct m*
almacena enintptr_t
. El recorrido toma un yeso.La
R()
función inversa es una función miembro porque ahorra declarar un argumento y una granp->
sintaxis para hacer referencia a los miembros de la estructura frente althis
puntero implícito .La única extensión de GNU es el miembro de matriz flexible C99 para hacer una estructura de tamaño variable , que es compatible con C ++ como una extensión de GNU. Podría haber usado un
*a
miembro que apunta a una matriz asignada por separado y que esto sea ISO C ++ simple. (Y eso realmente ahorraría un byte sin requerir ningún otro cambio). Escribí esto como una implementación de maqueta / referencia para una versión asm.La versión más corta con solo
int
también declaraR()
que regresa enint
lugar devoid
. Estos dos bits de piratería informática no están relacionados; esta es solo la versión "funciona en al menos una implementación".Debería funcionar bien en destinos de 32 bits (donde
int
puede contener un puntero), siempre que compile con gcc7 o anterior, o desactive las optimizaciones. (gcc8 -O3
asume que la ejecución no puede llegar al final de una novoid
función porque sería UB). x86gcc -m32 -O3
debería funcionar bien con gcc7, como en Godbolt, donde incluí ambas versiones (en diferentes espacios de nombres) y una versión sin función miembro .Sin golf
La función arg,
int r[]
es una matriz de enteros 0 / distintos de cero que indican si se debe intercambiar una profundidad dada, comenzando con el nivel más externo.Cuando repetimos, pasamos
r+1
, por lo que siempre es necesario verificar la profundidad actual*r
.Una versión anterior simplemente pasó
r
sin cambios y se verificór[d]
. Con un miembro de matriz flexible, necesitaba almacenar algún tipo de indicador de último nivel porquea[]
no es un puntero, es una matriz verdadera sin direccionamiento indirecto. Pero con unintptr_t *a
miembro, no podría simplemente ser esonullptr
para el nivel de la hoja, porque quiero que sean valores.Invertir el nivel actual antes o después del recorrido del árbol no debería importar. No intenté hacerlo durante .
No estoy seguro de que
std::reverse
valga la pena contar los bytes frente a un bucle manual, especialmente si puedo trabajar invocandoR()
cada puntero exactamente una vez dentro de ese bucle. Pero solo sid!=0
fuente
Mathematica, 7 bytes
Función. Déle una lista anidada como primer argumento, y la lista basada en 1 de niveles / dimensiones para invertir como segundo argumento.Pruébalo en línea!
Finalmente, ¡otro desafío donde Mathematica tiene un proyecto incorporado!
fuente