Comenzando con la cadena ABC
, considere el resultado de agregar repetidamente la última mitad de sí mismo (usando la mitad más grande si la longitud es impar).
Obtenemos la progresión:
ABC
ABCBC
ABCBCCBC
ABCBCCBCCCBC
ABCBCCBCCCBCBCCCBC
etc...
Supongamos que S
representa la secuencia (o secuencia) infinita resultante que se produce cuando este procedimiento se repite para siempre.
Gol
El objetivo en este desafío de código es encontrar el índice de la primera aparición de corridas de C
's en S
.
Al principio es fácil: C
primero ocurre en el índice 2
, CC
en 4
, CCC
en 7
, CCCC
en 26
, ¡pero CCCCC
está en el índice 27308
! Después de eso se me acaba la memoria.
El ganador será el envío que genere correctamente la mayoría de los índices de ejecución (en orden, comenzando en C
). Puede usar cualquier tipo de algoritmo, pero asegúrese de explicarlo si no está usando la fuerza bruta básica. La entrada y la salida pueden estar en cualquier formato fácil de entender.
Nota importante: No sé oficialmente si S
contiene o no todas las ejecuciones de C
's. Esta pregunta se deriva de esta en el Mathematics Stack Exchange , en el que el autor tampoco ha encontrado CCCCCC
. Tengo curiosidad si alguien aquí puede. (Esa pregunta a su vez se basa en mi pregunta original sobre el tema ).
Si puede demostrar que no se C
producen todas las corridas S
, ganará automáticamente ya que esta pregunta ya no será válida. Si nadie puede probar eso ni encontrarlo, CCCCCC
entonces el ganador será la persona que pueda obtener el límite inferior más alto en el índice de CCCCCC
(o cualquiera que sea la carrera sin resolver más grande si CCCCCC
se encuentra).
Actualización: Felicitaciones a isaacg y res que han encontrado CCCCCC
en el índice astronómico de 2.124 * 10 ^ 519. A este ritmo, no puedo imaginar encontrar CCCCCCC
con ningún método que se base en la fuerza bruta. Buen trabajo chicos!
fuente
CCCCC
en el índice 27308, pero luego parece que no sabes dónde ocurre por primera vez. Quiso decirCCCCCC
?Respuestas:
CCCCCC encontrado en 2.124 * 10 ^ 519.
Índice precisa es 2124002227156710537549582070283786072301315855169987260450819829164756027922998360364044010386660076550764749849261595395734745608255162468143483136030403857241667604197146133343367628903022619551535534430377929831860918493875279894519909944379122620704864579366098015086419629439009415947634870592393974557860358412680068086381231577773140182376767811142988329838752964017382641454691037714240414750501535213021638601291385412206075763857490254382670426605045419312312880204888045665938646319068208885093114686859061215
Encontrado por res, utilizando el código (versión anterior de) a continuación, después de 3,5 horas de búsqueda.
Alrededor de ese índice, la cadena es:
...BCCBCBCCCBCCCCCCBCCB...
Para verificar, cambie la línea indicada en el código a continuación para comenzar en 2946, en lugar de 5. La verificación lleva 20 segundos.
Actualización: programa mejorado. El programa anterior buscó ~ 10 veces más ubicaciones de las necesarias.
La nueva versión encuentra la
CCCCCC
en solo 33 minutos.Cómo funciona el código: Básicamente, solo miro las regiones que corresponden a los extremos de las cadenas incrementales, y calculo las letras mirando recursivamente la cadena original. Tenga en cuenta que utiliza una tabla de notas, que puede llenar su memoria. Ponga una tapa en la longitud de la tabla de notas si es necesario.
Máximo actual buscado a: 4000 iteraciones
CCCCCC
encontrado en la iteración (es): 2946fuente
sys.setrecursionlimit(4000)
yULIMIT=4000
, encontró (en aproximadamente 3.5 horas en mi sistema) la primera aparición de CCCCCC en el índice = 2.124 * 10 ^ 519. El índice exacto está en el próximo comentario ...CCCCCC encontrado en 2.124 * 10 ^ 519.
Se utilizó el siguiente código ruby para buscar
CCCCCC
.El índice es el mismo que en la respuesta de @isaacg .
El tiempo de ejecución del código anterior para 6 es del orden de diez segundos en mi computadora. Sin embargo, todavía está buscando una respuesta para
CCCCCCC
(si desea probarlo, establezca constanteSEARCH
en7
).Puede usar
getc
para encontrar el carácter en una posición específica,i
ya que se hace en la última línea donde se imprime la cadena alrededor del índice.fuente
(No es una respuesta, pero es demasiado larga para un comentario).
La siguiente es una traducción de Python del programa Ruby de @ Howard (acelerado por un factor cercano a 3 al tener solo uno
getc
en el ciclo de búsqueda). En mi sistema, esto encuentra el primer C ^ 6 en 3 segundos. En 93 horas, no encuentra C ^ 7 en 231,000 iteraciones, por lo que el primer C ^ 7 (si existe) debe ocurrir después de las 10 ^ 40677 posiciones más a la izquierda en la cadena infinita.fuente