La funzione maggioritaria è una funzione booleana che accetta tre input booleani e restituisce il più comune. Ad esempio, se maj(x,y,z)
è la funzione maggioritaria e T
indica vero e F
indica falso, allora:
maj(T,T,T) = T
maj(T,T,F) = T
maj(T,F,F) = F
maj(F,F,F) = F
Questa domanda riguarda la scrittura di funzioni booleane come composizioni di funzioni maggioritarie. Un esempio di una composizione a 5 livelli delle funzioni maggioritarie è (x1,x2,x3,x4,x5) => maj(x1,x2,maj(x3,x4,x5))
. Questa funzione restituisce il seguente output su questi vettori di input di esempio:
(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
Compito
Scrivere un programma che inserisca un numero intero positivo n e un elenco di n lunghezza di vettori di valori booleani e produca un albero di porte maggioritarie che ritorni vero su tutti i vettori dati, se possibile. La funzione può restituire vero o falso su vettori non nell'elenco dei vincoli.
L'elenco dei vettori può essere inserito in qualsiasi formato desiderato. Se preferisci, invece di inserire il vettore, puoi inserire l'elenco delle posizioni reali nel vettore. Quindi, per esempio,
[TTF,TFT,FTT]
oppure[[T,T,F],[T,F,T],[F,T,T]]
oppure[[1,2],[1,3],[2,3]]
(elenco di posizioni vere) vanno bene.L'output può essere in qualsiasi formato di albero valido. Ad esempio,
maj(maj(x1,x2,x3),x4,x5)
funziona. Probabilmente vorrai usare numeri singoli come stand-in per variabili, come in[[1,2,3],4,5]
. Anche lo smalto inverso123m45m
va bene, per esempio.Se non è presente alcuna funzione, il programma dovrebbe generare un errore o generare un valore di falso.
Se ci sono più funzioni che funzionano, il tuo programma può restituire una qualsiasi di esse. Non è necessario semplificare la funzione. Ad esempio,
maj(x1,x1,x2)
ox1
sono equivalenti.
punteggio
Questo è il codice golf: vince la soluzione più breve in byte.
Casi test:
Si noti che ci sono molti output possibili per ciascuno di questi casi, quindi è necessario scrivere uno script checker che converte l'output in una funzione e verificare che la funzione restituisca true su ciascuno dei vettori di input specificati.
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]]]]]