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]]]]]
Antworten:
JavaScript (ES6), 260 Byte
Nimmt Eingaben als Array von Arrays von Booleschen Werten. Gibt einen Baum von 1-indizierten Mehrheitsgattern zurück oder löst einen Rekursionsfehler (1) aus, wenn keine Lösung vorhanden ist.
Die Hauptfunktion f () versucht rekursiv, eine Lösung zu finden, indem sie den Löser F () aufruft und die maximale Verschachtelungsebene m bei jeder Iteration erhöht .
(1) Nach einer langen Zeit und unter der Annahme unendlichen Gedächtnisses
Demo
Code-Snippet anzeigen
Beispiel
Unten finden Sie eine Validierungstabelle der Lösung, die für den letzten Testfall der Demo gefunden wurde.
quelle
Mathematica, 121 Bytes
Eine anonyme Funktion, deren zweites Argument eine Liste der Listen der wahren Positionen im Vektor der Booleschen Werte ist.
Etwas schöner formatiert:
Andernfalls wirdf1=f(x1,x1,x2,x3,…,xn−1) , f2=f(x1,x2,x2,x3,…,xn−1) und f3=f(x1,x2,x1,x3,…,xn−1)) , löse jedes von diesen rekursiv und setze dannf=maj(f1(x1,x3,x4,…,xn),f2(x1,x2,x4,…,xn),f2(x2,x3,x4,…,xn)) .
Erläuterung:
Dies ist ein rekursiver Algorithmus, der das Problem der Lösung eines Problems mitn Variablen auf die Suche nach drei Lösungen für Probleme mit n−1 Variablen reduziert . Die Schlüsselbeobachtung, die diese Arbeit ausmacht, ist, dass für f eine der Funktionen, die wir suchen, Folgendes gilt:
f(x1,…,xn)=maj(f(x1,x1,x3,x4,…,xn),f(x1,x2,x2,…),f(x3,x2,x3,…))
Warum ist das so? Nun, die Majoritätsfunktion erfüllt zwei Eigenschaften:
Es stellt sich heraus, dass komplementäre monotone Funktionen genau die Klasse von Funktionen sind, die aus Mehrheitsgattern aufgebaut werden können.
quelle