La fonction majoritaire est une fonction booléenne qui prend trois entrées booléennes et renvoie la plus courante. Par exemple, si maj(x,y,z)
est la fonction majoritaire et T
dénote vrai et F
dénote faux alors:
maj(T,T,T) = T
maj(T,T,F) = T
maj(T,F,F) = F
maj(F,F,F) = F
Cette question concerne l'écriture des fonctions booléennes en tant que compositions de fonctions majoritaires. Un exemple d'une composition à 5 aires de fonctions majoritaires est (x1,x2,x3,x4,x5) => maj(x1,x2,maj(x3,x4,x5))
. Cette fonction renvoie la sortie suivante sur ces exemples de vecteurs d'entrée:
(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
Tâche
Écrivez un programme qui entre un entier positif n et une liste de vecteurs de longueur n de booléens et sort un arbre de portes majoritaires qui retourne vrai sur tous les vecteurs donnés si possible. La fonction peut renvoyer true ou false sur des vecteurs ne figurant pas dans la liste des contraintes.
La liste des vecteurs peut être entrée dans le format de votre choix. Si vous préférez, au lieu de saisir le vecteur, vous pouvez entrer la liste des vraies positions dans le vecteur. Ainsi, par exemple,
[TTF,TFT,FTT]
ou[[T,T,F],[T,F,T],[F,T,T]]
ou[[1,2],[1,3],[2,3]]
(liste des positions réelles) sont très bien.La sortie peut être n'importe quel format d'arbre valide. Par exemple, ça
maj(maj(x1,x2,x3),x4,x5)
marche. Vous voudrez probablement utiliser des nombres simples comme remplaçants pour les variables, comme dans[[1,2,3],4,5]
. Le polissage inversé123m45m
est également correct, par exemple.S'il n'y a aucune fonction qui fonctionne, votre programme devrait générer une erreur ou produire une valeur de falsey.
S'il existe plusieurs fonctions qui fonctionnent, votre programme peut renvoyer n'importe laquelle d'entre elles. La fonction n'a pas besoin d'être simplifiée. Par exemple,
maj(x1,x1,x2)
oux1
sont équivalents.
Notation
Voici le code golf: la solution la plus courte en octets gagne.
Cas de test:
Notez qu'il existe de nombreuses sorties possibles pour chacun de ces cas, vous devez donc écrire un script de vérificateur qui convertit votre sortie en fonction et vérifier que votre fonction renvoie true sur chacun des vecteurs d'entrée spécifiés.
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]]]]]