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
espuede 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 abort
opción para que su programa se detenga si se sale de los límites.
.
. Yo gano.Respuestas:
54 bytes
119 x 252 = 29988. Bucle anidado directo.
He utilizado esta herramienta para verificar que el puntero se detiene en 29999.
fuente
50 bytes
Pruébalo aquí!
La primera sección (
>+[>+[<]>->+]>-<<
) configura la cinta comoLa siguiente sección (
[>>-------[[>]+[<]>-]<<-]
) itera 121 veces, agregando 2491
s 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 301291
s, pero la primera iteración tiene las sobras 110 para tratar y solo agrega (110-7
) 1031
s a la cinta, lo que significa que solo hay 299831
s. La cinta final se ve así:Y una final
>>>[>]>.
para imprimir el valor.Algunos otros algoritmos de nota:
fuente
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:
fuente
.
, ¿ayudaría?