A veces, al escribir código brainfuck, siente la necesidad de hacerlo más largo de lo necesario para alentar la depuración. Podrías hacerlo simplemente colocando un ><
allí, pero ¿qué tan divertido es eso? Necesitará algo más largo y menos NOPey para confundir a cualquiera que lea su código.
Introducción rápida a Brainfuck
Brainfuck es un lenguaje de programación esotérico creado en 1993 por Urban Müller, y destaca por su minimalismo extremo. (Wikipedia)
Brainfuck es un lenguaje basado en ocho comandos: +-><,.[]
. El código se ejecuta en algo parecido a una máquina de Turing: una cinta infinita en la que se pueden cambiar los valores. En este desafío, nos centraremos en los primeros cuatro:
+ increment the value at the pointer
- decrement the value at the pointer
> move the pointer right
< move the pointer left
Brainfuck NOPs
Un brainfuck NOP es una secuencia de personajes de brainfuck que, cuando se ejecuta desde cualquier estado, no conduce a ningún cambio en el estado. Se componen de los cuatro caracteres mencionados anteriormente.
El reto
El desafío es escribir un programa o función que, cuando se ejecuta, genera un NOP aleatorio de la duración dada.
Entrada
Recibirá como entrada un entero par no negativo n
. (Los NOP son imposibles para imparn
).
Salida
Producirás un NOP aleatorio de la longitud n
.
Reglas
- La definición de NOP: cuando la salida del programa se inserta en cualquier punto de un programa mental, el comportamiento de dicho programa no debe cambiar de ninguna manera. En otras palabras, no debe cambiar el estado del intérprete.
- Tenga en cuenta que, por ejemplo
+>-<
es incorrecto, ya que cambia los valores de las dos celdas sin volver a cambiarlas. Pruebe su solución para estos antes de publicar. - También tenga en cuenta que
+>-<->+<
es un NOP que no se puede reducir a nada simplemente quitándolo><
<>
+-
-+
. Por lo tanto, no puede usar un algoritmo que simplemente los inserte uno dentro del otro.
- Tenga en cuenta que, por ejemplo
- Cada NOP válido de la longitud
n
debe tener una probabilidad distinta de cero de aparecer en la salida. Sin embargo, la distribución no tiene que ser uniforme. - El intérprete en cuestión tiene una cinta doblemente infinita de celdas de precisión arbitraria. Es decir, puede ir infinitamente a ambas direcciones e incrementar / disminuir cada celda indefinidamente.
- El programa debe finalizar en 1 minuto por
n
= 100 en mi máquina, por lo que no generar todos los NOP posibles y elegir uno. - Si se le proporciona una entrada no válida (no entera, negativa, impar, etc.), puede hacer lo que quiera, incluido el bloqueo.
Tanteo
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
Ejemplos
Aquí están todas las salidas válidas para n
= 4:
++-- +-+- +--+ --++ -+-+ -++-
>><< ><>< ><<> <<>> <><> <>><
><+- ><-+ <>+- <>-+
>+-< >-+< <+-> <-+>
+><- -><+ +<>- -<>+
+->< -+>< +-<> -+<>
Aquí hay algunas salidas posibles para n
= 20:
+>>->+<->-<<<->>++<<
>+>-<+<->+-<>->+<-<+
+--+-++--++-+--+-++-
>>>>>>>>>+-<<<<<<<<<
.
tiene un efecto secundario, ,
sobrescribe un valor que no se puede recuperar sin el uso de []
. Pero []
terminará estableciendo un valor a cero. Esto también sobrescribe un valor (por lo que necesitaríamos otro []
para recuperarlo) a menos que podamos estar seguros de que la celda afectada era cero para empezar. Sin embargo, tendríamos que buscar una celda de ese tipo con algo así [>]
, y es imposible volver de manera confiable a la posición de donde venimos.
+-<>
como usted pidió:a