Il compito è scrivere codice che possa trovare piccole formule logiche per somme di bit.
La sfida generale è che il tuo codice trovi la formula logica proposizionale più piccola possibile per verificare se la somma delle variabili binarie 0/1 binarie equivale a un valore x. Chiamiamo le variabili x1, x2, x3, x4 ecc. La tua espressione dovrebbe essere equivalente alla somma. Cioè, la formula logica dovrebbe essere vera se e solo se la somma è uguale a x.
Ecco un modo ingenuo di farlo per cominciare. Dì y = 15 and x = 5. Scegli tutti i 3003 modi diversi di scegliere 5 variabili e per ognuno fai una nuova clausola con AND di quelle variabili E AND della negazione delle restanti variabili. Si finisce con 3003 clausole ciascuna di lunghezza esattamente 15 per un costo totale di 45054.
La tua risposta dovrebbe essere un'espressione logica di quel tipo che può essere semplicemente incollata in Python, diciamo, così posso provarla. Se due persone ottengono la stessa dimensione, vince il codice che esegue il più veloce.
È consentito introdurre nuove variabili nella soluzione. Quindi in questo caso la tua formula logica è composta dalle variabili binarie y, x e da alcune nuove variabili. L'intera formula sarebbe soddisfacente se e solo se la somma delle variabili y è uguale a x.
Come esercizio iniziale alcune persone potrebbero voler iniziare con y = 5 variabili che si aggiungono a x = 2. Il metodo ingenuo darà quindi un costo di 50.
Il codice dovrebbe assumere due valori y e x come input e produrre la formula e le sue dimensioni come output. Il costo di una soluzione è solo il conteggio grezzo delle variabili nel suo output. Quindi (a or b) and (!a or c)
conta come 4. Gli unici operatori consentiti sono and
, or
e not
.
Aggiornamento Si scopre che esiste un metodo intelligente per risolvere questo problema quando x = 1, almeno in teoria.
z[0] = y[0] and y[1]
, come vuoi che sia indicato?
z[0]
rappresentata, y[0] or y[1]
dovrei solo introdurre una clausola simile (y[0] or y[1]) or not z[0]
(o qualsiasi altra istruzione equivalente che utilizza i 3 operatori consentiti).