Bramy logiczne ręcznie


13

Stwórz program, który symuluje podstawowe bramki logiczne.

Wprowadzanie: słowo pisane wielkimi literami, po których następuje 2 1-cyfrowe liczby binarne, oddzielone spacjami, np OR 1 0. Bramy OR, AND, NOR, NAND, XOR, i XNORsą potrzebne.

Dane wyjściowe: Jakie dane wyjściowe wprowadzonej bramki logicznej otrzymają dwie liczby: 1 lub 0.

Przykłady:
AND 1 0 staje 0
XOR 0 1się 1
OR 1 1staje się 1
NAND 1 1staje0

To jest codegolf, więc wygrywa najkrótszy kod.


Czy możemy wziąć tablicę jako dane wejściowe?
— Quintec,

no @Quintec nie możesz
— qazwsx

3
Czy możemy wyprowadzać jako prawda / fałsz?
— xnor

5
sure @xnor (również odpowiednia nazwa użytkownika)
— qazwsx

Odpowiedzi:



29

Python 2 , 38 bajtów

lambda s:sum(map(ord,s))*3%61%37%9%7%2

Wypróbuj online!

Dobry stary łańcuch modulo zastosowany do sumy wartości ASCII ciągu wejściowego, dzięki czemu rozwiązanie jest po prostu zbyt dobre. Całkowita wartość ASCII jest odrębna dla każdego możliwego wejścia, z wyjątkiem tych, które dają 0 1i 1 0dają ten sam wynik, co działa, ponieważ wszystkie użyte bramki logiczne są symetryczne.

*3Oddziela się inaczej sąsiadujące wartości wejściowych, które różnią się tylko w bitach, ponieważ te sprawiają, że trudno modyfikacji łańcucha się rozdzielić. Długość i rozmiar liczb w łańcuchu modów tworzy w przybliżeniu odpowiednią ilość entropii, aby zmieścić 18 wyjść binarnych.

Krótsze rozwiązanie jest z pewnością możliwe przy użyciu hash(s)lub id(s), ale unikałem ich, ponieważ są zależne od systemu.


Python 2 , 50 bajtów

lambda s:'_AX0NRD'.find((s*9)[35])>>s.count('0')&1

Wypróbuj online!

Nieco bardziej zasadnicze rozwiązanie. Każda bramka logiczna daje inny wynik dla każdej liczby zer na wejściu, kodowana jako liczba 3-bitowa od 1 do 6. Każda możliwa bramka logiczna jest odwzorowywana na odpowiednią liczbę przez wzięcie (s*9)[35], które wszystkie są odrębne. Ponieważ kończy się to ORczytaniem jednego z bitów, aby postać mogła być 0lub 1, ale okazuje się, że działa, aby sprawdzić, czy tak 0, a a i 1tak poprawnie da 1wynik.


Cholera, szukałem własnych wartości modów, ale pobiłaś mnie. Czy gdzieś zapisałeś swoje strategie, bo moje metody brutalnej siły zajmują bardzo dużo czasu
— Jo King,

2
@JoKing Zrobiłem w zasadzie brutalną siłę *a%b%c%d%e%2, nic naprawdę sprytnego. Jedyną interesującą rzeczą było postawienie *przed modami; Nie próbowałem innych formatów.
— xnor

Wow, to po prostu zadziwiające! Nie spodziewam się nawet, żeby to zrobić. Czy mogę zrobić 45-bajtowy port JS twojej odpowiedzi ?
— Shieru Asakoto,

@ShieruAsakoto Zdecydowanie idź.
— xnor

1
@ xnor Użyłem dokładnie tej samej metody, co ty, więc nie czułbym się dobrze, publikując ją samodzielnie, ale może to być 36 bajtów .
— nedla2004,

10

JavaScript (ES6), 39 bajtów

s=>341139>>parseInt(btoa(s),34)%86%23&1

Wypróbuj online!

W jaki sposób?

Nie możemy analizować spacji parseInt()niezależnie od tego, z jaką bazą pracujemy. Zamiast tego wstrzykuje się reprezentację ciągu wejściowego w formacie 64. Może to generować =znaki wypełniające (których nie można przeanalizować za pomocą parseInt()żadnego z nich), ale z pewnością są one umieszczone na końcu łańcucha i można je bezpiecznie zignorować.

348623[0..19]18

 input      | to base-64     | parsed as base-34 | mod 86 | mod 23 | output
------------+----------------+-------------------+--------+--------+--------
 "AND 0 0"  | "QU5EIDAgMA==" |  1632500708709782 |   26   |    3   |    0
 "AND 0 1"  | "QU5EIDAgMQ==" |  1632500708709798 |   42   |   19   |    0
 "AND 1 0"  | "QU5EIDEgMA==" |  1632500708866998 |   34   |   11   |    0
 "AND 1 1"  | "QU5EIDEgMQ==" |  1632500708867014 |   50   |    4   |    1
 "OR 0 0"   | "T1IgMCAw"     |     1525562056532 |   52   |    6   |    0
 "OR 0 1"   | "T1IgMCAx"     |     1525562056533 |   53   |    7   |    1
 "OR 1 0"   | "T1IgMSAw"     |     1525562075028 |   58   |   12   |    1
 "OR 1 1"   | "T1IgMSAx"     |     1525562075029 |   59   |   13   |    1
 "XOR 0 0"  | "WE9SIDAgMA==" |  1968461683492630 |   48   |    2   |    0
 "XOR 0 1"  | "WE9SIDAgMQ==" |  1968461683492646 |   64   |   18   |    1
 "XOR 1 0"  | "WE9SIDEgMA==" |  1968461683649846 |   56   |   10   |    1
 "XOR 1 1"  | "WE9SIDEgMQ==" |  1968461683649862 |   72   |    3   |    0
 "NAND 0 0" | "TkFORCAwIDA=" | 61109384461626344 |   62   |   16   |    1
 "NAND 0 1" | "TkFORCAwIDE=" | 61109384461626350 |   70   |    1   |    1
 "NAND 1 0" | "TkFORCAxIDA=" | 61109384461665650 |   64   |   18   |    1
 "NAND 1 1" | "TkFORCAxIDE=" | 61109384461665656 |   72   |    3   |    0
 "NOR 0 0"  | "Tk9SIDAgMA==" |  1797025468622614 |   76   |    7   |    1
 "NOR 0 1"  | "Tk9SIDAgMQ==" |  1797025468622630 |    6   |    6   |    0
 "NOR 1 0"  | "Tk9SIDEgMA==" |  1797025468779830 |   84   |   15   |    0
 "NOR 1 1"  | "Tk9SIDEgMQ==" |  1797025468779846 |   14   |   14   |    0
 "XNOR 0 0" | "WE5PUiAwIDA=" | 66920415258533864 |    0   |    0   |    1
 "XNOR 0 1" | "WE5PUiAwIDE=" | 66920415258533870 |    8   |    8   |    0
 "XNOR 1 0" | "WE5PUiAxIDA=" | 66920415258573170 |    2   |    2   |    0
 "XNOR 1 1" | "WE5PUiAxIDE=" | 66920415258573176 |   10   |   10   |    1

: o krótszy niż przeniesiona odpowiedź
— Shieru Asakoto

Ale ... wydaje się, że nie działa NOR?
— Shieru Asakoto,

@ShieruAsakoto Dzięki za zauważenie. Właśnie zapomniałem NOR. Teraz naprawione.
— Arnauld,

6

CJam (13 bajtów)

q1bH%86825Yb=

Zakłada, że ​​dane wejściowe nie zawierają końcowego nowego wiersza.

Zestaw testów online

To tylko prosty skrót, który mapuje 24 możliwe dane wejściowe na 17 różnych, ale spójnych wartości, a następnie wyszukuje je w skompresowanej tabeli.

Python 2 (36 bajtów)

lambda s:76165>>sum(map(ord,s))%17&1

To tylko część powyższej odpowiedzi CJam. Zestaw testowy przy użyciu frameworka testowego xnor.


4

05AB1E , 13 12 10 8 bajtów

ÇO₁*Ƶï%É

Alternatywne obliczenia Port @mazzy wymienione w komentarzu do jego odpowiedzi Powershell ( *256%339%2zamiast *108%143%2).

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

Ç            # Convert each character in the (implicit) input to a unicode value
 O           # Sum them together
  ₁*         # Multiply it by 256
    Ƶï%      # Then take modulo-339
        É    # And finally check if it's odd (short for %2), and output implicitly

Zobacz moją wskazówkę 05AB1E (rozdział Jak kompresować duże liczby całkowite? ), Aby zrozumieć, dlaczego tak Ƶïjest 339.


3

Węgiel drzewny , 32 bajty

§01÷⌕⪪”&⌈4Y⍘LH⦄vü|⦃³U}×▷” S∨⁺NN⁴

Wypróbuj online! Link jest do pełnej wersji kodu. Objaśnienie: Skompresowany ciąg rozwija się do listy obsługiwanych operacji, tak że indeks danej operacji jest następnie przesuwany w prawo zgodnie z danymi wejściowymi, a wyodrębniony bit staje się wynikiem.

XOR     001
AND     010
OR      011
NOR     100
NAND    101
XNOR    110
inputs  011
        010

Wersja 74-bajtowa działa dla wszystkich 16 operacji binarnych, które arbitralnie nazwałem następująco: ZERO I MNIEJ DRUGIEJ WIELKIEJ PIERWSZEJ XOR LUB NOR XNOR NFIRST NGREATER NSECOND NLESS NAND NZERO.

§10÷÷⌕⪪”&↖VρS´↥cj/v⊗J[Rf↓⪫?9KO↘Y⦄;↙W´C>η=⁴⌕✳AKXIB|⊖\`⊖:B�J/≧vF@$h⧴” S∨N²∨N⁴

Wypróbuj online! Link jest do pełnej wersji kodu.


+1 Raczej pod wrażeniem pełnego 16 programów operacyjnych!
— theREALyumdub

3

Mathematica, 55 bajtów

Symbol[ToCamelCase@#][#2=="1",#3=="1"]&@@StringSplit@#&

Czysta funkcja. Bierze ciąg jako dane wejściowe i zwraca Truelub Falsedane wyjściowe. Ponieważ Or, And, Nor, Nand, Xor, i Xnorsą Zabudowy, używamy ToCamelCasedo zmiany operatora Pascal przypadku, konwertować je do równoważnej symbolu, i zastosować go do dwóch argumentów.


3

J , 21 bajtów

2|7|9|37|61|3*1#.3&u:

Wypróbuj online!

Port Python 2 w roztworze XNOR .


J , 30 bajtów

XNOR=:=/
NAND=:*:/
NOR=:+:/
".

Wypróbuj online!

Niektórzy trochę zabawy z eval ".i biblioteki standardowej (który już zawiera poprawne AND, OR, XOR).


J , 41 bajtów

({7 6 9 8 14 1 b./)~1 i.~' XXNNA'E.~_2&}.

Wypróbuj online!

Więcej podejścia w stylu J.

Jak to działa

Ukryta jest tutaj bardzo ogólna sztuczka J. Często pożądana funkcja ma strukturę „Wykonaj F na jednym wejściu, wykonaj H na drugim, a następnie wykonaj G na obu wynikach”. To powinno działać jak (F x) G H y. W milczącej formie jest to równoważne z (G~F)~H:

x ((G~F)~H) y
x (G~F)~ H y
(H y) (G~F) x
(H y) G~ F x
(F x) G H y

Jeśli Gjest to asymetryczny prymityw, po prostu zamień lewy i prawy argument funkcji docelowej, a my możemy zapisać bajt.

Przejdźmy do powyższej odpowiedzi:

({7 6 9 8 14 1 b./)~1 i.~' XXNNA'E.~_2&}.

1 i.~' XXNNA'E.~_2&}.  Processing right argument (X): the operation's name
                _2&}.  Drop two chars from the end
1 i.~' XXNNA'E.~       Find the first match's index as substring
                       Resulting mapping is [OR, XOR, XNOR, NOR, NAND, AND]

7 6 9 8 14 1 b./  Processing left argument (Y): all logic operations on the bits
7 6 9 8 14 1 b.   Given two bits as left and right args, compute the six logic functions
               /  Reduce by above

X{Y  Operation on both: Take the value at the index

Zastanów się nad opublikowaniem sztuczki w poradach J dotyczących gry w golfa, jeśli jeszcze tego nie zrobiłeś. Schludne rzeczy. Jestem także wielkim fanem ewaluacyjnego rozwiązania.
— cole

3

PowerShell, 36 34 bajtów

Zainspirowany przez xnor , ale sekwencja *108%143%2jest krótsza niż oryginalna*3%61%37%9%7%2

$args|% t*y|%{$n+=108*$_};$n%143%2

Skrypt testowy:

$f = {

 $args|% t*y|%{$n+=108*$_};$n%143%2
#$args|% t*y|%{$n+=3*$_};$n%61%37%9%7%2   # sequence by xnor

}

@(
    ,("AND 0 0", 0)
    ,("AND 0 1", 0)
    ,("AND 1 0", 0)
    ,("AND 1 1", 1)
    ,("XOR 0 0", 0)
    ,("XOR 0 1", 1)
    ,("XOR 1 0", 1)
    ,("XOR 1 1", 0)
    ,("OR 0 0", 0)
    ,("OR 0 1", 1)
    ,("OR 1 0", 1)
    ,("OR 1 1", 1)
    ,("NAND 0 0", 1)
    ,("NAND 0 1", 1)
    ,("NAND 1 0", 1)
    ,("NAND 1 1", 0)
    ,("NOR 0 0", 1)
    ,("NOR 0 1", 0)
    ,("NOR 1 0", 0)
    ,("NOR 1 1", 0)
    ,("XNOR 0 0", 1)
    ,("XNOR 0 1", 0)
    ,("XNOR 1 0", 0)
    ,("XNOR 1 1", 1)

) | % {
    $s,$e = $_
    $r = &$f $s
    "$($r-eq$e): $s=$r"
}

Wynik:

True: AND 0 0=0
True: AND 0 1=0
True: AND 1 0=0
True: AND 1 1=1
True: XOR 0 0=0
True: XOR 0 1=1
True: XOR 1 0=1
True: XOR 1 1=0
True: OR 0 0=0
True: OR 0 1=1
True: OR 1 0=1
True: OR 1 1=1
True: NAND 0 0=1
True: NAND 0 1=1
True: NAND 1 0=1
True: NAND 1 1=0
True: NOR 0 0=1
True: NOR 0 1=0
True: NOR 1 0=0
True: NOR 1 1=0
True: XNOR 0 0=1
True: XNOR 0 1=0
True: XNOR 1 0=0
True: XNOR 1 1=1

1
Twój *16%95%7%2nie dla XNORprzypadków, choć. Można użyć @ nedla2004 's*6%68%41%9%2 , która jest krótsza niż 2 bajty @xnor jest jedna, choć.
— Kevin Cruijssen

1
Dzięki!!!! Dodałem xnor. Myślę, że *108%143to jest bardziej atrakcyjne :) Poza tym jest fajna para *256%339. Ta para jest jeszcze lepsza dla języków, które potrafią pracować z bitami i bajtami.
— mazzy

1
Ach miło! Port z twojej odpowiedzi zapisuje również 2 bajty w mojej odpowiedzi Java . :) I jest to 10- bajtowa alternatywa dla mojej odpowiedzi 05AB1E przy użyciu *256%339.
— Kevin Cruijssen


2

JavaScript (Node.js) , 106 94 bajtów

x=>([a,c,d]=x.split` `,g=[c&d,c^d,c|d]["OR".search(a.slice(1+(b=/N[^D]/.test(a))))+1],b?1-g:g)

Wypróbuj online!

Link do kodu i wszystkich 24 przypadków.

+9 za zapomnienie do zmapowania skrzynki XNOR.


może czegoś nie widzę, ale gdzie mam wpisać dane wejściowe? Karta wprowadzania nic nie robi.
— qazwsx,

@qazwsx To jest funkcja lambda, która domyślnie jest dozwolona.
— Shieru Asakoto

1
@qazwsx Link pokazuje wyniki dla każdego możliwego wejścia. Ta odpowiedź jest funkcją, więc jeśli chcesz ją ręcznie przetestować, możesz zastąpić stopkę np.console.log(f("AND", 1, 1));
— Mego

@qazwsx I proszę cofnąć głosowanie. W końcu nie jest to nieważne.
— Shieru Asakoto,

rozumiem. cofnąłem
— głosowanie


1

JavaScript (Node.js) , 45 bajtów

Tylko część doskonałej odpowiedzi xnor na Python 2 opublikowanej za zgodą, proszę podać tę odpowiedź zamiast tego.

x=>Buffer(x).reduce((a,b)=>a+b)*3%61%37%9%7%2

Wypróbuj online!




Może dobrym pomysłem jest najpierw przekonwertować to na odpowiedź społeczności? Następnie dodaj te porty JS jako kolekcję tutaj.
— Shieru Asakoto,

Być może. Niepewny. Zazwyczaj po prostu dodaję wiele odpowiedzi, jeśli istnieje wiele alternatyw o tej samej liczbie bajtów. Odpowiedź Mazzy Powershell znalazła jednak nawet krótszą: 41 bajtów .
— Kevin Cruijssen,

1

Attache , 55 bajtów

{Eval!$"${Sum!Id''Downcase!SplitAt!_}${N=>__2}"}@@Split

Wypróbuj online!

Raczej brutalne rozwiązanie. Konwertuje dane wejściowe na odpowiednie polecenie Attache i ocenia je. (Attache ma wbudowane funkcje dla każdej z 6 bramek logicznych).


1

Ruby , 20 bajtów

->s{76277[s.sum%17]}

Wypróbuj online!

Jak to działa:

Zasadniczo to samo co odpowiedź Petera Taylora, ale Ruby to ułatwia. Magiczna liczba jest inna, ale pomysł był taki sam.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.