2011-09-07 22 views
6

Como programa depurador/prueba para mi brainf aplicación * ck, he creado el siguiente bucle de conteo:Infinito Contando Loop en Brainfuck

+[[>+]+] 

Con un solo byte, las células que envuelven y con 30k células con envolvente, este crea un ciclo de conteo infinito. Establece cada celda en 1, luego cada celda en 2, etc.

Mi problema es que, cuando llega a 255, el bucle interno incrementa la celda a 0, y luego el bucle externo lo incrementa a 1 inmediatamente. Esto actúa como un "doble paso" cuando se desborda, en lugar de un solo paso. Esta es la única forma en que puedo hacer que el ciclo continúe infinitamente con este programa tan ajustado.

El recuento de cada célula pasa 0 -> 1 -> 2 ... 254 -> 255 -> 1 ...

Aunque me gustaría que vaya 0 -> 1 -> 2 ... 254 -> 255 -> 0 -> 1 ...

Es simplemente difícil de seguir un bucle cuando la celda actual es cero. He jugado con variaciones sobre el mismo tema, pero ninguno lo entiende correctamente.

Este programa en particular es solo un programa de conteo trivial para las pruebas, pero lo que realmente me ayudará con los programas futuros es saber cómo invertir el bucle condicionado como necesito para hacer que este bucle de conteo funcione.

Respuesta

4

Probar:

+[[>+]>[+>]+]

Después del primer bucle interno sabemos que los datos son 0, seguida por un grupo de 255 de. Pase a la siguiente celda e increméntelos hasta que regresemos al inicio. Luego incremente la primera celda y comience de nuevo.

+1

Desafortunadamente, agrega alrededor del 62% de la duración de su programa, y ​​es mucho menos elegante, pero funciona. No estoy convencido de que no haya un camino más corto, pero esto es probablemente el más obvio. – captncraig

1

Otra posibilidad que consideraba la noche anterior, aunque es un poco diferente a sus necesidades:

-[[-]>-] 

Es del mismo tamaño que el original, pero la cuenta atrás. Hace que cada celda pase de 255 a cero, pero solo modifica una celda a la vez. Pensé que lo agregaría, ya que es un bucle corto interesante que puedes usar para probar.

Por supuesto, puede hacer que cualquiera de estos bucles cuente hacia arriba o hacia abajo exclusivamente al usar solo + o solo -.