Twoim zadaniem, jeśli zdecydujesz się to zaakceptować, jest zbudowanie prostego narzędzia do oceny prawdy dla następujących operatorów logicznych:
----------------------------------------------------------------------------------
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
Tabele prawdy są w następującej kolejności:
- 1 1
- 1 0
- 0 1
- 0 0
Dane wejściowe będą miały postać prostego ciągu 0, 1 i symbolu. Możesz zaakceptować dane wejściowe jako parametr lub odczytać je od użytkownika na standardowym wejściu. Oto kilka przykładowych par wejścia / wyjścia:
Input: 1
Output: 1
Input: ~1
Output: 0
Input: 0|1
Output: 1
Input: 1>0
Output: 0
Operator jednoargumentowy (negacja) zawsze pojawi się przed wartością logiczną, podczas gdy operatory binarne zawsze pojawią się między dwiema wartościami logicznymi. Możesz założyć, że wszystkie dane wejściowe będą prawidłowe. Ciągi są zwykłymi ciągami ASCII.
Jeśli wolisz, możesz użyć T i F zamiast 1 i 0. -6 do liczby postaci, jeśli obsługujesz oba.
To jest golf-golf: wygrywa najkrótszy kod w dowolnym języku!
źródło
^
nazwa symbolu powinna oznaczać karetkę .Odpowiedzi:
APL (45–6 = 39)
Obsługuje
T
iF
jako dane wejściowe, ale zawsze będzie generować0
lub1
.Wyjaśnienie:
Z←⍞
: przeczytaj wiersz i zapisz goZ
L←'TF&|^vx>'⍳Z
: pobierz indeks'TF&|^vx>'
dla każdego znakuZ
, podając,9
jeśli znak nie jest w'TF&|^vx>'
.'10∧∨⍲⍱≠≤*'[
...]
: znajdź odpowiedni znak w'10∧∨⍲⍱≠≤*'
. (Tak więc stają się postacie, których nie było na pierwszej liście*
).↓⍉Z⍪⍉⍪
: zrób to w matrycę, umieść na nim oryginał (Z
) i podziel go na listę ciągów, gdzie pierwszy znak to oryginał, a drugi znak to tłumaczenie, jeśli istnieje.(1+9≠L)⌷¨
: dla każdego z tych ciągów uzyskaj pierwszy znak, jeśli nie było tłumaczenia (jeśliL=9
w tym miejscu) i drugi znak, jeśli był.T|0
, do tej pory mielibyśmy1∨0
odpowiednie wyrażenie APL⍎
: evalUwaga:
~
i=
już postępuj właściwie, aby nie musiały być niczym zastępowane.źródło
⍎'1010~∧∨⍲⍱≠=≤'['10TF~&|^vx=>'⍳⍞]
? (Wynik 33-6 = 27)C -
165127To było zabawne! Prosta tabela wyszukiwania, oparta na stałym przesunięciu wyszukiwania.
Z jakiegoś powodu
gets
nie zostaje niejawnie zadeklarowane, więc kiedy usunąłem dołączenie, musiałem zmienićgets(t+2)
na(gets(t+2),t)
(lub podobnie gdzie indziej, kosztując tyle samo).Wyjaśnienie
Po pierwsze, ponieważ tabele prawdy dla operatorów mają wiele nakładających się znaków, chcemy przechowywać tabele wyszukiwania w taki sposób, aby umożliwić nakładanie się. Oto jak postanowiłem je przechowywać:
Następnie chcemy zmapować symbole operatora na te przesunięcia. Robimy to, przechowując symbole operatora w tym samym ciągu z ustalonym przesunięciem od danych LUT (a mianowicie 16 znaków później, tj. Bezpośrednio po danych LUT). Proces wyszukiwania polega na „znajdowaniu operatora w
s
, odejmowaniu16
, dodawaniuleft*2+right
(operand w lewo / w prawo). Aby wyszukać pustą„ operację tożsamości ”, ze względu na sposób pobierania danych wejściowych operator w tym przypadku podejmie operację na cokolwiek, cot[1]
zostało zainicjowane - -w naszym przypadku/
. Tak więc używamy/
jako klucza tabeli odnośników do reprezentowania operacji tożsamości. Kiedy przetwarzamy jednoargumentową~
operacjęleft
„(dla wspomnianego wcześniej obliczenia wyszukiwania) jest zawsze taka sama/
./
zdarza się, że jest o jeden mniejsza niż0
ASCII-mądry, czyli kiedy kompensujemy cyfry ASCII\
będą reprezentować-1
. Ukośnik w obszarze klucza tabeli odnośników (czyli od drugiego do ostatniego znaku ws
) jest ustawiony, aby to zrekompensować.Dalej, obsługa danych wejściowych. Dane wejściowe mają długość dynamiczną, ale byłoby łatwiej, gdybyśmy mieli określone nazwy statyczne dla lewego operandu, operatora i prawego operandu, niezależnie od danych wejściowych. Gdybyśmy udawali, że potrafimy odczytać dane wejściowe od prawej do lewej, to w zasadzie dzieje się to automagicznie - prawy operand jest zawsze znakiem z prawej strony, operator (jeśli jest obecny) jest drugim z prawej, operand z lewej strony (jeśli jest obecny) ) jest od prawej do trzeciej. Aby móc zaindeksować taki ciąg, używamy go
strchr
do zlokalizowania\0
terminatora (w- 3
celu uproszczenia indeksowania). To pokazuje dlaczegot[0]
it[1]
staje się odpowiednio lewym operandem / operatorem, gdy dane wejściowe mają 1 lub 2 znaki.Podsumowując, wynik byłby
putchar(strchr(s,u[1])[(u[0] - '0')*2 + (u[2] - '0') - 15])
, ale zamiast tego pewne refaktoryzowanie i ciągłe składanie powoduje, że jesteśmy krótsiputchar(strchr(s,u[1])[u[0]*2+u[2]-159])
.źródło
Tcl,
212208-6 = 202Nie golfowany:
Myślę, że linia foreach wymaga wyjaśnienia:
split $argv {}
dzieli ciąg wejściowy (tak naprawdę jest to lista, ale kod golfowy) na jego znaki.string map {{~ 0} 1 {~ 1} 0} ...
pobiera ciąg i zastępuje~ 0
się1
i~ 1
ze0
lassign ... a
pobiera pierwszy element listy i przypisuje go do zmiennej a, zwraca resztę.foreach {op b} ... {code}
przegląda listę i za każdym razem przyjmuje 2 elementy:op
ib
set a [$op $a $b]
wykonuje polecenie w zmiennejop
, przechowuje wynik wa
źródło
JavaScript -
107105 znakówźródło
eval()
kiedy to wymyśliłem. Daj mi trochę, aby wrócić do domu i przetestować.&~
i nor =|~
?&~
a|~
, ale NAND jest po prostu odwrotnością AND. Zatem odwrócenie jednego z bitów również odwraca wynik.Befunge-98 -
104 101 98-672... ponieważ każde zadanie wymaga rozwiązania esolang .. tłumaczenia mojej implementacji C, ale zamiast tego przetwarzania znaków pojedynczo.
Ciekawostka: ZmieńREPL już nie ma.@
sięa,$
i masz ochotę niekończące rEPL zamiast (choć, jeśli zrobisz to można zauważyć, że tożsamość jest rzeczywiście „powtórz ostatnie polecenie z LHS i RHS = 0 = wejście”, który okazuje się domyślnie z tożsamością ).Ungolfed (wcześniejsza wersja):
Edycja: zainspirowany rozwiązaniem @jpjacobs, teraz polegam na pozycji znaków w LUT do reprezentowania tabel prawdy. Np.
|
Znajduje się na pozycji 1110 2 = 14, ponieważ odpowiada to tabeli prawdy dla|
.źródło
J -
6567–6 = 61Nigdy więcej b. Przysłówek. Bez policzenia przypisania funkcji: 67 znaków dla wersji TF, 63 dla wersji innej niż TF:
LgcTF obsługuje zarówno 0 i 1, a także T i F.
Obsługuje całą składnię J pod względem ciągów, nawiasów i ocenia ściśle od prawej do lewej (brak innych reguł pierwszeństwa).
Nie można używać wszystkich znaków, których nie ma na liście operatorów + Z, inne będą działać jak w standardowym J (łącznie ze zmiennymi).
Stosowanie:
źródło
Postscriptum 263
Pomysł Firefly przetłumaczony na Postscript.
Zębaty:
źródło
Befunge-93, 86 znaków
Działa poprzez haszowanie drugiego symbolu wejścia (znalezienie funkcji, która była zarówno zwarta, jak i uniknięcie kolizji było trochę pracy) dla każdej współrzędnej, i przyjmowanie pierwszego i trzeciego symbolu każdego modulo 2 jako dwóch najmniej znaczących bitów współrzędnej x, a następnie pobieranie dowolnej wartości z podanej pozycji. Lepsza funkcja skrótu lub bardziej kompaktowa metoda przechowywania / adresowania tabel prawdy to tylko dwa możliwe sposoby skrócenia długości.
źródło