Sua missão, se você optar por aceitá-la, é construir um avaliador simples da verdade para os seguintes operadores lógicos:
----------------------------------------------------------------------------------
Logical Name | Gate Name | Symbol | Symbol Name | Truth Table
----------------------------------------------------------------------------------
Identity | is | | (none) | 10
Negation | not | ~ | tilde | 01
Conjunction | and | & | ampersand | 1000
Disjunction | or | | | pipe | 1110
Negative Conjunction | nand | ^ | caret | 0111
Joint Denial | nor | v | "vee" | 0001
Exclusive Disjunction | xor | x | "ecks" | 0110
Equivalence | equals/xnor | = | equals | 1001
Implication | implies | > | greater than | 1011
As tabelas de verdade estão na seguinte ordem:
- 1 1
- 1 0
- 0 1
- 0 0
A entrada virá como uma sequência simples de 0, 1 e o símbolo. Você pode aceitar a entrada como um parâmetro ou lê-la do usuário no stdin. Aqui estão alguns pares de entrada / saída de amostra:
Input: 1
Output: 1
Input: ~1
Output: 0
Input: 0|1
Output: 1
Input: 1>0
Output: 0
O operador unário (negação) sempre aparecerá antes do valor booleano, enquanto os operadores binários sempre aparecerão entre os dois valores booleanos. Você pode assumir que todas as entradas serão válidas. Strings são regulares ASCII.
Se preferir, você pode usar T e F em vez de 1 e 0. -6 para a contagem de caracteres, se você suportar os dois.
Este é o código-golfe : o código mais curto em qualquer idioma vence!
fonte
^
o nome do símbolo deve dizer sinal de intercalação .Respostas:
APL (45 - 6 = 39)
Suporta
T
eF
como entrada, mas sempre exibirá0
ou1
.Explicação:
Z←⍞
: leia uma linha e guarde-a emZ
L←'TF&|^vx>'⍳Z
: obtém o índice'TF&|^vx>'
para cada caractereZ
, indicando9
se o caractere não está'TF&|^vx>'
.'10∧∨⍲⍱≠≤*'[
...]
: encontre o caractere correspondente em'10∧∨⍲⍱≠≤*'
. (Assim, os personagens que não estavam na primeira lista se tornam*
).↓⍉Z⍪⍉⍪
: faça isso em uma matriz, coloque o original (Z
) em cima e divida-o em uma lista de cadeias, onde o primeiro caractere é o original e o segundo caractere é a sua tradução, se houver.(1+9≠L)⌷¨
: para cada uma dessas cadeias, obtenha o primeiro caractere se não houver tradução (se estiverL=9
nesse local) e o segundo caractere se houver.T|0
, teríamos1∨0
agora qual é a expressão APL correspondente⍎
: evalNota:
~
e=
já faça a coisa certa para que eles não precisem ser substituídos por nada.fonte
⍎'1010~∧∨⍲⍱≠=≤'['10TF~&|^vx=>'⍳⍞]
? (Pontuação 33-6 = 27)C -
165127Foi divertido! Tabela de pesquisa simples que depende de um deslocamento fixo para a pesquisa.
Por algum motivo
gets
, não é declarado implicitamente; portanto, quando removi o include, tive que mudargets(t+2)
para(gets(t+2),t)
(ou similarmente em outro lugar, custando tanto).Explicação
Antes de tudo, como as tabelas verdadeiras para os operadores têm muitos caracteres sobrepostos, queremos armazenar as tabelas de pesquisa de uma maneira que permitamos a sobreposição. Aqui está como eu escolhi armazená-los:
Em seguida, queremos mapear os símbolos do operador para esses deslocamentos. Fazemos isso armazenando os símbolos do operador na mesma string em um deslocamento fixo dos dados do LUT (ou seja, 16 caracteres depois, ou seja, diretamente após os dados do LUT). O processo de pesquisa é "localizar operador em
s
, subtrair16
, adicionarleft*2+right
(operando esquerdo / direito). Para a pesquisa da" operação de identidade "vazia, devido à maneira como a entrada é buscada, o operador nesse caso resolverá o quet[1]
for inicializado para- -no nosso caso/
. Assim, utilizamos/
como a chave tabela de pesquisa para representar a operação de identidade. quando processar o unário~
operação "left
" (para o cálculo de pesquisa mencionado anteriormente) é sempre esta mesma/
./
passa a ser um a menos que0
Em termos ASCII, significa que quando compensarmos os dígitos ASCII\
representará-1
. A barra na área de chave da tabela de pesquisa (penúltimo caracteres
, isto é) é posicionada para compensar isso.Em seguida, manipulação de entrada. A entrada possui comprimento dinâmico, mas seria mais fácil se tivéssemos nomes estáticos específicos para o operando esquerdo, operador e operando direito, independentemente da entrada. Se fingirmos que poderíamos ler a entrada da direita para a esquerda, isso basicamente aconteceria automagicamente - o operando direito é sempre o caractere mais à direita, o operador (se presente) é a segunda à direita, o operando esquerdo (se presente) ) é a terceira à direita. Para poder indexar a string como esta, usamos
strchr
para localizar o\0
terminador (- 3
para simplificar a indexação). Isso mostra o porquêt[0]
et[1]
se torna o operando / operador esquerdo, respectivamente, quando a entrada possui 1 ou 2 caracteres.Juntando tudo, a saída seria
putchar(strchr(s,u[1])[(u[0] - '0')*2 + (u[2] - '0') - 15])
, mas algumas refatorações e dobragens constantes nos deixam mais curtosputchar(strchr(s,u[1])[u[0]*2+u[2]-159])
.fonte
Tcl,
212208-6 = 202Ungolfed:
Eu acho que a linha foreach precisa de alguma explicação:
split $argv {}
divide a string de entrada (na verdade é uma lista, mas codifica golfe) em seus caracteres.string map {{~ 0} 1 {~ 1} 0} ...
pega uma string e substitui~ 0
por1
e~ 1
por0
lassign ... a
pega o primeiro elemento da lista e o atribui à variável a, retorna o restante.foreach {op b} ... {code}
percorre a lista e utiliza 2 elementos de cada vez:op
eb
set a [$op $a $b]
executa o comando na variávelop
, armazena o resultado ema
fonte
JavaScript -
107105 caracteresfonte
eval()
quando eu inventei isso. Apenas me dê um pouco para chegar em casa e testá-lo.&~
e nem =|~
?&~
e|~
, mas NAND é apenas o inverso de AND. Inverter um dos bits também inverte o resultado.Befunge-98 -
104 101 98-672... porque toda tarefa precisa de uma solução esolang .. tradução da minha implementação C, mas processando caracteres um de cada vez.
Curiosidade: mudeO REPL não existe mais.@
paraa,$
e você obtém um REPL sofisticado e interminável (no entanto, se você fizer isso, perceberá que a identidade é realmente "repita o último comando com lhs = 0 e rhs = input", que por padrão é a identidade. )Ungolfed (versão anterior):
Edit: inspirado na solução @jpjacobs, agora confio na posição dos caracteres na LUT para representar tabelas de verdade. Por exemplo,
|
está na posição 1110 2 = 14 porque isso corresponde à tabela verdade para|
.fonte
J -
6567-6 = 61Não mais o b. Advérbio. Sem contar a atribuição da função: 67 caracteres para a versão TF, 63 para a versão não TF:
LgcTF lida com 0 e 1, bem como com T e F.
Suporta toda a sintaxe de J em termos de trens, parênteses e avalia estritamente da direita para a esquerda (nenhuma outra regra de precedência).
Todos os caracteres que não estão na lista de operadores + Z não podem ser usados, outros atuarão como no padrão J (incluindo variáveis).
Uso:
fonte
Postscript 263
A ideia de Firefly foi traduzida para Postscript.
Recuado:
fonte
Befunge-93, 86 caracteres
Funciona com hash do segundo símbolo da entrada (encontrar uma função que seja compacta e evitar colisões foi um pouco trabalhoso) para todas as coordenadas e pegar o primeiro e o terceiro símbolos de cada módulo 2 como os dois bits menos significativos da coordenada x; recuperando qualquer valor que esteja na posição indicada. Uma função de hash melhor ou um método mais compacto de armazenar / endereçar as tabelas verdadeiras são apenas duas maneiras possíveis de reduzir o comprimento.
fonte