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.