Vamos a definir el proceso de aplastar una serie de números. 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,3]
^
[5,2,2,3]
^
[5,2,2,3]
^
[5,4,3]
^
[5,4,3]
^
El mismo elemento se puede plegar varias veces, por ejemplo, [1,1,2]se convierte [4]cuando se aplastan.
Llamaremos a una matriz inquebrantable cuando el proceso de aplastar esa matriz no la cambie. Por ejemplo, [1,2,3]todavía está [1,2,3]después de ser aplastado.
Su tarea es tomar una matriz y determinar la cantidad de aplastamientos necesarios para que no se pueda aplastar. Solo necesita admitir enteros en el rango de 0 a 2 32 -1
Este es el código de golf, por lo que las respuestas se puntuarán en bytes, siendo mejores menos bytes.
Casos de prueba
[1] -> 0
[1,1] -> 1
[2,1,1] -> 2
[4,2,1,1] -> 3
[2,2,2,1,1] -> 3
[0,0,0,0] -> 1
[4,0,0,0,4] -> 1
[4,0,0,0,0,4] -> 1
[] -> 0
fuente

[1,1,2,4,8]devolver 1 o 4?0,0,0,0solo1. Podría ser una idea mencionar explícitamente en alguna parte que estamos contando el número de veces que tenemos que recorrer un conjunto para destruirlo por completo y no , como pensé inicialmente, el número total de veces que aplastamos 2 números juntos.Respuestas:
Conjunto x86 (64 bits),
6665 bytesLas instrucciones de cadena fueron útiles. Tener que corregir los errores fuera de uno en un entorno de 64 bits no fue así.
Código fuente completamente comentado:
Puedo intentar hacer esto en 32 bits, aunque solo sea por diversión, ya que esos prefijos REX realmente me mataron.
Editar: se eliminó un byte reemplazando lodsq con add,% rdx con% rax, y contrayendo dos cld en uno.
fuente
Pyth , 22 bytes
Verifique todos los casos de prueba.
fuente
Haskell , 66 bytes
Pruébalo en línea!
Explicación
fes una función que aplasta una lista. Realiza el flechazo como se describe en la pregunta.ges una función que cuenta el número de enamoramientos. Sif x==x, de log x=0contrariog x=1+g(f x).fuente
g(f x)ag$f x+tiene mayor prioridad que$Paradoc (v0.2.10), 16 bytes (CP-1252)
Pruébalo en línea! / con encabezado / pie de página que verifica todos los casos de prueba
Toma una lista en la pila y da como resultado un número en la pila.
Implementación bastante sencilla, para ser honesto. Aplasta una lista comenzando con un centinela -1, recorriendo la lista, empujando cada elemento y agregándolo al elemento debajo de él si son iguales. Al final cortamos el -1. Solo aplastamos números iguales y todos los números del problema no son negativos, por lo que el centinela -1 no afectará el proceso de aplastamiento. Con el aplastamiento implementado, solo es cuestión de contar las iteraciones hasta su punto fijo.
Explicación:
Si pudiéramos asumir que la entrada no está vacía, no necesitaríamos el centinela y podríamos recortar 2 bytes:
{(\ε=k+x}]}IL(Otro dato divertido: solo perdemos 2 bytes si nos obligamos a usar solo ASCII:
{1m\{=k+x}e]1>}IL(fuente
JavaScript (ES6), 86 bytes
No golfista y explicado
Pruebas
Mostrar fragmento de código
fuente
a.length>nes el mismo quea[n]!=[]._. En este caso (dado que todos los elementos de la matriz son números mayores que -1), es lo mismo quea[n]>-1. Además,a[i]==a[++i]&&xes lo mismo quea[i]-a[++i]||x.1/a[i]también funciona para guardar otro byte.JavaScript, 67 bytes
Pruébalo en línea!
fuente
Brain-Flak , 144 bytes
Pruébalo en línea!
Explicación
La función de aplastamiento evalúa el número de pares de elementos que fueron aplastados juntos:
fuente
Java 8, 120 bytes
Una lambda de
List<Long>aInteger. La lista de entrada debe implementarseremove(int)(por ejemploArrayList). Asignar aFunction<List<Long>, Integer>.Pruébalo en línea
Lambda sin golf
ccuenta el número de aplastamientos hasta el momento,ies el índice en la lista efindica si se debe continuar aplastando la lista cuando finaliza una iteración. Dentro de los bucles, se compara cada par adyacente.ise incrementa incondicionalmente, por lo que si un elemento se elimina por aplastamiento,ise disminuye primero para cancelar el incremento. El primer elemento se elimina de la lista.Expresiones de gratitud
fuente
valueOfcaché. Ejemplo:{128L, 128L}. Eso se debe al.get(i)==l.get(i-1)que debe ser reemplazado porl.get(i).equals(l.get(i-1)).l.get(i)-l.get(i-1)==0funcionará. ¡Gracias!Perl 5 , 96 bytes
94 código, 2 para
-paPruébalo en línea!
fuente
JavaScript (ES6), 70 bytes
Explicación:
Casos de prueba:
Mostrar fragmento de código
fuente
Python 2 ,
112110108107105100 bytesEditar: guardado 2 bytes al eliminar
oren la declaración de devoluciónEditar: guardado 2 bytes al tener
icomo índice el segundo de los dos elementos a los que se debe accederEditar: guardado 1 byte gracias a @ Mr.Xcoder
Editar: guardado 7 bytes gracias a @jferard
Pruébalo en línea!
fuente
JavaScript (ES6), 83 bytes
Explicación: Los elementos se extraen de forma recursiva de la matriz original y se agregan valores únicos,
bmientras queces un indicador para indicar si la matriz se ha triturado con éxito.fuente
J, 54 bytes
Pruébalo en línea!
No es mi mejor golf de ninguna manera. Seguramente tiene que haber una mejor manera de convertir una lista con un elemento en un átomo.
Explicación
aplastar
Esto aplasta una matriz una vez. Es necesario darle la matriz a la inversa ya que la inserción de J funciona de derecha a izquierda (algo que aprendí hoy). Esto no importa particularmente, ya que todo lo que necesitamos es la cantidad de veces que podemos aplastar la matriz.
veces
Esto es bastante sencillo: aplique el aplastamiento a la matriz hasta que nuestro resultado converja, pero hay algunos problemas que tuve que resolver con ese resultado en mucho más código del que esperaba.
Primero, cuando el aplastamiento se reduce a un solo elemento, ese elemento está realmente en una lista de un elemento (es decir, no es atómico), por lo que la función se aplica nuevamente, lo que resulta en un conteo excesivo. Para solucionar esto, utilicé un truco que se me ocurrió para reducir una lista de elementos únicos a un átomo que es
".@":(convertir a cadena y luego evaluar).Segundo,
crusherrores en la lista vacía. Yo creo que se puede definir como una función debe comportarse en recibir una entrada de vacío con inserción (/), pero no pude encontrar nada después de un rápido vistazo, así que estoy usando otra solución. Esta solución alternativa es anteponer_(infinito) a la lista, ya que nunca afectará la cantidad de veces que se aplasta la matriz (_ > 2^64). Sin embargo , esto da como resultado una lista de un solo elemento que consiste en_cuando se le da la lista vacía, por lo que debemos convertir a un átomo nuevamente antes de la trituración.fuente
Jalea , 21 bytes
Pruébalo en línea!
fuente
R , 142 bytes
Horrible, estoy seguro de que hay una manera más inteligente.
Los enteros R son en realidad a lo sumo
2^31-1.Pruébalo en línea!
fuente