La idea aquí es producir un patrón casi repetitivo. Es decir, la secuencia que se está construyendo cambia en el último momento para evitar la repetición de alguna subsecuencia. Se deben evitar las subsecuencias del tipo AA y ABA (donde B no es más largo que A).
Ejemplos:
Seguiré adelante y comenzaré enumerando todos los pequeños ejemplos para aclarar mi descripción. Comencemos con 0.
Válido: 0 Inválido: 00 (patrón AA) Válido: 01 Inválido: 010 (patrón ABA) Inválido: 011 (patrón AA) Válido: 012 Válido: 0120 Inválido: 0121 (patrón ABA) Inválido: 0122 (patrón AA) Inválido: 01200 (patrón AA) Inválido: 01201 (patrón ABA; 01-2-01) Inválido: 01202 (patrón ABA) Válido: 01203
Ahora, creo firmemente que 4
nunca se necesita a, aunque no tengo una prueba, porque he encontrado fácilmente secuencias de cientos de caracteres que solo se usan 0123
. (Probablemente esté estrechamente relacionado con la forma en que solo se necesitan tres caracteres para tener cadenas infinitas que no tengan ningún patrón AA. Hay una página de Wikipedia sobre esto).
De entrada y salida
La entrada es un número entero positivo, distinto de cero n
. Puedes suponer eso n <= 1000
.
La salida es una n
secuencia de caracteres sin subsecuencias que coincidan con patrones prohibidos (AA o ABA).
Muestra de entradas y salidas
>>> 1 0 0 >>> 2 01 >>> 3 012 >>> 4 0120 >>> 5 01203 >>> 50 01203102130123103201302103120132102301203102132012
Reglas
- Solo
0123
se permiten los personajes . - B ya no es de A. Esto es para evitar la situación en la que
012345
tiene que ser seguido por6
porque0123451
tiene esta:1-2345-1
. En otras palabras, la secuencia sería trivial y poco interesante. n
se puede ingresar a través de cualquier método deseado, excepto la codificación fija.- La salida puede ser una lista o una cadena, según cuál sea más fácil.
- Sin fuerza bruta ; el tiempo de ejecución debe ser del orden de minutos, como máximo una hora en una máquina realmente lenta, por
n=1000
. (Esto tiene la intención de descalificar soluciones que simplemente recorren todas lasn
permutaciones de todas las longitudes de{0,1,2,3}
, para que no se permitan trucos y trucos similares). - Las lagunas estándar no están permitidas, como de costumbre.
- La puntuación está en bytes. Este es el código de golf , por lo que gana la entrada más corta (probablemente, vea el bono).
- Bonificación: elija el dígito más bajo permitido en cada paso. Si
1
y3
son posibles opciones para el siguiente dígito en la secuencia, seleccione1
. Resta 5 bytes de tu puntaje. Sin embargo, tome nota de la nota a continuación.
¡Nota!
Los callejones sin salida son posibles. Su programa o función debe evitarlos. Aquí hay un ejemplo:
Tocón: 01203102130123103201302103120132102301203102132012302103120130231032012302132031023012032102312013021031230132031021301203210230132031230220310320123102112032031023013203203103302201310320210230220310213201230210312013023103201230213203102301203210231201302103123013203102130120321023013203123022032031023013203202 Stump: 0120310213012310320130210312013210230120310213201230210312013023103201230213203102301203210231201302103123013203102130120321023013203123021032012310213012031023013203123021320123102130123 Tocón: 01203102130123103201302103120132102301203102132012302103120130231032012302132031023012032102312013021031230132031021301203210230132031230210320123102130120310230132032031023013203203102301320320310230132032031023013202 Stump: 012031021301231032013021031201321023012031021320123021031201302310320123021320310230120321023120130210312301320310213012032102301320312302103201231021301203102301320312302132012310321301203102130
Cada una de estas secuencias no puede extenderse más (sin usar a 4
). Pero también tenga en cuenta que hay una diferencia crucial entre los dos primeros y los segundos dos. Reemplazaré la subsecuencia inicial compartida con una X
para aclarar esto.
Tocón: X2130120 Tocón: X2130123 Tocón: X320 Tocón: X321301203102130
Los dos últimos dígitos de X
son 10
, por lo que las únicas opciones posibles para el siguiente dígito son 2
y 3
. Elegir 2
conduce a una situación en la que la secuencia debe terminar. El codicioso algoritmo no funcionará aquí. (No sin retroceder, de todos modos).
n
, pero dado que los muñones que encuentra mi programa tienden a alargarse en un promedio de 10 dígitos cada vez, estoy muy seguro de que existe una secuencia infinita. No estoy seguro de cómo se puede probar un algoritmo semi-codicioso para secuencias arbitrariamente grandes. Podría restringir el requisito a n
= 1000 y simplemente no preocuparme por más alto n
.
AA
es realmente escriba ABA
donde B
está vacío. Esto quizás podría ayudar a racionalizar algunas soluciones.
n
? Si alguien da un algoritmo heurístico semi-codicioso, ¿cómo comprobará que no tiene problemas durante un período muy largo? El problema general es interesante, y no he podido encontrar nada sobre cómo evitar patrones cuando restringimos la longitud de parte del patrón. Si alguien puede producir una receta general, espero que ese sea el mejor enfoque.