La función mayoritaria es una función booleana que toma tres entradas booleanas y devuelve la más común. Por ejemplo, si maj(x,y,z)
es la función mayoritaria y T
denota verdadero y F
denota falso, entonces:
maj(T,T,T) = T
maj(T,T,F) = T
maj(T,F,F) = F
maj(F,F,F) = F
Esta pregunta se refiere a escribir funciones booleanas como composiciones de funciones mayoritarias. Un ejemplo de una composición de 5 funciones de funciones mayoritarias es (x1,x2,x3,x4,x5) => maj(x1,x2,maj(x3,x4,x5))
. Esta función devuelve el siguiente resultado en estos vectores de entrada de muestra:
(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
Tarea
Escriba un programa que ingrese un entero positivo n y una lista de vectores de longitud n de booleanos y genere un árbol de compuertas mayoritarias que devuelva verdadero en todos los vectores dados si es posible. La función puede devolver verdadero o falso en vectores que no están en la lista de restricciones.
La lista de vectores se puede ingresar en cualquier formato que desee. Si lo prefiere, en lugar de ingresar el vector, puede ingresar la lista de posiciones verdaderas en el vector. Entonces, por ejemplo,
[TTF,TFT,FTT]
or[[T,T,F],[T,F,T],[F,T,T]]
o[[1,2],[1,3],[2,3]]
(lista de posiciones verdaderas) están bien.La salida puede ser cualquier formato de árbol válido. Por ejemplo,
maj(maj(x1,x2,x3),x4,x5)
funciona. Probablemente desee utilizar números individuales como sustitutos para las variables, como en[[1,2,3],4,5]
. El pulido inverso123m45m
también está bien, por ejemplo.Si no hay una función que funcione, su programa debería generar un error o generar un valor falsey.
Si hay varias funciones que funcionan, su programa puede devolver cualquiera de ellas. La función no necesita ser simplificada. Por ejemplo,
maj(x1,x1,x2)
ox1
son equivalentes.
Puntuación
Este es el código de golf: la solución más corta en bytes gana.
Casos de prueba:
Tenga en cuenta que hay muchos resultados posibles para cada uno de estos casos, por lo que debe escribir un script de verificación que convierta su salida en una función y verifique que su función devuelva verdadero en cada uno de los vectores de entrada especificados.
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]]]]]