Às vezes, ao escrever o código do cérebro, você sente necessidade de prolongá-lo mais do que o necessário para incentivar a depuração. Você poderia fazer isso apenas colocando um ><
lá, mas que graça é essa? Você precisará de algo mais e menos NOPey para confundir qualquer pessoa que esteja lendo seu código.
Introdução rápida ao Brainfuck
Brainfuck é uma linguagem de programação esotérica criada em 1993 por Urban Müller, e notável por seu extremo minimalismo. (Wikipedia)
Brainfuck é uma linguagem baseada em oito comandos: +-><,.[]
. O código é executado em algo como uma máquina de Turing: uma fita infinita na qual os valores podem ser alterados. Neste desafio, focaremos nos quatro primeiros:
+ increment the value at the pointer
- decrement the value at the pointer
> move the pointer right
< move the pointer left
Brainfuck NOPs
Um NOP com ação cerebral é uma sequência de caracteres com ação cerebral que, quando executados a partir de qualquer estado, não levam a nenhuma alteração no estado. Eles consistem nos quatro caracteres mencionados acima.
O desafio
O desafio é escrever um programa ou função que, quando executado, gere um NOP aleatório com o tamanho de um determinado comprimento.
Entrada
Você receberá como entrada um inteiro par não-negativo n
. (NOPs são impossíveis para ímpares n
).
Saída
Você produzirá um NOP aleatório do tamanho do cérebro n
.
Regras
- A definição de NOP: quando a saída do programa é inserida em qualquer ponto do programa, o comportamento do programa não deve mudar de forma alguma. Em outras palavras, ele não deve alterar o estado do intérprete.
- Observe que, por exemplo
+>-<
está incorreto, pois altera os valores das duas células sem alterá-los novamente. Teste sua solução antes de postar. - Observe também que
+>-<->+<
é um NOP que não pode ser reduzido a nada apenas com a remoção><
<>
+-
-+
. Portanto, você não pode usar um algoritmo que apenas os insere.
- Observe que, por exemplo
- Todo NOP válido do comprimento
n
deve ter uma chance diferente de zero de aparecer na saída. A distribuição não precisa ser uniforme, no entanto. - O intérprete do cérebro em questão tem uma fita duplamente infinita de células de precisão arbitrárias. Ou seja, você pode ir infinitamente para as duas direções e aumentar / diminuir cada célula indefinidamente.
- O programa deve terminar dentro de 1 minuto para
n
= 100 na minha máquina, para não gerar todos os NOPs possíveis e escolher um. - Se você receber uma entrada inválida (não inteiro, negativo, ímpar, etc.), poderá fazer o que quiser, incluindo falha.
Pontuação
Isso é código-golfe , então a resposta mais curta em bytes vence.
Exemplos
Aqui estão todas as saídas válidas para n
= 4:
++-- +-+- +--+ --++ -+-+ -++-
>><< ><>< ><<> <<>> <><> <>><
><+- ><-+ <>+- <>-+
>+-< >-+< <+-> <-+>
+><- -><+ +<>- -<>+
+->< -+>< +-<> -+<>
Aqui estão algumas saídas possíveis para n
= 20:
+>>->+<->-<<<->>++<<
>+>-<+<->+-<>->+<-<+
+--+-++--++-+--+-++-
>>>>>>>>>+-<<<<<<<<<
.
tem um efeito colateral, ,
substitui um valor que não pode ser recuperado sem o uso de []
. Mas []
acabará definindo um valor para zero. Isso também substitui um valor (portanto, precisaríamos de outro []
para recuperá-lo), a menos que possamos ter certeza de que a célula afetada era zero no início. No entanto, teríamos que procurar uma célula com algo parecido [>]
e é impossível retornar com segurança à posição de onde viemos.
+-<>
como você pediu:a