Anteriormente definí el proceso de aplastar una matriz
En un flechazo leemos la matriz de izquierda a derecha. Si en un momento nos encontramos con dos del mismo elemento en una fila, eliminamos el primero y duplicamos el segundo.
Por ejemplo, aquí está el proceso de aplastar la siguiente matriz
[5,2,2,4]
^
[5,2,2,4]
^
[5,2,2,4]
^
[5,4,4]
^
[5,4,4]
^
[5,8]
^
Tenga en cuenta que el mismo elemento se puede contraer varias veces. En el ejemplo 2,2,4
se colapsó 8
en una sola pasada.
Ahora aplastar matrices es fácil, lo difícil es deshacerlas. Su tarea es tomar una matriz de enteros positivos como entrada y salida de la matriz más grande que puede formar la entrada cuando se aplasta repetidamente. Por ejemplo, la matriz [4]
se forma por trituración, [2,2]
que a su vez se forma por trituración [1,1,1,1]
. Dado que no podemos tener valores no enteros, [1,1,1,1]
no podemos destrabarnos más y por eso es nuestra respuesta.
Nunca recibirá un 0
en su matriz de entrada porque tales matrices se pueden expandir indefinidamente. Nunca recibirá un caso con dos del mismo número impar uno al lado del otro, tales casos no pueden ser el resultado de un aplastamiento.
Este es el código de golf, por lo que las respuestas se puntuarán con el tamaño de su fuente medido en bytes, siendo mejores menos bytes.
Antes de comenzar a responder, solo quiero decir que este desafío es significativamente más difícil de lo que parece. Verifique su intuición a medida que avanza y asegúrese de que su respuesta pase todos los casos de prueba.
Casos de prueba
[] -> []
[5] -> [5]
[6] -> [3,3]
[8] -> [1,1,1,1,1,1,1,1]
[4,8] -> [1,1,1,1,1,1,1,1,1,1,2]
[2,8] -> [1, 1, 1, 1, 2, 1, 1, 1, 1]
[4,4] -> [1,1,1,1,1,1,1,1]
fuente
[1,1,1,1,1,1,1,1,1,1,2]
producir en[4, 8]
lugar de[8, 4]
? debe estar presente[1,>1,1,1,1,1,1,1,1,1,2]
,[2,1,>1,1,1,1,1,1,1,2]
,[2,>2,1,1,1,1,1,1,2]
,[4,1,>1,1,1,1,1,2]
,[4,2,1,>1,1,1,2]
,[4,2,>2,1,1,2]
,[4,>4,1,1,2]
,[8,1,>1,2]
,[8,2,>2]
,[8,4]
?[1,>1,1,1,1,1,1,1,1,1,2]
,[2,>1,1,1,1,1,1,1,1,2]
,[2,1,>1,1,1,1,1,1,1,2]
,[2,2,>1,1,1,1,1,1,2]
,[2,2,1,>1,1,1,1,1,2]
,[2,2,2,>1,1,1,1,2]
,[2,2,2,1,>1,1,1,2]
,[2,2,2,2,>1,1,2]
,[2,2,2,2,1,>1,2]
,[2,2,2,2,2,>2]
,[2,2,2,2,4>]
, segunda pasada:[2,>2,2,2,4]
,[4,>2,2,4]
,[4,2,>2,4]
,[4,4,>4]
,[4,8>]
. Esperemos que eso lo aclare. Si desea que algún código mire la pregunta anterior, tiene respuestas que implementan una función de aplastamiento.[4, 4]
debe eliminarse, ya que nunca podemos obtener esa matriz después de una secuencia de estiramiento => aplastar, ya que esto terminará con[8]
Respuestas:
JavaScript (Node.js) ,
237221213186 bytesPruébalo en línea!
Este algoritmo calcula arreglos estirados óptimos, estirando cada número al máximo, y luego, si es necesario, aplasta un par de números en el lugar correcto, creando efectivamente un "bloqueador de aplastamiento", interrumpiendo la secuencia de aplastamiento del número anterior.
Por ejemplo:
[1, 1, 1, 1, 1, 1]
da[4,2]
una vez aplastado, pero[1, 1, 1, 1, 2]
da como resultado[2, 4]
El desafío es determinar dónde se debe colocar exactamente un bloqueador de aplastamiento para que aplastar la matriz resultante dé el resultado correcto:
[2, 4]
requiere un bloqueador de aplastamiento (el número extendido es1
, repetido y[1, 1]
es más corta que[1,1,1,1]
), pero[4, 2]
y[2, 6]
no requieren unan
la secuencia extendida anterior, y si se verifica la condición anterior, entonces la secuencia actual es una repetición de lan
secuencia. Para interrumpir la secuencia de aplastamiento del número anterior, necesitamos colocar el bloqueador de aplastamiento al final de la segundan
secuencia del número actual para estirar. Ejemplo:[2, 8] => [(1, 1)=n, (1, 1) + (2) + (1, 1) + ...]
o[4, 8] => [(1, 1, 1, 1)=n, (1, 1, 1, 1) + (1, 1, 2) + ...]
fuente
Jalea , 42 bytes
Pruébalo en línea!
Programa completo Extremadamente ineficiente, pero funciona.
fuente
Python 2 ,
230228226 bytesFunciona iterando todas las listas posibles con la misma suma que la entrada. Eliminando aquellos que no son iguales a la matriz de entrada en algún estado aplastado, seleccionando el más largo.
Editar: -2 bytes eliminando el
if
en la función principalEditar: -2 bytes eliminando dos corchetes innecesarios
Pruébalo en línea!
Explicación
Función principal, responsable de encontrar todas las soluciones posibles y seleccionar la más larga.
Función de aplastamiento, que comprueba si y es igual a uno de los aplastamientos.
Genera todas las permutaciones posibles con la suma dada
fuente
05AB1E ,
4137 bytesPruébalo en línea!
Puerto de mi solución Javascript.
Explicaciones:
fuente