Se você se lembrar dos anos de escolaridade, lembre-se de aprender sobre as Tabelas da Verdade . Eles pareciam chatos, mas são a base da lógica e (alguns argumentariam) toda a computação ...
Problema
Sua missão, caso você aceite aceitá-la, é escrever um programa, função ou widget de código que possa gerar uma tabela verdade fornecida.
Entrada
A entrada será uma string (como estrutura de dados) contendo a instrução lógica na qual a Tabela da Verdade será inserida. Por exemplo:
p ∧ q
Isso significa p and q
(conjunção lógica) e produzirá:
p q p ∧ q
T T T
T F F
F T F
F F F
Observe o espaçamento: O item da coluna está no centro do cabeçalho
Personagens
Pontuação por caracteres, não bytes Os caracteres de comparação lógica são especiais e nem sempre são o que parecem. Use estes caracteres:
Conjunção lógica (AND): ∧
U + 2227
Disjunção lógica (OR): ∨
U + 2228
Negação lógica (NOT) ~
ou ¬
U + 7e e U + ac respectivamente
Bónus
Todos esses bônus são opcionais, mas eliminam pontos da sua pontuação. Escolha qualquer.
Negação Lógica
Negação lógica é um operador unário em tabelas verdadeiras. É o equivalente !
na maioria dos idiomas baseados em C. Faz false
=> true
e vice-versa. É anotado com um ¬
ou ~
(você deve suportar ambos). Apoiar isso derrubará 10% da sua pontuação. Você deve, no entanto, adicionar uma coluna adicional para mostrar seus resultados: Por exemplo:
~p ∧ q
irá produzir:
p ~p q ~p ∧ q
T F T F
T F F F
F T T T
F T F F
Pretty Print
A notação de tabela normal é chata. Vamos torná-lo bonito! O formato de impressão bonito é o seguinte para p ∧ q
:
+---+---+-------+
| p | q | p ∧ q |
+---+---+-------+
| T | T | T |
+---+---+-------+
| T | F | F |
+---+---+-------+
| F | T | F |
+---+---+-------+
| F | F | F |
+---+---+-------+
Detalhes especiais para impressão bonita:
- Há um preenchimento de 1 espaço em cada célula
- Os valores das células ainda estão centralizados
Se você imprimir suas tabelas, use seu código e multiplique por 0,6. Use esta função para este bônus:
score = 0.6 * code
Exemplos
p ∧ q
:
p q p ∧ q
T T T
T F F
F T F
F F F
p ∨ q
:
p q p ∨ q
T T T
T F T
F T T
F F F
~p ∧ q
:
p ~p q ~p ∧ q
T F T F
T F F F
F T T T
F T F F
~p ∨ q
:
p ~p q ~p ∧ q
T F T T
T F F F
F T T T
F T F T
Regras
- Aplicam-se brechas padrão
- Nenhum recurso externo
- Se você for violar as regras, seja inteligente;)
O código mais curto (em caracteres) vence. Boa sorte!
fonte
p
eq
. A menos que eles sempre tenham esses nomes, você pode mostrar algumas opções diferentes nos exemplos de teste. Eles são sempre uma única letra?score = 0.6 * (code - 15)
=.6 * code - 9
p
q
er
em uma tabela de verdade)Respostas:
JavaScript (ES6), 141
Função simples, sem bônus, 141 caracteres. (140 uft8, 1 unicode de largura)
Manuseio de funções complexas ~ ou ¬, 254 caracteres (253 utf, 1 unicode de largura), pontuação 229
Pode economizar 6 bytes usando em
alert
vez deconsole.log
, masalert
é particularmente inadequado para exibir tabelas.Teste a execução do snippet abaixo em um navegador compatível com EcmaScript 6 (testado com Firefox. Não funcionará no Chrome, pois o Chrome não suporta
...
. Além disso, a versão bônus usa uma extensãosplit
específica do Firefox).fonte
Modelo do MediaWiki - 2347 caracteres
O MediaWiki possui uma função de modelo criada chamada
{{#expr}}
que pode lidar com expressões lógicas. Esse deve ser o desafio perfeito para os modelos do MediaWiki! Porém, recursos como variáveis, loops e uma sintaxe legível teriam ajudado um pouco. Além disso, o fato de não haver um operador NOT para a função expr a tornou um pouco mais complexa.Teste:
Resultado:
Estou assumindo o MediaWiki> = 1,18, onde as extensões ParserFunctions são fornecidas com o software.
fonte
¬
/~
está ausente; se você adicioná-lo, você se qualificará para um10%
bônus.Python - 288 caracteres (+10 de penalidade, não consegui fazer o unicode funcionar: c)
Sem bônus. Esta é a minha primeira resposta codegolf.
i
é a entrada.EDIT: Removidos alguns espaços e agora usa a função args como entrada.
fonte
Dyalog APL ,
5848 caracteresRequer
⎕IO←0
, que é padrão em muitos sistemas. Aceita string como argumento.Sem bônus, mas no lado positivo, qualquer operador trabalha.
⍳4
quatro primeiros índices (0 1 2 3)⌽
reverso (3 2 1 0)2 2⊤
tabela booleana de dois bits↓
dividido em lista de dois elementos de listas (bits altos, bits baixos)p q←
loja como p e q≢
contabilize-os (2) *9⍴
remodelar ciclicamente para o comprimento 9 (2 2 2 2 2 2 2 2 2)324⊤⍨
codificar 324 assim, ou seja, como binário de 12 bits (1 0 1 0 0 0 1 0 0)\⍨
use isso para expandir (insira um espaço para cada 0) ...'FT '[
...]
a sequência "FT", indexada por⍎⍵
o argumento executado (válido desde que p e q agora tenham valores)⍪
transformá-lo em uma matriz de colunasq,
precede uma coluna que consiste em q (1 1 0 0)q,
precede uma coluna que consiste em p (1 0 1 0)(
...)⍪
insira uma linha acima, consistindo em⍵
o argumento'p q ',
anexado com a sequência "p q"* Marque esta edição com estrela se você vê
≢
como≢
e não como̸≡
.fonte
Julia, 161 bytes
Sem bônus.
Ungolfed:
fonte
Mathematica, 129 bytes
Golfe:
Ungolfed:
Não sou especialista em Mathematica, mas achei isso bastante elegante em comparação a ter que fazer uma comparação direta de caracteres.
Eu tinha uma solução que funcionava para negação, mas era mais longa do que a redução de pontuação decolaria.
Dependendo do que se qualifica para uma impressão bonita, eu posso tentar esse bônus. Eu sinto que a saída em ASCII no Mathematica seria muito cara para a redução de pontuação compensar, mas se os dois principais recursos são uma borda pontilhada e preenchimento especificado dentro das células, são apenas algumas opções no Grid.
Com impressão bonita, 171 * 0,6 = 102,6 bytes
fonte
Python3,
145139120119 BytesSem bônus (com bônus no final)
Precisando de suporte ao Python3 para Unicode imediatamente.
Baseado no código Python do DJgamer98, descobrir sua tabela não está certo.
Edit1: Dividindo em variáveis distintas e omitindo a variável de sequência do operador
Edit2: (ab) usando F e T como variáveis e caracteres de sequência
Edit3: Salvando um espaço graças a NoOneIsHere
Com bônus, 215 * 0,6 = 129
fonte
q in c:
.C / C ++ 302 bytes
335 caracteres menos 10% para lidar com negação. Formatação incompleta, mas envio antes que eu veja qual é o impacto da conclusão.
Marcado como C / C ++ porque meu gcc e g ++ o aceitam com -fpermissive e parece muito mais C do que C ++ para mim.
Tenho certeza de que provavelmente há alguns ajustes que poderiam ser aplicados. De fato, lidar com o nots adiciona mais do que o bônus de 10% remove.
Isso pressupõe que o formato de entrada seja o indicado, ou seja, 2 valores de entrada (p e q), com ou sem o prefixo not e nada mais, e todos os tokens delimitados por um único espaço.
Ungolfed:
e os testes:
fonte
Mathematica, 128 caracteres
é o caractere de uso privado queU+F3C7
representa\[Transpose]
.Felizmente para nós, jogadores do Mathematica,
∧
e∨
já representamosAnd
eOr
, portanto, tudo o que precisamos fazer é converter a string de entrada em uma expressão do Mathematica e podemos fazer operações lógicas simbólicas nela.Observe que esta solução também manipula
Not
(¬
),Implies
(
),Equivalent
(⧦
),Xor
(⊻
),Nand
(⊼
),Xor
(⊻
) eNor
(⊽
), mas não recebe o bônus porque~p
é um erro de sintaxe no Mathematica. Meh.Explicação
Converte a sequência de entrada em uma expressão do Mathematica e a armazena
b
.Esta é uma lista de todas as subexpressões possíveis da entrada. Cada um receberá sua própria coluna.
Esta é uma lista de todas as variáveis que aparecem na entrada.
Função pura que pega uma expressão de entrada
#
e retorna uma lista de valores de verdade para todas as combinações possíveis de valores de verdade para as variáveis.Anexa a própria expressão a esta lista.
Aplica essa função a cada subexpressão da entrada.
Em seguida, substitua true (
0<1
) por "T" e false (0>1
) por "F".Troque linhas e colunas.
Exiba o resultado como a
Grid
.Converta a
Grid
forma tradicional para que ela use os símbolos extravagantes.fonte