La celda al final del arcoiris


31

Todos conocemos, o al menos hemos oído hablar, de brainfuck , uno de los lenguajes esotéricos más famosos e influyentes. Si bien en la actualidad la mayoría de las implementaciones usan una cinta infinita, el compilador original de Urban Müller tenía una cinta de 30000 celdas. Un hecho poco conocido * es que en realidad hay un valor especial al final de la cinta, algo con lo que casi nunca interactúa en un programa típico de brainfuck.

Si bien podría imprimir este valor con 29999 >sy a ., brainfuck es conocido por sus soluciones cortas y concisas, por lo que su objetivo es imprimir este valor con el número mínimo de caracteres.

*ficción

Reglas:

  • Un repaso a las instrucciones de brainfuck:
    • +/ -: Incrementa / disminuye la celda actual, ajustando de 255 a 0 cuando se incrementa 255 y viceversa
    • </ >: Mueve el puntero hacia la izquierda / derecha en la cinta
    • .: Imprime el valor de la celda actual.
    • [: Salta al correspondiente ]si el valor en la celda es 0
    • ]: Salta al correspondiente [si el valor en la celda no es 0
  • En este caso ,(Obtener entrada) no hace nada, ya que el compilador original deja la celda sin cambios en EOF, y este programa no debería recibir ninguna entrada.
  • La cinta se llena inicialmente con todos los 0, excepto la celda 30000, que contiene un valor desconocido.
  • El puntero comienza en la celda 1 y debe terminar en la celda 30000, después de haberlo impreso.
  • Las celdas a la izquierda de 1 y a la derecha de 30000 tienen un comportamiento indefinido, por lo que las soluciones no deben visitar estas celdas.
  • Tenga en cuenta que el valor en 30000 es puede ser un 0, por lo que simplemente repetirse hasta llegar a un no-cero celular no funcionará.
  • Debe imprimir solo el valor en la celda 30000
  • ¡La solución más corta gana!
    • Tie-breaker es el programa más eficiente (se ejecuta en los pasos más pequeños), seguido por el tiempo de envío más rápido.

Consejo: Esolanging Fruit sugiere usar https://copy.sh/brainfuck para probar su código. Las especificaciones son como se describen en este desafío, y puede seleccionar la abortopción para que su programa se detenga si se sale de los límites.


Sandbox (eliminado)
Jo King

3
1 byte: .. Yo gano.
Esolanging Fruit

1
@EsolangingFruit Déjame tener mis delirios, por favor ...
Jo King

1
Sugiero cambiar la regla a "inicialmente todas las celdas tienen el valor de 0, excepto la última celda que tiene un valor desconocido".
user202729

44
Consejo para cualquiera que haga esto: copy.sh/brainfuck es probablemente el mejor sitio para hacerlo, ya que implementa BF como se describe en este desafío y tiene una cinta de 30k por defecto. Pasar al final de la cinta hace que el intérprete se cuelgue.
Esolanging Fruit

Respuestas:


17

54 bytes

------[>+++<--]>[->----[-[->+<]<[->+<]>>]<]>>>>>>>>>>.

119 x 252 = 29988. Bucle anidado directo.

He utilizado esta herramienta para verificar que el puntero se detiene en 29999.


12

50 bytes

>+[>+[<]>->+]>-<<[>>-------[[>]+[<]>-]<<-]>>>[>]>.

Pruébalo aquí!

La primera sección ( >+[>+[<]>->+]>-<<) configura la cinta como

0*12 121' 0 110

La siguiente sección ( [>>-------[[>]+[<]>-]<<-]) itera 121 veces, agregando 249 1s al final de la cinta cada vez. Si es rápido con las matemáticas, puede darse cuenta de que 121 * 249 da como resultado 30129 1s, pero la primera iteración tiene las sobras 110 para tratar y solo agrega ( 110-7) 103 1s a la cinta, lo que significa que solo hay 29983 1s. La cinta final se ve así:

0*12 0' 0 0 1*29983 0 ???

Y una final >>>[>]>.para imprimir el valor.

Algunos otros algoritmos de nota:

  • 252 * 119 = 29988 (también 50 bytes)
  • 163 * 184 = 29992 (56 bytes)
  • 204 * 147 = 29988 (60 bytes)
  • 153 * 196 = 29988 (56 bytes)
  • 191 * 157 = 29987 (57 bytes)
  • 254 * 118 = 29972 (56 bytes)
    • Este es el que considero el próximo más cercano a vencer a 50, ya que los bytes adicionales son básicamente solo viajar la distancia extra. Si pudiera encontrar un algoritmo que genera 118 y viaja más de 14 celdas, esto podría superarlo.

3

81

-[+>+[<]>++]<<+[-->-[-<]>]>-[>[->+[[->+<]<]>>>]<[-<<+>>]<<<-]>-------[[->+<]>-]>.

Esto se mueve en 150 celdas 200 veces.

Esto es mucho más largo de lo que me gustaría, y hay un serio obstáculo para jugar al golf:

Ya no sé por qué trabajo.

Esto está plagado de compensaciones por off-by-ones hasta el punto en que algunos de ellos probablemente podrían cancelarse. He agregado y eliminado varios segmentos tanto que ya no recuerdo por qué puse ciertas cosas donde están (por ejemplo, ¿por qué la primera parte inicializa las celdas de la cinta a 199 y 151 en lugar de 200 y 150?).

Aquí está mi versión comentada de esta monstruosidad de todos modos, con la esperanza de que yo (u otra persona) pueda encontrarlos útiles:

-[+>+[<]>++]<<+[-->-[-<]>]>-

0 0 0 199' 155

[
  n' k 0
  >[
    n k' j
    ->+[[->+<]<]>
    0' n k-1 j+1 OR
    n 0 0' j+1
    >>
  ]
  0*k n 0 0 k 0'
  <[-<<+>>]<<<-
  0*k n-1' k
]
>-------[[->+<]>-]>.

En realidad, esto no imprime el valor, y si el valor es positivo, se desborda. Pero un gran intento
Jo King

Luego agregue un ., ¿ayudaría?
user202729

1
@JoKing Solucionó eso.
Esolanging Fruit
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.