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:
+>>->+<->-<<<->>++<<
>+>-<+<->+-<>->+<-<+
+--+-++--++-+--+-++-
>>>>>>>>>+-<<<<<<<<<
fuente
+-<>
como usted pidió:a
.
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.Respuestas:
CJam,
6259 bytesGracias a nhahtdh por guardar 3 bytes.
Debido a que no existe un requisito para ninguna distribución en particular, siempre que cada no-op aparezca con probabilidad finita, podemos simplificar esto mucho simplemente generando una cadena que contenga un número equilibrado
-+
y<>
, respectivamente, probando si es un NOP y clasificándolo si es no lo esPor supuesto, para entradas más largas, esto casi siempre dará como resultado una salida ordenada, pero puede probar el código con alguna entrada
8
para ver que, en principio, puede producir cualquier NOP de la longitud dada.Pruébalo en línea.
fuente
Cjam,
118116 bytesEsto se salió un poco de control ... especialmente la segunda mitad parece que debería ser muy golfable.
Pruébalo aquí.
Esto se maneja
N = 100
prácticamente al instante. No tengo tiempo para escribir el desglose completo del código ahora, así que aquí está el algoritmo:<
y>
con una longitud aleatoria (par) entre0
eN
inclusive."<>><"
convierte[0 '< -1 '> 0 '> 1 '< 0]
.N
.+-
a la cadena de una posición aleatoria.Hecho. Esto se basa en la observación de que:
<
y>
para devolver el cabezal de la cinta a la posición original.Al distribuir cantidades aleatorias pero equilibradas de
+
sys-
entre todos los lugares donde se encuentra el cabezal de la cinta en una celda determinada, nos aseguramos de encontrar todos los NOP posibles.fuente
Mathematica, 350 bytes
¿Demasiado tiempo? Sí. ¿Me importa? No hasta que alguien más publique una respuesta válida.
fuente
+
.+
--
y<
->
pares hasta que uno pasa a ser un NOP. La mitad es tomada por un simple intérprete BF.Python 3 , 177 bytes
Pruébalo en línea!
Usé código de la respuesta de Bubbler para la simulación BF.
fuente
Python 3 , 163 bytes
Pruébalo en línea!
Programa completo que imprime resultados en STDOUT. La línea que ejecuta el código BF podría ser golfable.
Enfoque de Tyilo adoptado; Si el código BF generado no es un NOP, deséchelo por completo y vuelva a
'+-'
repetirlo.fuente
JavaScript (Node.js) , 160 bytes
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) , 224 bytes
Pruébalo en línea!
Aquí está la versión sin golf (o más bien, pre golf):
Primero seleccionamos un número aleatorio de
<
'sy>
' s para usar, y generamos una lista aleatoria con un número igual de cada uno.Para completar el resto de los caracteres, elegimos una posición en la que agregar un
+
, luego encontramos una posición donde el puntero apunta a la misma ubicación y agregamos un-
allí.Repita hasta que la lista tenga longitud
n
y stringifique el resultado.fuente