Votre mission, si vous choisissez de l'accepter, est de construire un simple évaluateur de vérité pour les opérateurs logiques suivants:
----------------------------------------------------------------------------------
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
Les tables de vérité sont dans l'ordre suivant:
- 1 1
- dix
- 0 1
- 0 0
L'entrée viendra comme une simple chaîne de 0, 1 et le symbole. Vous pouvez soit accepter l'entrée en tant que paramètre, soit la lire à l'utilisateur sur stdin. Voici quelques exemples de paires d'entrée / sortie:
Input: 1
Output: 1
Input: ~1
Output: 0
Input: 0|1
Output: 1
Input: 1>0
Output: 0
L'opérateur unaire (négation) apparaîtra toujours avant la valeur booléenne, tandis que les opérateurs binaires apparaîtront toujours entre les deux valeurs booléennes. Vous pouvez supposer que toutes les entrées seront valides. Les chaînes sont des chaînes ASCII normales.
Si vous préférez, vous pouvez utiliser T et F plutôt que 1 et 0. -6 pour votre nombre de personnages si vous supportez les deux.
C'est le code-golf : le code le plus court dans n'importe quelle langue gagne!
la source
^
le nom du symbole de devrait dire caret .Réponses:
APL (45 - 6 = 39)
Prend en charge
T
etF
en entrée, mais toujours en sortie0
ou1
.Explication:
Z←⍞
: lire une ligne et la stocker dansZ
L←'TF&|^vx>'⍳Z
: récupère l'index'TF&|^vx>'
pour chaque caractère dansZ
, donnant9
si le caractère n'est pas dedans'TF&|^vx>'
.'10∧∨⍲⍱≠≤*'[
...]
: recherchez le caractère correspondant dans'10∧∨⍲⍱≠≤*'
. (Donc, les personnages qui n'étaient pas dans la première liste deviennent*
).↓⍉Z⍪⍉⍪
: transformez-le en une matrice, placez l'original (Z
) dessus et divisez-le en une liste de chaînes, où le premier caractère est l'original et le deuxième caractère est sa traduction, le cas échéant.(1+9≠L)⌷¨
: pour chacune de ces chaînes, obtenez le premier caractère s'il n'y a pas de traduction (siL=9
à cet endroit) et le deuxième caractère s'il y en a.T|0
, nous aurions1∨0
maintenant quelle est l'expression APL correspondante⍎
: evalRemarque:
~
et=
faites déjà la bonne chose afin qu'ils n'aient pas besoin d'être remplacés par quoi que ce soit.la source
⍎'1010~∧∨⍲⍱≠=≤'['10TF~&|^vx=>'⍳⍞]
? (Score 33-6 = 27)C -
165127C'était amusant! Table de recherche simple reposant sur un décalage fixe pour la recherche.
Pour une raison quelconque
gets
ne j'ai enlevé l'inclure, alors quand se implicitement déclaré ne pas que je devais changergets(t+2)
de(gets(t+2),t)
(ou de la même ailleurs, ce qui coûte le plus).Explication
Tout d'abord, comme les tables de vérité pour les opérateurs ont beaucoup de caractères qui se chevauchent, nous souhaitons stocker les tables de recherche de manière à permettre le chevauchement. Voici comment j'ai choisi de les stocker:
Ensuite, nous voulons mapper les symboles d'opérateur à ces décalages. Pour ce faire, nous stockons les symboles d'opérateur dans la même chaîne à un décalage fixe des données LUT (à savoir, 16 caractères plus tard, c'est-à-dire directement après les données LUT). Le processus de recherche est "trouver l'opérateur dans
s
, soustraire16
, ajouterleft*2+right
(opérande gauche / droite). Pour la recherche de" l'opération d'identité "vide, en raison de la façon dont l'entrée est récupérée, l'opérateur dans ce cas se résoudra en tout ce quit[1]
est initialisé pour- -dans notre cas/
. Ainsi, nous utilisons/
comme clé de table de consultation pour représenter l'opération d'identité. Lorsque nous traitons l'~
opération unaire "left
" (pour le calcul de recherche mentionné précédemment) est toujours la même/
./
se trouve être un de moins que0
ASCII-sage, ce qui signifie que lorsque nous compensons les chiffres ASCII\
représentera-1
. La barre oblique dans la zone clé de la table de recherche (avant-dernier caractère danss
, c'est-à-dire) est positionnée pour compenser cela.Ensuite, la gestion des entrées. L'entrée a une longueur dynamique, mais ce serait plus facile si nous avons des noms statiques spécifiques pour l'opérande gauche, l'opérateur et l'opérande droit, quelle que soit l'entrée. Si nous prétendons que nous pourrions lire l'entrée de droite à gauche, cela se produira essentiellement de manière automagique - l'opérande de droite est toujours le caractère le plus à droite, l'opérateur (s'il est présent) est de gauche à droite, l'opérande de gauche (s'il est présent ) est le troisième à droite. Afin de pouvoir indexer la chaîne comme ceci, nous utilisons
strchr
pour localiser le\0
terminateur (- 3
pour simplifier l'indexation). Cela montre pourquoit[0]
ett[1]
devient l'opérande / opérateur gauche respectivement lorsque l'entrée est de 1 ou 2 caractères.En le rassemblant, la sortie serait
putchar(strchr(s,u[1])[(u[0] - '0')*2 + (u[2] - '0') - 15])
, mais un refactoring et un pliage constant nous raccourcissentputchar(strchr(s,u[1])[u[0]*2+u[2]-159])
.la source
Tcl,
212208-6 = 202Non golfé:
Je pense que la ligne foreach a besoin d'explications:
split $argv {}
divise la chaîne d'entrée (c'est en fait une liste, mais code-golf) en ses caractères.string map {{~ 0} 1 {~ 1} 0} ...
prend une chaîne et remplace~ 0
par1
et~ 1
par0
lassign ... a
prend le premier élément de la liste et l'assigne à la variable a, renvoie le reste.foreach {op b} ... {code}
parcourt la liste et prend 2 éléments à chaque fois:op
etb
set a [$op $a $b]
exécute la commande dans la variableop
, stocke le résultat dansa
la source
JavaScript -
107105 caractèresla source
eval()
quand j'ai inventé ça. Donnez-moi juste un peu pour rentrer à la maison et tester.&~
et nor =|~
?&~
et|~
, mais NAND est juste l'inverse de AND. Ainsi, inverser l'un des bits inverse également le résultat.Befunge-
98-104101 98-672... parce que chaque tâche a besoin d'une solution esolang .. traduction de mon implémentation C, mais traitement des caractères un par un à la place.
Fait amusant: changez leLe REPL n'est plus.@
ena,$
et vous obtenez un REPL sans fin fantaisie à la place (cependant, si vous faites cela, vous remarquerez que l'identité est en fait "répéter la dernière commande avec lhs = 0 et rhs = input", ce qui arrive par défaut à l'identité ).Non golfé (version antérieure):
Edit: inspiré par la solution de @jpjacobs, je me fie maintenant à la position des caractères dans la LUT pour représenter les tables de vérité. Par exemple,
|
est sur la position 1110 2 = 14 car cela correspond à la table de vérité pour|
.la source
J -
6567-6 = 61Plus le b. Adverbe. Sans compter l'affectation de la fonction: 67 caractères pour la version TF, 63 pour la version non TF:
LgcTF gère à la fois 0 et 1 ainsi que T et F.
Prend en charge toute la syntaxe de J en termes de trains, de parenthèses et évalue strictement de droite à gauche (pas d'autres règles de priorité).
Tous les caractères ne figurant pas dans la liste d'opérateurs + Z ne peuvent pas être utilisés, les autres agiront comme dans le standard J (y compris les variables).
Usage:
la source
Post-scriptum 263
L'idée de Firefly traduite en Postscript.
Dentelé:
la source
Befunge-93, 86 personnages
Fonctionne en hachant le deuxième symbole de l'entrée (trouver une fonction à la fois compacte et évitée les collisions était un travail) pour la coordonnée ay, et en prenant les premier et troisième symboles chaque modulo 2 comme les deux bits les moins significatifs de la coordonnée x, puis récupérer n'importe quelle valeur à la position indiquée. Une meilleure fonction de hachage ou une méthode plus compacte de stockage / adressage des tables de vérité ne sont que deux façons possibles de réduire la longueur.
la source