Giao lưu với Logic Gates


16

Hàm đa số là hàm boolean có ba đầu vào boolean và trả về phổ biến nhất. Chẳng hạn, nếu maj(x,y,z)là hàm đa số và Tbiểu thị true và Fbiểu thị false thì:

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

Câu hỏi này liên quan đến việc viết các hàm boolean như là các thành phần của các hàm đa số. Một ví dụ về thành phần 5 ary của các chức năng đa số là (x1,x2,x3,x4,x5) => maj(x1,x2,maj(x3,x4,x5)). Hàm này trả về đầu ra sau trên các vectơ đầu vào mẫu này:

(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

Bài tập

Viết chương trình nhập số nguyên dương n và danh sách các vectơ n dài của booleans và xuất ra một cây cổng đa số trả về giá trị true trên tất cả các vectơ đã cho nếu có thể. Hàm có thể trả về đúng hoặc sai trên các vectơ không có trong danh sách các ràng buộc.

  • Danh sách các vectơ có thể được nhập vào ở bất kỳ định dạng nào bạn muốn. Nếu bạn thích, thay vì nhập vectơ, bạn có thể nhập danh sách các vị trí thực trong vectơ. Vì vậy, ví dụ, [TTF,TFT,FTT]hoặc [[T,T,F],[T,F,T],[F,T,T]]hoặc [[1,2],[1,3],[2,3]](danh sách các vị trí true) đều tốt.

  • Đầu ra có thể là bất kỳ định dạng cây hợp lệ. Ví dụ, maj(maj(x1,x2,x3),x4,x5)công trình. Bạn có thể sẽ muốn sử dụng các số duy nhất làm số độc lập cho các biến, như trong [[1,2,3],4,5]. Đánh bóng ngược 123m45mcũng không sao, chẳng hạn.

  • Nếu không có chức năng nào hoạt động, chương trình của bạn sẽ tạo ra lỗi hoặc xuất giá trị falsey.

  • Nếu có nhiều chức năng hoạt động, chương trình của bạn có thể trả về bất kỳ chức năng nào trong số đó. Các chức năng không cần phải được đơn giản hóa. Ví dụ, maj(x1,x1,x2)hoặc x1là tương đương.

Chấm điểm

Đây là mã golf: Giải pháp ngắn nhất trong byte thắng.

Các trường hợp thử nghiệm:

Lưu ý rằng có nhiều đầu ra có thể có cho mỗi trường hợp này, vì vậy bạn nên viết một tập lệnh kiểm tra chuyển đổi đầu ra của bạn thành một hàm và kiểm tra xem hàm của bạn có trả về đúng trên từng vectơ đầu vào đã chỉ định không.

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

"Thành phần 5-ary của các hàm đa số là (x1, x2, x3, x4, x5) => maj (x1, x2, maj (x3, x4, x5))" như thế nào? Câu trả lời sẽ là gì nếu x1 = x2 = F; x3 = x4 = x5 = T; ?
tsh

Tôi sẽ thêm một bảng sự thật.
Hood

1
Sản lượng của 1 có nghĩa là gì?
Mhmd

2
Tiêu đề gợi ý: Gerrymandering với cổng logic
Robert Fraser

1
@trichoplax Không, đầu ra trên tất cả các vectơ còn lại có thể là bất cứ thứ gì. Tôi sẽ cập nhật để làm cho rõ ràng.
Hood

Câu trả lời:


2

JavaScript (ES6), 260 byte

Đưa đầu vào như một mảng các mảng booleans. Trả về một cây gồm các cổng đa số được lập chỉ mục 1 hoặc đưa ra lỗi đệ quy (1) nếu không có giải pháp nào tồn tại.

Hàm chính f () cố gắng đệ quy để tìm một giải pháp bằng cách gọi bộ giải F () và tăng mức lồng nhau tối đa m ở mỗi lần lặp.

(1) sau một thời gian dài và giả sử bộ nhớ vô hạn

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)

Bản giới thiệu

Thí dụ

Dưới đây là bảng xác nhận của giải pháp được tìm thấy cho trường hợp thử nghiệm cuối cùng của bản demo.

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

Có một giải pháp hiệu quả, hy vọng ai đó sẽ tìm thấy. Trong khi đó, tôi đoán loại công việc vũ phu ...
Hood

1

Toán học, 121 byte

Một hàm ẩn danh lấy đối số thứ hai của nó làm danh sách các danh sách các vị trí thực trong vectơ của 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}}))]

Định dạng đẹp hơn một chút:

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

Nếu có ít hơn ba biến, hãy cắt các vectơ ràng buộc để xem liệu có "True" chung trong tất cả các ràng buộc không. Nếu có một, thì hàm hằng (x_1, x_2) -> x_i hoạt động, nếu không thì không thể (và sẽ đưa ra lỗi bằng cách thử lấy phần tử đầu tiên của danh sách trống).

Nếu không, thay thế f1=f(x1,x1,x2,x3,,xn1) , f2=f(x1,x2,x2,x3,,xn1)f3=f(x1,x2,x1,x3,,xn1)) , đệ quy giải quyết mỗi trong số này, sau đó thiết lậpf=maj(f1(x1,x3,x4,,xn),f2(x1,x2,x4,,xn),f2(x2,x3,x4,,xn)) .

Giải trình:

Đây là một thuật toán đệ quy làm giảm vấn đề tìm giải pháp cho một vấn đề biến n để tìm ba giải pháp cho n1 vấn đề biến. Các quan sát quan trọng mà làm cho công việc này là cho f một trong những chức năng, chúng tôi đang tìm kiếm chúng ta có: f(x1,,xn)=maj(f(x1,x1,x3,x4,,xn),f(x1,x2,x2,),f(x3,x2,x3,))

Ở vị trí đầu tiên, chúng tôi thay thế x2 bằng x1 , ở vị trí thứ hai x3 bằng x2 và ở vị trí thứ ba x1 bằng x3 .

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

Tại sao điều này lại đúng? Hàm đa số thỏa mãn hai tính chất:

  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). Thành phần của các chức năng đơn điệu là đơn điệu vì vậy mọi chức năng chúng ta có thể xây dựng ngoài chức năng đa số là đơn điệu.

Nó chỉ ra rằng các chức năng đơn điệu bổ sung chính xác là lớp chức năng có thể được xây dựng từ các cổng đa số.

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)f3(x1,,xn)=f(x3,x2,x3,x4,,xn)f=maj(f1,f2,f3)f1f2f3fx1x2x3x1=x2=x3f1=f2=f3=f

x1x2x3fx1=x2x3fx1=x2=Falsex3=True(x1,x1,x3)=(False,False,True)=(x1,x2,x3)(x1,x2,x2)=(False,False,False)(x1,x2,x3)(x3,x2,x3)=(True,False,True)(x1,x2,x3)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).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.