Existem 16 funções booleanas distintas para duas variáveis binárias, A e B:
A B | F0 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | F13 | F14 | F15
-----------------------------------------------------------------------------------------
0 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1
0 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1
1 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1
1 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1
O operador less than <
, que normalmente não é considerado um operador lógico como NOT, AND ou OR, é de fato uma dessas funções (F4) quando aplicada a valores booleanos:
A B | A < B
-----------
0 0 | 0
0 1 | 1
1 0 | 0
1 1 | 0
Curiosamente, podemos simular qualquer uma das 15 outras funções usando expressões que contêm apenas os símbolos ()<AB10
. Essas expressões são lidas e avaliadas exatamente como seriam em muitas linguagens de programação padrão, por exemplo, parênteses devem corresponder e <
devem ter argumentos em ambos os lados.
Especificamente, essas expressões devem obedecer à seguinte gramática (fornecida na forma Backus-Naur ):
element ::= A | B | 1 | 0
expression ::= element<element | (expression)<element | element<(expression) | (expression)<(expression)
Isso significa que parênteses e expressões inúteis do formulário A<B<1
não são permitidos.
Portanto, a expressão A<B
corresponde à função F4 e A<B<1
deve ser alterada para (A<B)<1
ou A<(B<1)
.
Para provar que todas as outras 15 funções podem ser transformadas em expressões, basta formar um conjunto de expressões funcionalmente completas , pois, por definição, elas podem ser compostas em expressões para qualquer função.
Um desses conjuntos de expressões é x<1
(onde x
é A
ou B
), qual é ¬x
e (((B<A)<1)<A)<1
qual é A → B
. Negação ( ¬
) e implicação ( →
) são conhecidas por serem funcionalmente completas.
Desafio
Usando os caracteres ()<AB10
, escreva 16 expressões no formulário descrito acima que são equivalentes a cada uma das 16 funções booleanas distintas.
O objetivo é tornar cada uma das expressões o mais curta possível. Sua pontuação é a soma do número de caracteres em cada uma de suas 16 expressões. A pontuação mais baixa vence. O desempatador vai para a resposta mais antiga (desde que não tenha editado sua resposta posteriormente com expressões mais curtas tiradas de outra pessoa).
Tecnicamente, você não precisa escrever nenhum código real para este concurso, mas se você criou algum programa para ajudá-lo a gerar as expressões, é altamente recomendável publicá-las.
Você pode usar este snippet de pilha para verificar se suas expressões fazem o que é esperado:
fonte
(0, 0, 0, 1, 0, 1, 1, 0)
e(0, 1, 1, 0, 1, 0, 0, 0)
.Respostas:
100 caracteres
fonte
Existem algumas opções para algumas delas, portanto, este conjunto de 100 caracteres não é idêntico ao publicado anteriormente.
Uma prova mais fácil,
<
funcionalmente completa, seria aA<(B<1)
NOR.O código que eu usei para encontrar isso é uma simplificação pesada de algum código de otimização booleano que usei em desafios anteriores, com duas pequenas alterações:
fonte
A<B<1
não são permitidas. " uma edição feita após esta resposta.100 caracteres
fonte
100 caracteres
Ei, não é exatamente o mesmo que os outros. Eu gastei 10 minutos nisso, então vale a pena postar de qualquer maneira, mesmo que ele tenha 2 anos de idade.
fonte
100 caracteres
fonte