기본 논리 게이트를 시뮬레이트하는 프로그램을 작성하십시오.
입력 : 모두 대문자로 된 단어 다음에 공백으로 구분 된 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이므로 가장 짧은 코드가 승리합니다.
답변
답변
파이썬 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
어쨌든 결과입니다.
답변
자바 스크립트 (ES6), 39 바이트
s=>341139>>parseInt(btoa(s),34)%86%23&1
어떻게?
우리는 parseInt()
어떤 기반을 사용하든 공간을 파싱 할 수 없습니다 . 대신 입력 문자열의 base-64 표현을 삽입합니다. =
패딩 문자를 생성 할 수 있지만 (파싱 할 수 없음 parseInt()
),이 문자 는 문자열 끝에 위치하며 무시해도됩니다.
34
86
23
[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
답변
CJam (13 바이트)
q1bH%86825Yb=
입력에 후행 줄 바꿈이 없다고 가정합니다.
24 개의 가능한 입력을 17 개의 고유하지만 일관된 값으로 매핑 한 다음 압축 된 테이블에서 조회하는 간단한 해시입니다.
파이썬 2 (36 바이트)
lambda s:76165>>sum(map(ord,s))%17&1
이것은 위의 CJam 답변의 포트 일뿐입니다. xnor의 테스트 프레임 워크를 사용하는 테스트 스위트 .
답변
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
.
답변
숯 , 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⁴
온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다.