논리 게이트를 사용한 Gerrymandering


16

대다수 함수는 3 개의 부울 입력을 가져 와서 가장 일반적인 부울 함수입니다. 예를 들어 maj(x,y,z)대다수 함수가 Ttrue이고 true를 F나타내는 경우 :

maj(T,T,T) = T
maj(T,T,F) = T
maj(T,F,F) = F
maj(F,F,F) = F

이 질문은 부울 함수를 대다수 함수의 구성으로 작성하는 것과 관련이 있습니다. 대다수 함수의 5 진 구성 예는 (x1,x2,x3,x4,x5) => maj(x1,x2,maj(x3,x4,x5))입니다. 이 함수는 이러한 샘플 입력 벡터에서 다음 출력을 반환합니다.

(T,T,F,F,F) => maj(T,T,maj(F,F,F)) = maj(T,T,F) = T
(T,F,T,T,F) => maj(T,F,maj(T,T,F)) = maj(T,F,T) = T
(T,F,T,F,F) => maj(T,F,maj(T,F,F)) = maj(T,F,F) = F
(F,F,F,T,T) => maj(F,F,maj(F,T,T)) = maj(F,F,T) = F

직무

부울의 양의 정수 n과 길이 n 벡터의 목록을 입력하고 가능한 경우 주어진 모든 벡터에서 true를 반환하는 다수 게이트의 트리를 출력하는 프로그램을 작성하십시오. 이 함수는 구속 조건 목록에없는 벡터에서 true 또는 false를 반환 할 수 있습니다.

  • 벡터 목록은 원하는 형식으로 입력 할 수 있습니다. 원하는 경우 벡터를 입력하는 대신 벡터에서 실제 위치 목록을 입력 할 수 있습니다. 그래서 예를 들어, [TTF,TFT,FTT]또는 [[T,T,F],[T,F,T],[F,T,T]]또는 [[1,2],[1,3],[2,3]](실제 위치의 목록은) 모두 정상입니다.

  • 출력은 유효한 트리 형식 일 수 있습니다. 예를 들어 maj(maj(x1,x2,x3),x4,x5)작동합니다. 에서와 같이 단일 숫자를 변수의 독립형으로 사용하려고 할 것입니다 [[1,2,3],4,5]. 123m45m예를 들어 리버스 폴리싱 도 가능합니다.

  • 작동하는 기능이 없으면 프로그램이 오류를 생성하거나 잘못된 값을 출력해야합니다.

  • 작동하는 여러 기능이있는 경우 프로그램에서 해당 기능을 반환 할 수 있습니다. 기능을 단순화 할 필요는 없습니다. 예를 들어 maj(x1,x1,x2)또는 x1동등합니다.

채점

이것은 코드 골프입니다 : 바이트 단위의 최단 솔루션이 승리합니다.

테스트 사례 :

이러한 경우마다 가능한 많은 출력이 있으므로 출력을 함수로 변환하고 지정된 각 입력 벡터에서 함수가 true를 반환하는지 확인하는 검사기 스크립트를 작성해야합니다.

Input: 3, [TFF]
Output: 1 or [1,1,2] or [1,[1,2,2],[1,1,3]] or other equivalent

Input: 3, [TFF,FTF]
Output: Falsey or error (it's not possible)

Input: 3, [TTF,TFT]
Output: [1,2,3] or 1 or other equivalent

Input: 3, [TTF,TFT,FTT]
Output: [1,2,3] or [1,3,2] or other equivalent

Input: 4, [TTFF,TFTF,FFTT]
Output: Falsey or error

Input: 4, [TTTF,TTFT,TFTT,FTTT]
Output: [1, 2, 3] or [2,3,4], or many other options

Input: 5, [TTTFF,FTTFT,TFFFT]
Output: [1,[1,[1,2,5],[2,4,5]],3] or many other options 

Input: 6, [TTTFFF,FTFTTF,TFFTFT]
Output: [1, 2, 4] or [1, [1, 2, 4], [2, 3, 4]] or others

Input: 5, [TTTFF,TTFTF,TTFFT,TFTTF,TFTFT,TFFTT,FTTTF,FTTFT,FTFTT,FFTTT]
Output: [[1, [1, 3, 5], 4], [1, 2, [2, 4, 5]], [2, 3, [3, 4, 5]]] or others

Input: 7, [TTTTFFF,TTTFTFF,TTTFFTF,TTTFFFT,TTFTTFF,TTFTFTF,TTFTFFT,TTFFTTF,TTFFTFT,TTFFFTT,TFTTTFF,TFTTFTF,TFTTFFT,TFTFTTF,TFTFTFT,TFTFFTT,TFFTTTF,TFFTTFT,TFFTFTT,TFFFTTT,FTTTTFF,FTTTFTF,FTTTFFT,FTTFTTF,FTTFTFT,FTTFFTT,FTFTTTF,FTFTTFT,FTFTFTT,FTFFTTT,FFTTTTF,FFTTTFT,FFTTFTT,FFTFTTT,FFFTTTT]
Output: [[[1, [1, [1, 4, 7], 6], 5], [1, [1, 3, [3, 6, 7]], [3, 5, [5, 6, 7]]], [3, 4, [4, [4, 5, 7], 6]]], [[1, [1, [1, 4, 7], 6], 5], [1, 2, [2, [2, 5, 7], 6]], [2, [2, 4, [4, 6, 7]], [4, 5, [5, 6, 7]]]], [[2, [2, [2, 4, 7], 6], 5], [2, 3, [3, [3, 5, 7], 6]], [3, [3, 4, [4, 6, 7]], [4, 5, [5, 6, 7]]]]]

"대다수 함수의 5 차 구성은 (x1, x2, x3, x4, x5) => maj (x1, x2, maj (x3, x4, x5))"입니다. x1 = x2 = F 인 경우 대답은 무엇입니까? x3 = x4 = x5 = T; ?
tsh

진리표를 추가하겠습니다.
후드

1
1의 출력은 무엇을 의미합니까?
Mhmd

2
추천 제목 : 논리 게이트가있는 Gerrymandering
Robert Fraser

1
@trichoplax 아니요, 나머지 모든 벡터의 출력은 무엇이든 가능합니다. 나는 그것을 명시 적으로 업데이트 할 것입니다.
후드

답변:


2

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

부울 배열의 배열로 입력을받습니다. 1- 인덱스 다수 게이트의 트리를 반환하거나 솔루션이없는 경우 재귀 오류 (1)를 발생시킵니다.

주 함수 f () 는 솔버 F () 를 호출하고 각 반복에서 최대 중첩 레벨 m 을 증가시켜 솔루션을 재귀 적으로 찾습니다 .

(1) 오랜 시간이 지나고 무한한 기억을 가정

f=(a,m)=>(F=(a,d,I=a[i=0].map(_=>++i),g=(a,b)=>b[1]?b.reduce((s,i)=>s+g(a,i),0)>1:a[b-1])=>I.find(i=>a.every(a=>g(a,i)))||d&&(I.reduce((a,x)=>[...a,...a.map(y=>[...y,x])],[[]]).some(b=>r=b.length==3&&F(a.map(a=>[...a,g(a,b)]),d-1,[...I,b]))&&r))(a,m)||f(a,-~m)

데모

아래는 데모의 마지막 테스트 사례에서 찾은 솔루션의 유효성 검사 표입니다.

12345 | [5,[1,2,4],[3,4,[1,2,3]]]
------+-------------------------------------------------------------
TTTFF | [F,[T,T,F],[T,F,[T,T,T]]] --> [F,T,[T,F,T]] -> [F,T,T] --> T
TTFTF | [F,[T,T,T],[F,T,[T,T,F]]] --> [F,T,[F,T,T]] -> [F,T,T] --> T
TTFFT | [T,[T,T,F],[F,F,[T,T,F]]] --> [T,T,[F,F,T]] -> [T,T,F] --> T
TFTTF | [F,[T,F,T],[T,T,[T,F,T]]] --> [F,T,[T,T,T]] -> [F,T,T] --> T
TFTFT | [T,[T,F,F],[T,F,[T,F,T]]] --> [T,F,[T,F,T]] -> [T,F,T] --> T
TFFTT | [T,[T,F,T],[F,T,[T,F,F]]] --> [T,T,[F,T,F]] -> [T,T,F] --> T
FTTTF | [F,[F,T,T],[T,T,[F,T,T]]] --> [F,T,[T,T,T]] -> [F,T,T] --> T
FTTFT | [T,[F,T,F],[T,F,[F,T,T]]] --> [T,F,[T,F,T]] -> [T,F,T] --> T
FTFTT | [T,[F,T,T],[F,T,[F,T,F]]] --> [T,T,[F,T,F]] -> [T,T,F] --> T
FFTTT | [T,[F,F,T],[T,T,[F,F,T]]] --> [T,F,[T,T,F]] -> [T,F,T] --> T

누군가가 찾을 수있는 효율적인 솔루션이 있습니다. 그 사이에, 나는 일종의 작품을 짐작할 것 같다 ...
Hood

2

Mathematica, 121 바이트

부울 벡터에서 실제 위치 목록으로 두 번째 인수를 취하는 익명 함수입니다.

f[n_][s_]:=If[n<3,(Intersection@@s)[[1]],{#/. 2->1,#2/.{2->1,3->2},#3}&@@(1+f[n-1]/@(s-1/.{{0->1},{1->2,0->1},{0->2}}))]

약간 더 좋은 형식 :

f[n_][s_] := If[n < 3, (Intersection @@s)[[1]],
   {# /. 2 -> 1, #2 /. {2 -> 1, 3 -> 2}, #3} & @@ 
    (1 + f[n - 1] /@ (s - 1 /. {{0 -> 1}, {1 -> 2, 0 -> 1}, {0 -> 2}}))]

세 개 미만의 변수가있는 경우 모든 구속 조건에 공통 "참"이 있는지 확인하기 위해 구속 조건 벡터를 교차시킵니다. 하나가 있으면 상수 함수 (x_1, x_2)-> x_i가 작동하고 그렇지 않으면 불가능합니다 (빈 목록의 첫 번째 요소를 가져 오면 오류가 발생합니다).

f1=f(x1,x1,x2,x3,,xn1)f2=f(x1,x2,x2,x3,,xn1)f3=f(x1,x2,x1,x3,,xn1)) x n , 이들 각각을 재귀 적으로 해결 한 다음f=maj(f1(x1,x3,x4,,xn),f2(x1,x2,x4,,xn),f2(x2,x3,x4,,xn)) .

설명:

이것은 n - 1 변수 문제에 대한 세 가지 솔루션을 찾는 것까지 n 변수 문제 의 해결책을 찾는 문제를 줄이는 재귀 알고리즘입니다 . 이 작업을 수행하는 주요 관찰은 f 에 대해 우리가 찾고있는 기능 중 하나 인 f ( x 1 , , x n ) = m a j ( f ( x 1 , x 1 , x 3 , x 4)입니다. , , xn1ff(x1,,xn)=maj(f(x1,x1,x3,x4,,xn),f(x1,x2,x2,),f(x3,x2,x3,))

첫 번째 위치에서 x2x1 , 두 번째 위치 x3x2 로, 세 번째 위치 x1x3 대치했습니다 .

f(x1,x1,x3,x4,,xn)f(x1,x2,x2,x4,,xn)f(x3,x2,x3,x4,,xn))

왜 이것이 사실입니까? 대부분의 함수는 다음 두 가지 속성을 만족시킵니다.

  1. !xxmaj(!x,!y,!z)=!maj(x,y,z)

  2. maj(x,y,False)maj(x,y,True)FalseTrue(x1,,xn)(y1,,yn)xiyiif(x1,xn)(y1,,yn)f(x1,xn)f(y1,,yn). 단조 함수의 구성은 단조이므로 대부분의 함수에서 만들 수있는 모든 함수는 단조입니다.

보완적인 단조 함수는 대부분의 게이트로 구축 될 수있는 함수의 클래스라는 것이 밝혀졌습니다.

ff(x1,,xn)=maj(f(x1,x1,x3,x4,,xn),f(x1,x2,x2,x4,,xn),f(x3,x2,x3,x4,,xn))

f1(x1,x2,x3,,xn)=f(x1,x1,x3,x4,,xn)f2(x1,,xn)=f(x1,x2,x2,x4,,xn) and f3(x1,,xn)=f(x3,x2,x3,x4,,xn). To show that f=maj(f1,f2,f3), we need to show that for any input, at least two of f1, f2, and f3 are equal to f. We divide up into cases based on the values of x1, x2 and x3. If x1=x2=x3 then f1=f2=f3=f.

Suppose not all of x1, x2, and x3 are the same. By permuting the variables of f, we can assume that x1=x2 and x3 is different and because f is complementary, it suffices to deal with the case x1=x2=False and x3=True. In this case, (x1,x1,x3)=(False,False,True)=(x1,x2,x3), (x1,x2,x2)=(False,False,False)(x1,x2,x3) and (x3,x2,x3)=(True,False,True)(x1,x2,x3). By monotonicity we deduce that f2f1=ff3. If f=False then f2False implies f2=False=f and if f=True then f3True implies f3=True. Thus, at least two of f1, f2, and f3 are equal to f in all cases so f=maj(f1,f2,f3).

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