Contando ciclos en un proceso de plegado y aplastamiento

8

En la teoría del caos , el mapa de herradura es un ejemplo de cómo surge el caos en un simple proceso de plegado y aplastamiento. Dice así: toma un pedazo imaginario de masa, dóblalo y finalmente aplástalo a su tamaño original. El caos surge en el patrón de cómo los trozos de masa terminan en la disposición final después de n iteraciones.

Ejemplo de una medida invariante

En nuestro caso, veremos cómo se comporta un patrón binario simple cuando lo doblamos y aplastamos . Estos son los pasos con un ejemplo de 8 bits (la representación binaria de 201 o 11001001).

  1. Corte los bits en dos piezas de igual longitud (agregue un '0' al principio si hay un número impar de bits).

    1100 | 1001

  2. Dobla la primera mitad sobre la segunda mitad. Tenga en cuenta que el orden de la primera mitad se invierte, ya que lo giramos mientras lo doblamos.

    0011
    1001

  3. Squash a su forma original. Mientras aplasta, los bits superiores se desplazan hacia la izquierda a los bits en su posición original.

    01001011

Si repetimos esto para este ejemplo, podemos ver que después de 4 iteraciones, volvemos a la cadena de bits original:

Start  bits: 11001001
Iteration 1: 01001011
Iteration 2: 01001101
Iteration 3: 01011001
Iteration 4: 11001001

Entonces, para el valor decimal de 201, el número de ciclos es 4.

El reto

  • Escriba un programa completo que tome un número decimal como entrada y genere la cantidad de ciclos que se necesita para repetir en el proceso binario de squash-and-fold descrito anteriormente.
  • La entrada (decimal) debe tomarse de stdin (rango: desde 1 hasta Googol o 10 ^ 100).
  • La salida (decimal) debe escribirse en stdout.
  • Su puntaje es el número de bytes de su código.
  • Su respuesta debe comenzar con [Lenguaje de programación] - [Puntuación en bytes]
  • Las lagunas estándar no están permitidas.

Ejemplos

7 --> 3
43 --> 5
178 --> 4
255 --> 1
65534 --> 1
65537 --> 12
1915195950546866338219593388801304344938837974777392666909760090332935537657862595345445466245217915 --> 329

Nota final

Lo interesante es que el número de ciclos está relacionado con la longitud de la representación binaria, a excepción de algunas excepciones donde el número de ciclos es más corto debido al patrón en la cadena de bits (por ejemplo, 111110ciclos después de 1 iteración). Esto crea una oportunidad interesante para optimizar la longitud del código utilizando el patrón subyacente en lugar de calcular el número de ciclos.

en cualquier lugar
fuente
Si la longitud de bits del número se acorta durante la iteración, ¿cortamos y doblamos utilizando la longitud de bits original o la actual?
xnor
2
@xnor Supongo que el original, de lo contrario, nunca completarías el ciclo, ¿verdad?
Martin Ender

Respuestas:

4

CJam, 34 bytes

q~2b_,2%,\+{__,2//~\W%.\_W$=!}g;],

Nada de lujos, solo aplica el mapa hasta que volvamos a la entrada e imprima el número de iteraciones que tomó.

Pruébalo aquí.

Martin Ender
fuente
¡Primero en! ¡Mírate, disparando código más rápido que tu sombra!
agtoever
3

Python 2, 175 154 149 bytes

i=bin(input())[2:]
i=o='0'+i if len(i)%2 else i
c=0
j=len(i)/2
while i!=o or c==0:
 a=''
 for x,y in zip(i[:j][::-1],i[j:]):a+=x+y
 i,c=a,c+1
print c

Enlace de ideona

¡Gracias a agtoever por 27 bytes!

Celeo
fuente
1
No hay necesidad de la lambda. Una vez que la longitud es pareja, se mantiene pareja.
agtoever
Excelente punto, gracias!
Celeo
Cambia `while 1` con while i!=o|c==0y suelta el if i==o:break. Ahorra 5. Quizás (tenga en cuenta) que tampoco necesita a. Solo úsalo i. Guarda una asignación (4 bytes). También la asignación de j se puede poner fuera del ciclo.
2015
Gracias por los ahorros adicionales, @agtoever. Obtuve un error de tipo al intentar implementar el while i!=c|c==0reemplazo, pero aún así pude guardar algunos bytes con un estándar 'o'.
Celeo
2

Pyth, 21 bytes

Estoy escribiendo esto en mi teléfono, así que asegúrese de notificarme de cualquier error.

fqu.i_hc2Gec2GTJ.BQJ1

Pruébalo en línea.

PurkkaKoodari
fuente