Continuação deste desafio porque o autor se foi e a pergunta está encerrada.
O que você precisa fazer é criar um analisador booleano.
Expressões booleanas, caso você ainda não as tenha ouvido, têm duas entradas e uma saída.
Existem quatro "portas" na aritmética booleana, a saber:
- OR (representado por
|) (operador binário, entre argumentos) - AND (representado por
&) (operador binário, entre argumentos) - XOR (representado por
^) (operador binário, entre argumentos) - NOT (representado por
!) (operador unário, argumento à direita)
Esses portões operam em suas entradas que são verdadeiras (representadas por 1) ou falsas (representadas por 0). Podemos listar as entradas possíveis ( Ae B, neste caso) e as saídas ( O) usando uma tabela verdade da seguinte maneira:
XOR
A|B|O
-----
0|0|0
0|1|1
1|0|1
1|1|0
OR
A|B|O
-----
0|0|0
0|1|1
1|0|1
1|1|1
AND
A|B|O
-----
0|0|0
0|1|0
1|0|0
1|1|1
NOT
A|O
---
0|1
1|0
Um exemplo de entrada seria 1^((1|0&0)^!(1&!0&1)), que seria avaliado para:
1^((1|0&0)^!(1&!0&1))
=1^(( 1 &0)^!(1&!0&1))
=1^( 0 ^!(1&!0&1))
=1^( 0 ^!(1& 1&1))
=1^( 0 ^!( 1 &1))
=1^( 0 ^! 1 )
=1^( 0 ^ 0 )
=1^0
=1
A saída seria 1.
Detalhes
- Como visto no exemplo, não há ordem de prevalência. Todos são avaliados da esquerda para a direita, exceto quando entre parênteses, que devem ser avaliados primeiro.
- A entrada conterá apenas
()!^&|01. - Você pode escolher qualquer caractere de 8 bytes para substituir os 8 caracteres acima, mas eles devem ter um mapeamento de 1 para 1 e devem ser indicados.
- Especificamente, a função
evalnão pode ser usada em nenhuma sequência derivada da entrada . Especificamente, a funçãoinput(ou o equivalente no idioma) e qualquer função que a chama não podem ser usadaseval. Você também não pode concatenar oinputem sua string dentro doeval.
Pontuação
Isso é código-golfe . A solução mais curta em bytes vence.