Завдання полягає в написанні коду, в якому можна знайти невеликі логічні формули для сум бітів.
Загальний виклик полягає у тому, щоб ваш код знаходив найменшу можливу логічну формулу пропозиції, щоб перевірити, чи сума y двійкових змінних 0/1 дорівнює деякому значенню x. Назвемо змінні x1, x2, x3, x4 і т. Д. Ваш вираз повинен бути еквівалентний сумі. Тобто логічна формула повинна бути істинною тоді і лише тоді, коли сума дорівнює x.
Ось наївний спосіб це зробити для початку. Скажіть y = 15 і x = 5. Оберіть усі 3003 різних способів вибору 5 змінних і для кожної складіть новий пункт із AND цих змінних та AND заперечення решти змінних. У вас виходить 3003 пункту, довжина яких рівно 15, загальною вартістю 45054.
Ваша відповідь має бути логічним виразом такого роду, який можна просто вставити в python, скажімо, так що я можу перевірити це. Якщо двоє людей отримують вираз однакового розміру, виграє код, який працює найшвидше.
Вам дозволяється вводити нові змінні у ваше рішення. Отже, у цьому випадку ваша логічна формула складається з y бінарних змінних, x та деяких нових змінних. Вся формула була б задоволеною тоді і лише тоді, коли сума змінних y дорівнює x.
В якості початкової вправи деякі люди можуть захотіти почати з y = 5 змінних, додаючи до x = 2. Наївний метод дасть тоді вартість 50.
Код повинен приймати два значення y і x як вхідні дані та виводити формулу та її розмір як вихід. Вартість рішення - це лише кількість необроблених змінних його результатів. Так (a or b) and (!a or c)
вважається 4. Єдиними дозволеними операторами є and
, or
і not
.
Оновлення Виявляється, є розумний метод вирішення цієї проблеми, коли х = 1, принаймні теоретично.
z[0] = y[0] and y[1]
, як ви хочете, щоб це було зазначено?
z[0]
представляла, y[0] or y[1]
тоді мені просто потрібно було б ввести пункт, який виглядає так (y[0] or y[1]) or not z[0]
(або будь-який еквівалентний оператор з використанням дозволених 3 операторів).