Задача состоит в том, чтобы написать код, который может найти небольшие логические формулы для сумм битов.
Общая задача для вашего кода - найти наименьшую возможную логическую формулу высказывания, чтобы проверить, равна ли сумма 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
.
Обновление Оказывается, есть умный способ решения этой проблемы, когда x = 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 допустимых оператора).