Jeśli pamiętasz swoje lata szkolne, możesz pamiętać o poznawaniu tabel prawdy . Wydawały się nudne, ale są podstawą logiki i (niektórzy twierdzą) wszystkich komputerów ...
Problem
Twoim zadaniem, jeśli zdecydujesz się to zaakceptować, jest napisanie programu, funkcji lub widżetu kodu, który może wypisać dane wejściowe z tabeli prawdy.
Wejście
Dane wejściowe będą ciągiem (podobnym do struktury danych) zawierającym instrukcję logiczną, z której zostanie utworzona tablica prawdy. Na przykład:
p ∧ q
Oznacza to p and q
(sprzężenie logiczne) i spowoduje:
p q p ∧ q
T T T
T F F
F T F
F F F
Zwróć uwagę na odstępy: element kolumny znajduje się na środku nagłówka
Postacie
Ocena za pomocą znaków, a nie bajtów Znaki porównania logicznego są wyjątkowe i nie zawsze wyglądają. Użyj tych znaków:
Logiczna koniunkcja (AND): ∧
U + 2227
Logiczne rozłączenie (OR): ∨
U + 2228
Negacja logiczna (NOT) ~
lub odpowiednio ¬
U + 7e i U + ac
Bonusy
Wszystkie te bonusy są opcjonalne, ale powalą punkty na Twój wynik. Wybierz dowolny.
Logiczna negacja
Logiczna negacja jest jednym operatorem w tabelach prawdy. Jest to odpowiednik !
w większości języków opartych na C. To sprawia, że false
=> true
i odwrotnie. Jest oznaczony symbolem ¬
lub ~
(musisz obsługiwać oba). Wspieranie tego powali 10% twojego wyniku. Musisz jednak dodać dodatkową kolumnę, aby pokazać jej wyniki: Na przykład:
~p ∧ q
wyświetli:
p ~p q ~p ∧ q
T F T F
T F F F
F T T T
F T F F
Ładny druk
Normalny zapis w tabeli jest nudny. Zróbmy to ładnie! Ładny format wydruku p ∧ q
jest następujący:
+---+---+-------+
| p | q | p ∧ q |
+---+---+-------+
| T | T | T |
+---+---+-------+
| T | F | F |
+---+---+-------+
| F | T | F |
+---+---+-------+
| F | F | F |
+---+---+-------+
Specjalne szczegóły dla ładnego drukowania:
- W każdej komórce znajduje się 1 dopełnienie spacji
- Wartości komórek są nadal wyśrodkowane
Jeśli ładnie wydrukujesz swoje tabele, z kodu, a następnie pomnóż przez 0,6. Użyj tej funkcji, aby uzyskać ten bonus:
score = 0.6 * code
Przykłady
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
Zasady
- Obowiązują standardowe luki
- Brak zasobów zewnętrznych
- Jeśli masz zamiar złamać zasady, bądź sprytny;)
Najkrótszy kod (w znakach) wygrywa. Powodzenia!
źródło
p
iq
. Jeśli nie zawsze mają te nazwy, możesz pokazać kilka różnych opcji w przykładach testowych. Czy zawsze są jedną literą?score = 0.6 * (code - 15)
=.6 * code - 9
p
q
ir
w tabeli prawdy;)Odpowiedzi:
JavaScript (ES6), 141
Prosta funkcja, bez premii, 141 znaków. (140 uft8, 1 szerokość Unicode)
Złożona funkcja obsługująca ~ lub ¬, 254 znaki (253 utf, 1 szerokość Unicode), wynik 229
Może zaoszczędzić 6 bajtów
alert
zamiastconsole.log
, alealert
jest szczególnie nieodpowiedni do wyświetlania tabel.Przetestuj poniższy fragment kodu w przeglądarce zgodnej z EcmaScript 6 (testowany z Firefoksem. Nie będzie działał w Chrome, ponieważ Chrome nie obsługuje
...
. Ponadto, wersja bonusowa używa tego rozszerzeniasplit
specyficznego dla Firefoksa).źródło
Szablon MediaWiki - 2347 znaków
MediaWiki ma wbudowaną funkcję szablonu o nazwie,
{{#expr}}
która może obsługiwać wyrażenia logiczne. To musi być idealne wyzwanie dla szablonów MediaWiki! Jednak pomogłyby takie funkcje, jak zmienne, pętle i czytelna składnia. Również fakt, że nie ma operatora NOT dla funkcji expr, spowodował, że była ona nieco bardziej złożona.Test:
Wynik:
Zakładam, że MediaWiki> = 1.18, w którym rozszerzenia ParserFunctions są dostarczane wraz z oprogramowaniem.
źródło
¬
/~
; jeśli go dodasz, będziesz kwalifikować się do10%
premii.Python - 288 znaków (+10 kar, ponieważ nie mogłem zmusić Unicode do działania: c)
Brak bonusów. To moja pierwsza odpowiedź na codegolf.
i
jest wejściem.EDYCJA: Usunięto kilka spacji i używa teraz argumentów funkcji jako danych wejściowych.
źródło
Dyalog APL ,
5848 znakówWymaga
⎕IO←0
, co jest domyślne w wielu systemach. Bierze ciąg jako argument.Brak bonusów, ale na plus każdy operator działa.
⍳4
pierwsze cztery wskaźniki (0 1 2 3)⌽
rewers (3 2 1 0)2 2⊤
dwubitowy stół boolowski↓
podzielony na dwuelementową listę list (high-bit, low-bit)p q←
zapisz jako p i q≢
podsumuj je (2) *9⍴
cyklicznie przekształcaj to do długości 9 (2 2 2 2 2 2 2 2 2)324⊤⍨
w ten sposób koduje 324, tj. jako 12-bitowy plik binarny (1 0 1 0 0 0 1 0 0)\⍨
użyj tego, aby rozwinąć (wstaw spację dla każdego 0) ...'FT '[
...]
ciąg „FT”, indeksowany przez⍎⍵
wykonany argument (poprawny, ponieważ p i q mają teraz wartości)⍪
zrób to w matrycę kolumnyq,
wstaw kolumnę składającą się z q (1 1 0 0)q,
wstaw kolumnę składającą się z p (1 0 1 0)(
...)⍪
wstaw wiersz powyżej, składający się z⍵
argument'p q ',
poprzedzony ciągiem „p q”* Oznacz ten problem gwiazdką, jeśli widzisz
≢
jako≢
i nie jako̸≡
.źródło
Julia, 161 bajtów
Brak bonusów.
Nie golfowany:
źródło
Mathematica, 129 bajtów
Gra w golfa:
Nie golfowany:
Nie jestem ekspertem od matematyki, ale uznałem to za dość eleganckie w porównaniu do konieczności bezpośredniego porównywania postaci.
Miałem rozwiązanie, które działało na negację, ale było dłuższe, niż obniżenie wyniku.
W zależności od tego, co kwalifikuje się do ładnego drukowania, mogę spróbować tego bonusu. Wydaje mi się, że wyświetlanie w ASCII w Mathematica byłoby zbyt drogie, aby zrównoważyć wynik, ale jeśli dwie główne cechy to kropkowana ramka i określone wypełnienie w komórkach, to tylko kilka opcji w siatce.
Z ładnym drukiem, 171 * 0,6 = 102,6 Bajtów
źródło
Python3,
145139120119 bajtówBez premii (z premią na końcu)
Potrzebuję Python3 do obsługi Unicode po wyjęciu z pudełka.
Oparty na kodzie Python DJgamer98, ustalenie, że jego stół jest niewłaściwy.
Edycja1: Podział na odrębne zmienne i odrzucenie zmiennej łańcuchowej operatora
Edycja2: (ab) używając F i T jako zmiennych i znaków łańcuchowych
Edycja3: Oszczędność jednego miejsca dzięki NoOneIsHere
Z premią, 215 * 0,6 = 129
źródło
q in c:
.C / C ++ 302 bajtów
335 znaków mniej niż 10% na obsługę negacji. Formatowanie niekompletne, ale przesłanie, zanim zobaczę, jaki jest wpływ zakończenia.
Oznaczone jako C / C ++, ponieważ moje gcc i g ++ akceptują to z opcją -fpermissive i dla mnie wygląda to bardziej C niż C ++.
Jestem pewien, że jest kilka poprawek, które można zastosować. W rzeczywistości obsługa notatek dodaje więcej niż 10% usunięć premii.
Zakłada się, że format wejściowy jest zgodny z podanymi, tj. 2 wartości wejściowe (p i q), z prefiksem non i bez oraz bez innych elementów i bez nich oraz wszystkie tokeny rozdzielone pojedynczą spacją.
Nie golfowany:
i testy:
źródło
Mathematica, 128 znaków
jest znakiemU+F3C7
reprezentującym prywatny użytek\[Transpose]
.Na szczęście dla nas golfistów Mathematica,
∧
i∨
już reprezentacjiAnd
iOr
tak wszystko co musimy zrobić, to przekształcić ciąg wejściowy na wypowiedzi Mathematica i możemy zrobić symboliczne operacje logiczne na nim.Zauważ, że to rozwiązanie będzie również obsługiwać
Not
(¬
),Implies
(
),Equivalent
(⧦
),Xor
(⊻
),Nand
(⊼
),Xor
(⊻
) iNor
(⊽
), ale nie dostanie premii, ponieważ~p
jest to błąd składniowy w Mathematica. MehWyjaśnienie
Konwertuje ciąg wejściowy na wyrażenie Mathematica i przechowuje go w
b
.Jest to lista wszystkich możliwych podwyrażeń danych wejściowych. Każdy otrzyma własną kolumnę.
To jest lista wszystkich zmiennych pojawiających się na wejściu.
Czysta funkcja, która przyjmuje wyrażenie wejściowe
#
i zwraca listę wartości prawdy dla wszystkich możliwych kombinacji wartości prawdy dla zmiennych.Dołącza samo wyrażenie do tej listy.
Stosuje tę funkcję do każdego podwyrażenia wejścia.
Następnie zamień true (
0<1
) na „T”, a false (0>1
) na „F”.Zamień wiersze i kolumny.
Wyświetl wynik jako
Grid
.Konwertuj na
Grid
tradycyjną formę, aby używała fantazyjnych symboli.źródło