Visión general
Algunos de ustedes podrían estar al tanto de la secuencia de Kolakoski ( A000002 ), una secuencia autorreferencial bien conocida que tiene la siguiente propiedad:
Es una secuencia que contiene solo 1 y 2, y para cada grupo de 1 y dos, si suma la longitud de las carreras, es igual a sí misma, solo la mitad de la longitud. En otras palabras, la secuencia de Kolakoski describe la longitud de las corridas en la secuencia misma. Es la única secuencia que hace esto, excepto la misma secuencia con el 1 inicial eliminado. (Esto solo es cierto si te limitas a secuencias compuestas de 1s y 2s - Martin Ender)
El reto
El desafío es, dada una lista de enteros:
- Salida
-1
si la lista NO es un prefijo de trabajo de la secuencia de Kolakoski. - Salida el número de iteraciones antes de la secuencia se vuelve
[2]
.
El ejemplo resuelto
Usando la imagen proporcionada como ejemplo:
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1] # Iteration 0 (the input).
[1,2,2,1,1,2,1,2,2,1,2] # Iteration 1.
[1,2,2,1,1,2,1,1] # Iteration 2.
[1,2,2,1,2] # Iteration 3.
[1,2,1,1] # Iteration 4.
[1,1,2] # Iteration 5.
[2,1] # Iteration 6.
[1,1] # Iteration 7.
[2] # Iteration 8.
Por lo tanto, el número resultante es 8
para una entrada de [1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1]
.
9
también está bien si está indexando 1.
The Test Suite (también puedes probar con sub iteraciones)
------------------------------------------+---------
Truthy Scenarios | Output
------------------------------------------+---------
[1,1] | 1 or 2
[1,2,2,1,1,2,1,2,2,1] | 6 or 7
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1] | 8 or 9
[1,2] | 2 or 3
------------------------------------------+---------
Falsy Scenarios | Output
------------------------------------------+---------
[4,2,-2,1,0,3928,102904] | -1 or a unique falsy output.
[1,1,1] | -1
[2,2,1,1,2,1,2] (Results in [2,3] @ i3) | -1 (Trickiest example)
[] | -1
[1] | -1
Si estás confundido:
Verdad: Eventualmente llegará a dos sin ningún paso intermedio que tenga elementos que no sean 1
y 2
. -Einkorn Enchanter 20 hours ago
Falsy: el valor final no lo es [2]
. Los términos intermedios contienen algo más que algo del conjunto [1,2]
. Un par de otras cosas, ver ejemplos.
Este es el código de golf , el conteo de bytes más bajo será el vencedor.
-1
?[2]
hasta que vi el[2,2,1,1,2,1,2]
caso de prueba.1
y2
.[1]
como un caso de prueba.Respuestas:
Haskell ,
12687797675 bytes39 bytes guardados gracias a Ørjan Johansen
Pruébalo en línea!
Este error en la entrada incorrecta.
fuente
f
(y, en consecuencia!
) se puede acortar mucho usando producción perezosa +span
/ enlength
lugar de acumuladores. Pruébalo en línea![1]
import Data.List;f l=length<$>group l
. (<$>
es sinónimo demap
aquí). Además, en lugar de tener dos-1
casos diferentes , es más corto usar un@(_:_:_)
patrón para forzar que el caso principal solo coincida con listas de longitud> = 2. Pruébalo en línea!05AB1E , 22 bytes
Pruébalo en línea!
Explicación
fuente
[1,1,2,2,1,2,1,1,2,2,1,2,2,1,1,2,1,1]
SCALA, 290 (282?) Caracteres, 290 (282?) Bytes
Me tomó muuucho tiempo ... ¡Pero finalmente terminé!
con este código:
No sé si debería contarlos
var u=t
en los bytes, teniendo en cuenta que no los usot
durante el algoritmo (la copia es solo para obtener un modificable envar
lugar del parámetrot
considerado comoval
- gracias ScaLa ). Por favor, dime si debo contarlo.Suficientemente difícil. Pruébalo en línea!
PD: Estaba pensando en hacerlo de forma recursiva, pero tendré que pasar un contador como parámetro de la verdadera "subfunción" recursiva; Este hecho me hace declarar dos funciones, y estos caracteres / bytes no son más que perdidos.
EDITAR: Tuve que cambiar (?) Porque no estamos seguros de que deberíamos tomar en cuenta el
[1]
caso. Así que aquí está el código modificado:No está optimizado (tengo un "out" duplicado para las mismas condiciones: cuando llego
[2]
y cuando param es[2]
se trata por separado).NUEVO COSTO = 342 (no modifiqué el título a propósito)
fuente
[1]
[2]
"[1]
nunca alcanza[2]
y por lo tanto debería devolver -1 .JavaScript,
146142 bytesPrimero intente en golf de código, parece que el "retorno" en la función más grande es bastante tedioso ...
Además, la comprobación de b = 1 y b = 2 ocupa algunos bytes ...
Aquí está el código:
Explicación
Datos de prueba (usando los datos de prueba dados)
Edición 1: 146 -> 142: Revocación de mi edición para reducir bytes, porque esto afecta la salida; y alguna edición en la última declaración
fuente
f=a=>{for(i=t=!a[0];a[1];)r=[],c=j=0,a.map(a=>{t|=a-1&&a-2;a-c&&(0<j&&r.push(j),c=a,j=0);j++}),(a=r).push(j),i++;return t||a[0]-2?-1:0^i}
ahorra 5 bytes (para bucle en lugar de while; comas vs llaves; && vs if). Puede usar el compilador de cierre de google ( clos-compiler.appspot.com ) para hacer estas optimizaciones por ustedJalea ,
2625222120 bytesPruébalo en línea!
Este código en realidad no funcionaba correctamente hasta 20 bytes y ni siquiera me di cuenta; estaba fallando en el
[2,2]
caso de prueba. Debería funcionar perfectamente ahora.fuente
JavaScript (ES6),
1271269580 bytes0 indexado. Lanza
"ReferenceError: X is not defined"
y"InternalError: too much recursion"
en mal aporte.Casos de prueba
Mostrar fragmento de código
fuente
Clojure, 110 bytes
Un básico
loop
con una verificación previa en casos extremos. Devolucionesnil
para entradas inválidas. No sabía(= [2] '(2))
estrue
: ofuente
Python 2, 146 bytes (solo función)
Devuelve 0 en la entrada falsa (está bien ya que está indexado en 1) Simplemente utilízalo así:
fuente
Mathematica, 82 bytes
Function
que reemplaza repetidamente{2}
con el símbolo indefinidoT
, una lista de (uno o más)1
sys2
con la siguiente iteración, y cualquier otra cosa0
hasta que se alcanza un punto fijo, luego devuelveFirstPosition
el símboloT
en elFixedPointList
signo negativo resultante1
. La salida es{n}
donden
está el número (1
indexado) de iteraciones necesarias para alcanzar{2}
el caso verdadero y-1+Missing["NotFound"]
el caso falso.Si la salida debe ser en
n
lugar de{n}
, cuesta tres bytes más:fuente
Python 2 ,
184 163156 bytesPython 2 , 156 bytes
Pruébalo en línea!
Explicación:
fuente
Jalea , 17 bytes
Pruébalo en línea!
fuente
Python 2 , 122 bytes
Pruébalo en línea!
Python 3 , 120 bytes
Pruébalo en línea!
Explicación
Se inicia una nueva secuencia (w) para almacenar la próxima iteración de la reducción. Se inicializa un contador (c) para realizar un seguimiento del número de iteraciones.
Cada elemento de la secuencia o secuencias originales se compara con el valor anterior. Si son iguales, el valor del último elemento de (w) aumenta con 1. Si son diferentes, la secuencia (w) se extiende con [1].
Si w == [2], se devuelve el contador (c). De lo contrario, si la secuencia o secuencias originales contienen otros elementos que no sean 1 y 2, se devuelve un valor -1. Si ninguno de los dos es el caso, la función se llama recursivamente con la nueva secuencia (w) como (s) y el contador (c) se incrementa en 1.
fuente
def f(s,c=2,j=0,w=[1]):
, pero eso da un resultado diferente. ¿Alguien podría explicar por qué es eso?R, 122 bytes
Pasa todos los casos de prueba. Lanza uno o más errores de lo contrario. Odio los controles de validez; este código podría haber sido tan útil si las entradas fueran agradables; sería más corto incluso en el caso de que la entrada fuera una secuencia de 1 y 2, no necesariamente un prefijo de la secuencia de Kolakoski. Aquí, tenemos que verificar tanto el vector inicial (de lo contrario, el caso de prueba
[-2,1]
) habría pasado) como el vector resultante (de lo contrario[1,1,1]
, habría pasado).fuente
Rubí ,
8177 bytesPruébalo en línea!
Editar: guardado 4 bytes al convertir a lambda recursiva.
Devuelve 1 número indexado de iteraciones o 0 como falsey.
Utiliza el método fragmentado de Ruby enumerable, que hace exactamente lo que necesitamos: agrupar series consecutivas de números idénticos. Las longitudes de las ejecuciones constituyen la matriz para la próxima iteración. Sigue iterando mientras la matriz tiene más de 1 elemento y no se han encontrado otros números que no sean 1 y 2.
fuente
Pyth , 45 bytes
Pruébalo en línea!
Esto probablemente todavía sea golfable. Definitivamente es golfable si
.?
funciona de la manera que esperaba (siendoelse
para la estructura más interna en lugar de la más externa)fuente
Perl 5
-p
, 71 bytesPruébalo en línea!
1
-indexado. Salidas0
para falsedad.fuente