논리 게이트 수동


13

기본 논리 게이트를 시뮬레이트하는 프로그램을 작성하십시오.

입력 : 모두 대문자로 된 단어 다음에 공백으로 구분 된 2 자리 숫자 2 진수 (예 :) OR 1 0. 게이트는 OR, AND, NOR, NAND, XOR, 및이 XNOR요구된다.

출력 : 입력 된 논리 게이트의 출력에 1 또는 0의 두 숫자가 제공됩니다.

예 :이
AND 1 0 되고이 0
XOR 0 1된다 1
OR 1 1된다 1
NAND 1 1된다0

이것은 codegolf이므로 가장 짧은 코드가 승리합니다.


입력으로 배열을 가져올 수 있습니까?
— Quintec

아무 당신은 캔트 @Quintec
— qazwsx '와

3
True / False로 출력 할 수 있습니까?
— xnor

5
확실히 @ xnor (또한 관련 사용자 이름)
— qazwsx

답변:



29

파이썬 2 , 38 바이트

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

온라인으로 사용해보십시오!

입력 문자열의 ASCII 값의 합에 적용되는 우수한 ol '모듈러스 체인이 너무 적합합니다. 총 ASCII 값과 해당하는 것을 제외하고, 각각의 가능한 입력 구별되는 0 1그리고 1 0사용 된 모든 논리 회로가 대칭이기 때문에 아웃 동작 인 동일한 결과를 제공한다.

은 *3그것이 하드 개조 쇄 분열하는 화장이 때문에, 비트 만의 서로 다른 입력에 달리 인접 값을 분리한다. 모드 체인의 숫자 길이와 크기는 18 개의 이진 출력에 맞도록 대략적인 양의 엔트로피를 만듭니다.

더 짧은 솔루션을 사용하여 확실히 가능하다 hash(s)거나 id(s), 그러나 시스템에 의존하기 때문에 나는이를 피했다.


파이썬 2 , 50 바이트

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

온라인으로 사용해보십시오!

약간 더 원칙적인 솔루션. 각 논리 게이트는 1에서 6까지의 3 비트 숫자로 인코딩 할 수있는 입력의 각 0 카운트에 대해 다른 결과를 제공합니다. 가능한 모든 논리 게이트는 (s*9)[35]모두 고유 한을 사용하여 해당 숫자에 매핑됩니다 . 를 들어 OR,이 비트 중 하나를 읽는 바람이 캐릭터가 될 수 있도록 0하거나 1,하지만이 있는지 확인하는 작업에 밝혀 0, 그리고이 1정확하게 줄 것이다 1어쨌든 결과입니다.


젠장, 나는 내 자신의 모드 값을 찾고 있었지만 당신은 나를 이겼다. 내 무차별 대입 방법은 시간이 너무 오래 걸리는 경향이 있습니다.
— Jo King

2
@ JoKing 나는 기본적으로 잔인한 힘을 발휘했지만 *a%b%c%d%e%2실제로 영리한 것은 없습니다. 유일한 흥미로운 점은 *개조하기 전에 넣는 것입니다 . 다른 형식은 시도하지 않았습니다.
— xnor

와우, 그것은 단지 마음을 흔들리는 것입니다! 나는 해시와 같은 방법으로 그렇게 할 것으로 기대하지 않습니다. 대답 의 45 바이트 JS 포트를 만들 수 있습니까?
— Shieru Asakoto

@ShieruAsakoto 확실히, 가십시오.
— xnor

1
@ xnor 나는 당신이했던 것과 똑같은 방법을 사용했기 때문에 내 자신에 게시하는 것은 좋지 않지만 36 바이트 일 수 있습니다 .
— nedla2004

10

자바 스크립트 (ES6), 39 바이트

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

온라인으로 사용해보십시오!

어떻게?

우리는 parseInt()어떤 기반을 사용하든 공간을 파싱 할 수 없습니다 . 대신 입력 문자열의 base-64 표현을 삽입합니다. =패딩 문자를 생성 할 수 있지만 (파싱 할 수 없음 parseInt()),이 문자 는 문자열 끝에 위치하며 무시해도됩니다.

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 포팅 된 답변보다 짧음
— Shieru Asakoto

하지만 ... 효과가없는 것 같습니다 NOR.
— Shieru Asakoto

@ShieruAsakoto 감사합니다. 방금 잊어 버렸습니다 NOR. 이제 수정되었습니다.
— Arnauld

6

CJam (13 바이트)

q1bH%86825Yb=

입력에 후행 줄 바꿈이 없다고 가정합니다.

온라인 테스트 스위트

24 개의 가능한 입력을 17 개의 고유하지만 일관된 값으로 매핑 한 다음 압축 된 테이블에서 조회하는 간단한 해시입니다.

파이썬 2 (36 바이트)

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

이것은 위의 CJam 답변의 포트 일뿐입니다. xnor의 테스트 프레임 워크를 사용하는 테스트 스위트 .


4

05AB1E , 13 12 10 8 바이트

ÇO₁*Ƶï%É

Powershell 답변에 대한 의견에서 언급 된 @mazzy 포트 의 대체 계산 ( *256%339%2대신 *108%143%2).

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

Ç            # 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

내이 05AB1E 팁을 참조하십시오 (섹션 얼마나 큰 정수를 압축하는 방법을? ) 이유를 이해하는 Ƶï것입니다 339.


3

숯 , 32 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명 : 압축 된 문자열이 지원되는 조작 목록으로 확장되어 주어진 조작의 색인이 입력에 따라 오른쪽으로 이동하여 추출 된 비트가 결과가됩니다.

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

74 바이트 버전은 16 개의 바이너리 작업 모두에서 작동하며 임의로 제로 및 적은 두 번째 더 큰 첫 번째 XOR 또는 NOR XNOR NFIRST NGREATER NSECOND NLESS NANDS NZERO로 이름을 지정했습니다.

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다.


+1 16 개의 전체 운영 프로그램에 깊은 인상을 받았습니다!
— theREALyumdub

3

수학, 55 바이트

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

순수한 기능. 문자열을 입력 및 리턴 True또는 False출력 으로 취합니다 . 이후 Or, And, Nor, Nand, Xor, 그리고 Xnor모든 내장 기능은, 우리가 사용하는 ToCamelCase파스칼 경우에 연산자를 변경하려면 해당하는 심볼로 변환하고, 두 개의 인수에 적용합니다.


3

J , 21 바이트

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

온라인으로 사용해보십시오!

xnor의 Python 2 솔루션 포트 .


J , 30 바이트

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

온라인으로 사용해보십시오!

평가와 재미의 일부 비트 ".와 표준 라이브러리 (이미 올바른 포함 AND, OR, XOR).


J , 41 바이트

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

온라인으로 사용해보십시오!

더 많은 J 스타일 접근법.

작동 원리

매우 일반적인 J 트릭이 여기에 숨겨져 있습니다. 종종 원하는 함수는 "한 입력에는 F를하고 다른 입력에는 H를하고 두 결과에 대해 G를한다"라는 구조를 가지고 있습니다. 그런 다음처럼 작동해야합니다 (F x) G H y. 암묵적인 형태로 (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

G비대칭 프리미티브 인 경우 대상 함수의 왼쪽 및 오른쪽 인수를 바꾸면 바이트를 저장할 수 있습니다.

위의 답변으로 넘어갑니다.

({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

아직 골프에 대한 J 팁에 트릭을 게시하는 것이 좋습니다. 깔끔한 물건. 또한 나는 평가 솔루션의 큰 팬입니다.
— cole

3

파워 쉘, 36 34 바이트

xnor 에서 영감을 얻었 지만 시퀀스 *108%143%2는 원본보다 짧습니다.*3%61%37%9%7%2

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

테스트 스크립트 :

$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"
}

산출:

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
그러나 귀하 *16%95%7%2의 XNOR경우에는 실패합니다 . 당신은 사용할 수 @ nedla2004 의*6%68%41%9%2 보다 2 바이트 짧은있는 @xnor '불구의 하나.
— Kevin Cruijssen

1
감사!!!! 추가했습니다 xnor. 나는 그것이 *108%143더 매력적 이라고 생각합니다 :) 또한, 멋진 쌍이 *256%339있습니다. 이 쌍은 비트 및 바이트 작업 방법을 알고있는 언어에 더 좋습니다.
— mazzy

1
아 좋아! 답변의 포트는 Java 답변 에 2 바이트를 저장 합니다. :) 그리고 그것은 을 사용하여 05AB1E 답변 에 대한 10 바이트 대안 입니다 . *256%339
— Kevin Cruijssen


2

자바 스크립트 (Node.js) , 106 94 바이트

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)

온라인으로 사용해보십시오!

코드와 24 가지 사례 모두에 연결하십시오.

XNOR 사례를 매핑하지 못한 경우 +9


어쩌면 나는 뭔가를 보지 못했지만 입력을 어디에서 입력해야합니까? 입력 탭은 아무 것도 수행하지 않습니다.
— qazwsx

@qazwsx 이것은 람다 함수이며 기본적으로 허용됩니다.
— Shieru Asakoto

1
@qazwsx 링크는 가능한 모든 입력에 대한 출력을 보여줍니다. 이 답변은 함수이므로 수동으로 테스트하려는 경우 바닥 글을 다음과 같이 바꿀 수 있습니다.console.log(f("AND", 1, 1));
— Mego

@qazwsx 그리고 downvote를 되돌려주십시오. 이것은 결국 유효하지 않습니다.
— Shieru Asakoto

오 알 겠어요 나는 downvote를 되 돌렸다
— qazwsx


1

자바 스크립트 (Node.js) , 45 바이트

동의에 따라 게시 된 xnor의 뛰어난 Python 2 답변 포트만 해당 답변 대신 의견을 제시하십시오.

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

온라인으로 사용해보십시오!




이것을 커뮤니티 답변으로 변환하는 것이 좋습니다. 그런 다음 해당 JS 포트를 컬렉션으로 추가하십시오.
— Shieru Asakoto

혹시. 확실하지 않다. 동일한 바이트 수를 가진 여러 대안이있는 경우 일반적으로 여러 답변을 추가합니다. mazzy 의 Powershell 답변은 41 바이트 보다 짧은 것을 발견했습니다 .
— Kevin Cruijssen


1

루비 , 20 바이트

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

온라인으로 사용해보십시오!

작동 방식 :

기본적으로 Peter Taylor의 답변과 동일하지만 Ruby가 더 쉬워졌습니다. 마법의 숫자는 다르지만 아이디어는 동일합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.