Gerrymandering พร้อมประตูลอจิก


16

ฟังก์ชันส่วนใหญ่เป็นฟังก์ชั่นบูลีนซึ่งรับอินพุตบูลีนสามรายการและส่งคืนค่าที่พบบ่อยที่สุด เช่นถ้าmaj(x,y,z)เป็นฟังก์ชันส่วนใหญ่และTหมายถึงความจริงและFหมายถึงเท็จแล้ว:

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

คำถามนี้เกี่ยวข้องกับการเขียนฟังก์ชันบูลีนเป็นองค์ประกอบของฟังก์ชันส่วนใหญ่ ตัวอย่างขององค์ประกอบ 5 Ary (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 เวกเตอร์ของบูลีนและส่งออกต้นไม้ของประตูเสียงส่วนใหญ่ที่ส่งกลับค่าจริงในเวกเตอร์ที่กำหนดทั้งหมดถ้าเป็นไปได้ ฟังก์ชั่นอาจกลับมาเป็นจริงหรือเท็จในเวกเตอร์ไม่ได้อยู่ในรายการข้อ จำกัด

  • รายการของเวกเตอร์อาจป้อนในรูปแบบใดก็ได้ที่คุณต้องการ หากคุณต้องการแทนที่จะป้อนเวกเตอร์คุณสามารถป้อนรายการตำแหน่งที่แท้จริงในเวกเตอร์ได้ ดังนั้นสำหรับตัวอย่างเช่น[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เทียบเท่า

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟ: ทางออกที่สั้นที่สุดในการชนะไบต์

กรณีทดสอบ:

โปรดทราบว่ามีเอาต์พุตที่เป็นไปได้มากมายสำหรับแต่ละกรณีเหล่านี้ดังนั้นคุณควรเขียนสคริปต์ตัวตรวจสอบที่แปลงเอาต์พุตของคุณเป็นฟังก์ชันและตรวจสอบว่าฟังก์ชันของคุณคืนค่าเป็นจริงในแต่ละเวกเตอร์อินพุตที่ระบุ

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-ary ของฟังก์ชันส่วนใหญ่คือ (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

JavaScript (ES6), 260 ไบต์

รับอินพุตเป็นอาร์เรย์ของบูลีน ส่งคืนทรีของประตูเสียงข้างมากที่มีการจัดทำดัชนี 1 หรือส่งข้อผิดพลาดการเรียกซ้ำ(1)หากไม่มีวิธีแก้ไข

ฟังก์ชั่นหลักf ()พยายามค้นหาวิธีแก้ไขซ้ำโดยเรียก solver 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

มีวิธีแก้ปัญหาที่มีประสิทธิภาพซึ่งหวังว่าจะมีคนค้นหา ในขณะเดียวกันผมคิดว่าการจัดเรียงกำลังดุร้ายของงาน ...
ฮู้ด

2

Mathematica, 121 ไบต์

ฟังก์ชันที่ไม่ระบุตัวตนซึ่งรับอาร์กิวเมนต์ที่สองเป็นรายการของตำแหน่งที่แท้จริงในเวกเตอร์ของ booleans

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}}))]

หากมีน้อยกว่าสามตัวแปรให้ตัดกันเวกเตอร์ข้อ จำกัด เพื่อดูว่ามี "True" ทั่วไปในข้อ จำกัด ทั้งหมดหรือไม่ หากมีหนึ่งฟังก์ชั่นคงที่ (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))f=maj(f1(x1,x3,x4,,xn),f2(x1,x2,x4,,xn),f2(x2,x3,x4,,xn))

คำอธิบาย:

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

x2x1x3x2x1x3

f(x1,x1,x3,x4,,xn), f(x1,x2,x2,x4,,xn), and f(x3,x2,x3,x4,,xn)) and take the majority of them.

Why is this true? Well the majority function satisfies two properties:

  1. It is "complementary". That is, if !x is the negation of x, then maj(!x,!y,!z)=!maj(x,y,z). As a consequence, every function we can build out of the majority function is complementary.

  2. It is monotonic. That is, maj(x,y,False)maj(x,y,True). In general, if we say that FalseTrue and say (x1,,xn)(y1,,yn) if xiyi for all i, then I say a function f is monotonic if (x1,xn)(y1,,yn) implies f(x1,xn)f(y1,,yn). The composition of monotonic functions is monotonic so every function we can build out of the majority function is monotonic.

It turns out that complementary monotonic functions are exactly the class of functions that can be built out of majority gates.

Now, we show that for f a complementary monotonic function, our identity holds: f(x1,,xn)=maj(f(x1,x1,x3,x4,,xn),f(x1,x2,x2,x4,,xn),f(x3,x2,x3,x4,,xn))

Let's set 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.