Seu desafio é reduzir o código Brainfuck , de acordo com estas regras:
- Remova qualquer coisa que não seja uma
+-><[].,. - Para qualquer grupo de consecutivo
+ou-caracteres, se a quantidade de+s e-s é o mesmo, removê-los. - Faça o mesmo que acima, mas com
>e<. - Remova as seqüências dos
+-><caracteres se eles não fizerem nada. Por exemplo, você deve remover+>-<->+<. (Esse pode ser o mais difícil e difícil de implementar.) Certifique-se de que não obtém nenhum falso positivo, como+>-<+>-<, que não deve ser removido.
Casos de teste:
Entrada
++++++[->++++++<]>. prints a $
[-]< resets tape
>,[>,]<[.<] reverses NUL terminated input string
++-->><< does nothing
Saída
++++++[->++++++<]>.[-],[>,]<[.<]
Entrada
Should disappear: ++>>+<+++<->-->-<<->-<
Should disappear: +++>-<--->+<
Should stay: +++>-<+>---<
Saída
+++>-<+>---<
Você pode aceitar entrada e saída como desejar - stdin / stdout, uma função etc., mas a entrada pode não ser codificada.
Isso é código-golfe , então o código mais curto na contagem de caracteres vencerá.
+++>-<+>---<? Ele pode ser reduzido para evitar movimentos desnecessários do ponteiro, mas a saída esperada o mantém inalterado. Meu entendimento, baseado em olhar tanto para a pergunta quanto para as respostas, é que a maçaneta da porta é legal com a especificação sendo tomada livremente; devemos eliminar quaisquer +-><sequências contíguas no-op , conforme explicitamente declaradas, e além disso é permitido realizar minificação extra como no seu exemplo ++>>++<<--, e também podemos fazer rearranjos, desde que não alterem a funcionalidade do código, por exemplo, >+<+em +>+<.
+>-<->+<. (Este pode ser o mais difícil e difícil de implementar.) Verifique se você não obteve nenhum falso positivo, como +>-<+>-<, por exemplo, que não deve ser removido ". - isso é meio vago #
++>>++<<--deve sair>>++<<, e isso não foi coberto. Por favor, adicione mais casos de teste.