Die Majoritätsfunktion ist eine boolesche Funktion, die drei boolesche Eingaben verwendet und die am häufigsten verwendete zurückgibt. Wenn zum Beispiel maj(x,y,z)
die Mehrheitsfunktion ist und T
wahr und F
falsch bedeutet, dann:
maj(T,T,T) = T
maj(T,T,F) = T
maj(T,F,F) = F
maj(F,F,F) = F
Diese Frage betrifft das Schreiben von Booleschen Funktionen als Kompositionen von Mehrheitsfunktionen. Ein Beispiel für eine fünfstellige Zusammensetzung von Mehrheitsfunktionen ist (x1,x2,x3,x4,x5) => maj(x1,x2,maj(x3,x4,x5))
. Diese Funktion gibt die folgende Ausgabe für diese Beispieleingabevektoren zurück:
(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
Aufgabe
Schreiben Sie ein Programm, das eine positive ganze Zahl n und eine Liste mit Vektoren der Länge n von Booleschen Werten eingibt und einen Baum von Mehrheitsgattern ausgibt, der nach Möglichkeit für alle gegebenen Vektoren true zurückgibt. Die Funktion kann für Vektoren, die nicht in der Liste der Einschränkungen enthalten sind, entweder true oder false zurückgeben.
Die Liste der Vektoren kann in einem beliebigen Format eingegeben werden. Wenn Sie möchten, können Sie anstelle des Vektors die Liste der wahren Positionen im Vektor eingeben. Also zum Beispiel,
[TTF,TFT,FTT]
oder[[T,T,F],[T,F,T],[F,T,T]]
oder[[1,2],[1,3],[2,3]]
(Liste der wahren Positionen) sind alle in Ordnung.Die Ausgabe kann in einem beliebigen gültigen Baumformat erfolgen. Zum Beispiel
maj(maj(x1,x2,x3),x4,x5)
funktioniert. Sie werden wahrscheinlich einzelne Zahlen als Stellvertreter für Variablen verwenden wollen, wie in[[1,2,3],4,5]
. Reverse Polish123m45m
ist zum Beispiel auch in Ordnung.Wenn keine Funktion funktioniert, sollte Ihr Programm einen Fehler erzeugen oder einen falschen Wert ausgeben.
Wenn mehrere Funktionen funktionieren, kann Ihr Programm jede dieser Funktionen zurückgeben. Die Funktion muss nicht vereinfacht werden. Zum Beispiel
maj(x1,x1,x2)
oderx1
sind gleichwertig.
Wertung
Das ist Codegolf: Kürzeste Lösung in Bytes gewinnt.
Testfälle:
Beachten Sie, dass es für jeden dieser Fälle viele mögliche Ausgaben gibt. Schreiben Sie daher ein Überprüfungsskript, das Ihre Ausgabe in eine Funktion konvertiert, und überprüfen Sie, ob Ihre Funktion für jeden der angegebenen Eingabevektoren true zurückgibt.
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]]]]]