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]]]]]
Respuestas:
JavaScript (ES6), 260 bytes
Toma datos como una matriz de matrices de booleanos. Devuelve un árbol de puertas mayoritarias indexadas en 1 o arroja un error de recursión (1) si no existe una solución.
La función principal f () intenta recurrentemente encontrar una solución llamando al solucionador F () e incrementando el nivel máximo de anidamiento m en cada iteración.
(1) después de mucho tiempo, y asumiendo memoria infinita
Manifestación
Mostrar fragmento de código
Ejemplo
A continuación se muestra una tabla de validación de la solución encontrada para el último caso de prueba de la demostración.
fuente
Mathematica, 121 bytes
Una función anónima que toma su segundo argumento como una lista de las listas de posiciones verdaderas en el vector de booleanos.
Formateado ligeramente mejor:
De lo contrario, sustituyaf1=f(x1,x1,x2,x3,…,xn−1) , f2=f(x1,x2,x2,x3,…,xn−1) , y f3=f(x1,x2,x1,x3,…,xn−1)) , resuelve recursivamente cada uno de estos, luego establecef=maj(f1(x1,x3,x4,…,xn),f2(x1,x2,x4,…,xn),f2(x2,x3,x4,…,xn)) .
Explicación:
Una vez que conoce esta identidad, el algoritmo es claro: cuando hay dos o menos variables, el problema es trivial. De lo contrario, resuelve recursivamente los tres problemas de representarf(x1,x1,x3,x4,…,xn) f(x1,x2,x2,x4,…,xn) f(x3,x2,x3,x4,…,xn))
¿Por qué es esto cierto? Bueno, la función mayoritaria cumple dos propiedades:
Es monotónico. Es decir,maj(x,y,False)≤maj(x,y,True) y n ) si x i ≤ y i para todo i , entonces digo una funciónFalse≤True (x1,…,xn)≤(y1,…,yn) xi≤yi i f (x1,…xn)≤(y1,…,yn) f(x1,…xn)≤f(y1,…,yn) . La composición de las funciones monotónicas es monotónica, por lo que cada función que podemos construir a partir de la función mayoritaria es monotónica.
Resulta que las funciones monotónicas complementarias son exactamente la clase de funciones que se pueden construir a partir de puertas mayoritarias.
fuente