Wenn Sie sich dafür entscheiden, dies zu akzeptieren, besteht Ihre Mission darin, einen einfachen Wahrheitsbewerter für die folgenden logischen Operatoren zu erstellen:
----------------------------------------------------------------------------------
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
Wahrheitstabellen sind in der folgenden Reihenfolge:
- 1 1
- 1 0
- 0 1
- 0 0
Die Eingabe erfolgt als einfache Zeichenfolge aus 0, 1 und dem Symbol. Sie können Eingaben entweder als Parameter akzeptieren oder vom Benutzer auf stdin lesen. Hier sind einige Beispiele für Eingabe- / Ausgabepaare:
Input: 1
Output: 1
Input: ~1
Output: 0
Input: 0|1
Output: 1
Input: 1>0
Output: 0
Der unäre Operator (Negation) wird immer vor dem booleschen Wert angezeigt, während die binären Operatoren immer zwischen den beiden booleschen Werten angezeigt werden. Sie können davon ausgehen, dass alle Eingaben gültig sind. Strings sind reguläre ASCII-Strings.
Wenn Sie es vorziehen, können Sie T und F anstelle von 1 und 0 verwenden. -6 für Ihre Zeichenanzahl, wenn Sie beide unterstützen.
Das ist Code-Golf : Der kürzeste Code in jeder Sprache gewinnt!
quelle
^
, der Symbolname sollte Caret sagen .Antworten:
APL (45 - 6 = 39)
Unterstützt
T
undF
als Eingabe, wird aber immer0
oder ausgegeben1
.Erläuterung:
Z←⍞
: Lesen Sie eine Zeile und speichern Sie sie inZ
L←'TF&|^vx>'⍳Z
: Geben Sie den Index'TF&|^vx>'
für jedes Zeichen einZ
und geben Sie an,9
ob das Zeichen nicht vorhanden ist'TF&|^vx>'
.'10∧∨⍲⍱≠≤*'[
...]
: finde das entsprechende Zeichen in'10∧∨⍲⍱≠≤*'
. (So werden Zeichen, die nicht in der ersten Liste waren*
).↓⍉Z⍪⍉⍪
: Machen Sie dies zu einer Matrix, legen Sie das Original (Z
) darauf und teilen Sie es in eine Liste von Zeichenfolgen auf, wobei das erste Zeichen das Original und das zweite Zeichen die Übersetzung ist, falls vorhanden.(1+9≠L)⌷¨
: Holen Sie sich für jede dieser Zeichenfolgen das erste Zeichen, wenn keine Übersetzung vorhanden war (falls vorhandenL=9
), und das zweite Zeichen, falls vorhanden.T|0
, hätten wir1∨0
inzwischen den entsprechenden APL-Ausdruck⍎
: evalHinweis:
~
und=
tun Sie bereits das Richtige, damit sie nicht durch irgendetwas ersetzt werden müssen.quelle
⍎'1010~∧∨⍲⍱≠=≤'['10TF~&|^vx=>'⍳⍞]
? (Punktzahl 33-6 = 27)C -
165127Das hat Spaß gemacht! Einfache Nachschlagetabelle, die sich auf einen festen Versatz für die Suche stützt.
Aus irgendeinem Grund wird
gets
dies nicht implizit deklariert. Als ich das Include entfernte, musste ichgets(t+2)
zu(gets(t+2),t)
(oder ähnlich woanders, was genauso viel kostet) wechseln .Erläuterung
Da die Wahrheitstabellen für die Operatoren viele überlappende Zeichen enthalten, möchten wir die Nachschlagetabellen so speichern, dass Überlappungen möglich sind. So habe ich sie gespeichert:
Als nächstes wollen wir diesen Offsets Operatorsymbole zuordnen. Dazu speichern wir die Operatorsymbole in derselben Zeichenfolge mit einem festen Versatz zu den LUT-Daten (nämlich 16 Zeichen später, dh direkt nach den LUT-Daten). Der Suchvorgang lautet "Operator suchen in
s
, subtrahieren16
, addierenleft*2+right
(linker / rechter Operand). Für die Suche nach der leeren" Identitätsoperation "wird der Operator in diesem Fall aufgrund des Abrufs der Eingabe in das aufgelöst, wast[1]
initialisiert wird. -in unseren Fall/
. so verwenden wir/
als Schlüssel - Lookup - Tabelle , um die Identitätsoperation darzustellen. Wenn wir den einstelligen verarbeiten~
Betrieb „left
“ (für die Lookup - Berechnung bereits erwähnte) ist immer das gleiche/
./
geschieht eine kleiner zu sein als0
ASCII-weise, dh wenn wir ASCII-Ziffern kompensieren,\
wird dies dargestellt-1
. Der Schrägstrich im Schlüsselbereich der Nachschlagetabelle (dh vorletztes Zeichen ins
) ist so positioniert, dass dies ausgeglichen wird.Als nächstes Eingabehandhabung. Die Eingabe hat eine dynamische Länge, aber es wäre einfacher, wenn wir unabhängig von der Eingabe bestimmte statische Namen für den linken Operanden, den Operator und den rechten Operanden haben. Wenn wir so tun, als könnten wir die Eingabe von rechts nach links lesen, würde dies grundsätzlich automatisch geschehen - der rechte Operand ist immer das Zeichen ganz rechts, der Operator (falls vorhanden) ist der zweit-rechts-Operand, der linke Operand (falls vorhanden) ) ist von rechts nach rechts. Um die Zeichenfolge so indizieren zu können, verwenden wir sie
strchr
, um den\0
Terminator zu lokalisieren (- 3
um die Indizierung zu vereinfachen). Dies zeigt, warumt[0]
undt[1]
wird der linke Operand / Operator, wenn die Eingabe 1 oder 2 Zeichen umfasst.Zusammengenommen wäre die Ausgabe
putchar(strchr(s,u[1])[(u[0] - '0')*2 + (u[2] - '0') - 15])
, aber einige Umgestaltungen und ständige Faltungen bringen uns stattdessen umso kürzerputchar(strchr(s,u[1])[u[0]*2+u[2]-159])
.quelle
Tcl,
212208-6 = 202Ungolfed:
Ich denke, die foreach-Zeile braucht eine Erklärung:
split $argv {}
teilt die Eingabezeichenfolge (es ist eigentlich eine Liste, aber Code-Golf) in ihre Zeichen.string map {{~ 0} 1 {~ 1} 0} ...
nimmt einen String und ersetzt~ 0
durch1
und~ 1
mit0
lassign ... a
Nimmt das erste Element der Liste und weist es der Variablen a zu, gibt den Rest zurück.foreach {op b} ... {code}
geht über die Liste und nimmt jedes Mal 2 Elemente:op
undb
set a [$op $a $b]
führt den Befehl in der Variablen ausop
und speichert das Ergebnis ina
quelle
JavaScript -
107105 Zeichenquelle
eval()
Ich habe nicht einmal daran gedacht, wann ich das erfunden habe. Gib mir einfach ein bisschen, um nach Hause zu kommen und es zu testen.&~
und nor =|~
?&~
und|~
, aber NAND ist nur die Umkehrung von UND. Das Invertieren eines der Bits invertiert also auch das Ergebnis.Befunge-98 -
104 101 98-672... weil jede Aufgabe eine Esolang-Lösung benötigt .. Übersetzung meiner C-Implementierung, aber stattdessen die Verarbeitung von Zeichen nacheinander.
Unterhaltsame Tatsache: Ändern Sie dasDie REPL ist nicht mehr.@
ina,$
und Sie erhalten stattdessen eine ausgefallene, nie endende REPL (wenn Sie dies tun, werden Sie jedoch feststellen, dass Identität tatsächlich "letzten Befehl mit lhs = 0 und rhs = Eingabe wiederholen" ist, was zufällig standardmäßig Identität ist ).Ungolfed (frühere Version):
Bearbeiten: Inspiriert von der Lösung von @jpjacobs, verlasse ich mich jetzt auf die Position der Zeichen in der LUT, um Wahrheitstabellen darzustellen. ZB
|
ist auf Position 1110 2 = 14, weil dies der Wahrheitstabelle für entspricht|
.quelle
J -
6567-6 = 61Nicht mehr die b. Adverb. Ohne die Zuordnung der Funktion zu zählen: 67 Zeichen für die TF-Version, 63 für die Nicht-TF-Version:
LgcTF behandelt sowohl 0 und 1 als auch T und F.
Unterstützt die gesamte Syntax von J in Bezug auf Züge und Klammern und wird streng von rechts nach links ausgewertet (keine anderen Vorrangregeln).
Alle Zeichen, die nicht in der Operatorliste + Z enthalten sind, können nicht verwendet werden, andere verhalten sich wie in Standard J (einschließlich Variablen).
Verwendungszweck:
quelle
Nachtrag 263
Die Idee von Firefly wurde in Postscript übersetzt.
Eingerückt:
quelle
Befunge-93, 86 Zeichen
Das Hashing des zweiten Symbols der Eingabe (das Finden einer Funktion, die sowohl kompakt war als auch Kollisionen vermeidet, war eine Arbeit) für jede Koordinate und das erste und dritte Symbol jedes Modulo 2 als die zwei niedrigstwertigen Bits der x-Koordinate Abrufen eines beliebigen Werts an der angegebenen Position. Eine bessere Hash-Funktion oder eine kompaktere Methode zum Speichern / Adressieren der Wahrheitstabellen sind nur zwei Möglichkeiten, die Länge zu reduzieren.
quelle