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,0
solo1
. 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
f
es una función que aplasta una lista. Realiza el flechazo como se describe en la pregunta.g
es una función que cuenta el número de enamoramientos. Sif x==x
, de log x=0
contrariog 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>n
es 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]&&x
es 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
c
cuenta el número de aplastamientos hasta el momento,i
es el índice en la lista ef
indica si se debe continuar aplastando la lista cuando finaliza una iteración. Dentro de los bucles, se compara cada par adyacente.i
se incrementa incondicionalmente, por lo que si un elemento se elimina por aplastamiento,i
se disminuye primero para cancelar el incremento. El primer elemento se elimina de la lista.Expresiones de gratitud
fuente
valueOf
caché. 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)==0
funcionará. ¡Gracias!Perl 5 , 96 bytes
94 código, 2 para
-pa
Prué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
or
en la declaración de devoluciónEditar: guardado 2 bytes al tener
i
como í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,
b
mientras quec
es 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,
crush
errores 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