Я хочу вернуть, True
если и только если 3 из 4 логических значений верны.
Самое близкое, что я получил, это (x ^ y) ^ (a ^ b)
:
Что я должен делать?
boolean-logic
Саймон Куанг
источник
источник
not a ^ not b ^ not c ^ not d
верно, когда истинно только одно из отрицанных значений. Это означает, что из исходных значений ровно одно было ложным.(!a&&b&&c&&d) || (a&&!b&&c&&d) || (a&&b&&!c&&d) || (a&&b&&c&&!d)
.Ответы:
Я предлагаю написать код таким образом, чтобы указать, что вы имеете в виду. Если вы хотите, чтобы 3 значения были истинными, мне кажется естественным, что значение 3 где-то появляется.
Например, в
C++
:Это хорошо определено в
C++
:standard (§4.7/4)
указывает, что преобразованиеbool
вint
дает ожидаемые значения 0 или 1.В Java и C # вы можете использовать следующую конструкцию:
источник
if (!!a + !!b + !!c + !!d == 3)
легче написать, хотя я не знаю, оптимизируют ли это компиляторы или нет# 1: Использование ветвления?: 3 или 4 операции
№ 2 без ветвления, 7 операций
Назад, когда я использовал для профилирования всего, я обнаружил, что решения без ветвления были намного более быстрыми операциями для работы, поскольку ЦП мог лучше предсказывать путь к коду и выполнять больше операций в тандеме. Тем не менее, в отчете о ветвлении работы примерно на 50% меньше.
источник
Если бы это был Python, я бы написал
Или
Или
Или
Или
Или
Или
Все это работает, так как логические значения являются подклассами целых чисел в Python.
Или, вдохновленный этим аккуратным трюком ,
источник
a=5;not not a == 1
. Недостаток в том, что нет настоящего логического типа.bool
:)Длинная, но очень простая (дизъюнктивная) нормальная форма:
Это может быть упрощено, но это требует больше размышлений: P
источник
(a & b & (c ^ d)) | ((a ^ b) & c & d)
?Не уверен, что это проще, но возможно.
((x xor y) and (a and b)) or ((x and y) and (a xor b))
источник
Если вы хотите использовать эту логику в языке программирования, я предлагаю
Или, если хотите, вы можете поместить все это в одну строку:
Также вы можете обобщить эту проблему на
n of m
:источник
Этот ответ зависит от системы представления, но если 0 - единственное значение, интерпретируемое как ложное, и
not(false)
всегда возвращает одно и то же числовое значение, тоnot(a) + not(b) + not(c) + not(d) = not(0)
следует сделать свое дело.источник
Имея в виду, что SO, если для вопросов программирования, а не просто логических проблем, ответ, очевидно, зависит от выбора языка программирования. Некоторые языки поддерживают функции, которые не характерны для других.
Например, в C ++ вы можете проверить свои условия с помощью:
Это должен быть самый быстрый способ проверки языков, которые поддерживают автоматическое (низкоуровневое) преобразование из логических типов в целочисленные. Но опять же, нет общего ответа на эту проблему.
источник
Лучшее, что я могу сделать, это
((x ^ y) ^ (a ^ b)) && ((a || x) && (b || y))
источник
Первое выражение ищет 1 или 3
true
из 4. Второе исключает 0 или 1 (а иногда и 2)true
из 4.источник
Java 8, отфильтруйте ложные значения и посчитайте оставшиеся истинные значения:
Тогда вы можете использовать его следующим образом:
Легко обобщает для проверки
n
изm
пунктов истинности.источник
Для проверки, по крайней мере
n
, из всехBoolean
верных (n должно быть меньше или равно общему числуBoolean
: p)Изменить : после комментария @ Cruncher
Чтобы проверить 3
boolean
из 4Другой :
((c & d) & (a ^ b)) | ((a & b) & (c ^ d))
( Подробности )источник
Вот способ, которым вы можете решить это в C # с помощью LINQ:
источник
Это симметричная булева функция
S₃(4)
. Симметричная логическая функция - это логическая функция, которая зависит только от количества установленных входов, но не зависит от того, какими входами они являются. Кнут упоминает функции этого типа в разделе 7.1.2 тома 4 «Искусство компьютерного программирования».S₃(4)
можно вычислить с помощью 7 операций следующим образом:Кнут показывает, что это оптимально, что означает, что вы не можете сделать это менее чем за 7 операций, используя обычные операторы:
&&, || , ^, <,
и>
.Однако, если вы хотите использовать это на языке, который использует
1
для true и0
для false, вы также можете легко использовать сложение:что делает ваше намерение совершенно ясным.
источник
С чисто логической точки зрения это то, что я придумал.
По принципу голубиной дыры, если точно 3 истинно, то либо a и b верны, либо c и d верны. Тогда нужно просто сопоставить каждый из этих случаев точно с одним из двух других.
Таблица правды Вольфрама
источник
mine <=> his
тогда я не знаю, что сказать, как этого можно было бы ожидать.Если вы используете инструмент логической визуализации, такой как Karnaugh Maps, вы увидите, что это проблема, когда вы не можете избежать полноценного логического термина, если хотите записать его в одну строку if (...). Лопина это уже показала, проще не написать. Вы можете выделить немного, но это будет трудно читать для вас и для машины.
Подсчет решений не плох, и они показывают, что вы действительно после. Эффективность подсчета зависит от вашего языка программирования. Решения для массива с Python или LinQ приятно смотреть, но будьте осторожны, это МЕДЛЕННО. Wolf's (a + b + x + y) == 3 будет работать хорошо и быстро, но только если ваш язык приравнивает «true» к 1. Если «true» представлен -1, вам придется проверить на -3: )
Если ваш язык использует истинные логические значения, вы можете попытаться запрограммировать его явно (я использую! = В качестве теста XOR):
«x! = y» работает, только если x, y имеют логический тип. Если это какой-то другой тип, где 0 - false, а все остальное - true, это может не сработать. Затем используйте логическое XOR, или ((bool) x! = (Bool) y), или напишите «if (x) return (y == false) else return (y == true);», что немного больше работать за компьютером.
Если в вашем языке программирования есть оператор ternary? :, вы можете сократить его до
который сохраняет читабельность или агрессивно
Этот код выполняет ровно три логических теста (состояние a, состояние b, сравнение x и y) и должен быть быстрее, чем большинство других ответов здесь. Но вы должны это прокомментировать, иначе вы не поймете это через 3 месяца :)
источник
Здесь много хороших ответов; Вот альтернативная формулировка, которую еще никто не опубликовал:
источник
Похож на первый ответ, но на чистой Java:
Я предпочитаю считать их целыми числами, потому что это делает код более читабельным.
источник
В Python , чтобы увидеть, сколько из итерируемых элементов является True, используйте
sum
(это довольно просто):Настроить
Актуальный тест
Вывод
источник
Если вы ищете решение на бумаге (без программирования), тогда вам нужны алгоритмы K-maps и Quine-McCluskey, которые помогут вам минимизировать вашу булеву функцию.
В вашем случае результат
Если вы хотите сделать это программно, с нефиксированным количеством переменных и пользовательским «порогом», то просто выполнить итерацию по списку логических значений и подсчет вхождений «true» довольно просто и просто.
источник
Учитывая 4 логических значения, a, b, x, y, эта задача преобразуется в следующий оператор C:
источник
true
равен 1. Это не так (без каламбура) во всех языках / случаях. blogs.msdn.com/b/oldnewthing/archive/2004/12/22/329884.aspxэто то, что вы хотите. По сути, я взял ваш код и добавил, что на самом деле 3 - правда, а 3 - нет.
источник
Вопрос программирования без ответа, включающего рекурсию? Немыслимо!
Существует достаточно «точно 3 из 4 истин» ответов, но вот обобщенная (Java) версия для «точно m из n истин» (в противном случае рекурсия на самом деле не стоит) только потому, что вы можете:
Это может быть вызвано что-то вроде:
который должен вернуть
true
(потому что 5 из 8 значений были истинными, как и ожидалось). Не совсем доволен словами «истина» и «ложь», но сейчас не могу придумать лучшего имени ... Обратите внимание, что рекурсия прекращается, когда найдено слишком многоtrue
или слишком многоfalse
значений.источник
true
. Может быть что - то вродеcontainsNumberOfTrueValues()
. Как и в сторону: именование Smalltalk был бы гораздо более подходящим для этого, хотя:doesArray: someBooleans startingAt: anIndex containNumberOfTrueValues: anExpectedNumber foundSofar: aNumberFoundSoFar
. Вероятно, слишком долго для вкуса некоторых разработчиков Java, но Smalltalkers никогда не боятся правильного именования ;-)containsTruth
буквально означает «содержит некоторое количество нераскрытого количества правды», поэтому я считаю, что все в порядке.Поскольку удобочитаемость очень важна, вы можете использовать вызов описательной функции (обертывание любой из предложенных реализаций). Если этот расчет необходимо выполнить в нескольких местах, вызов функции является наилучшим способом повторного использования и дает четкое представление о том, что вы делаете.
источник
В PHP, чтобы сделать его более динамичным (на случай, если вы измените количество условий и т. Д.):
источник
Хотя я мог показать, что это хорошее решение, ответ Сэма Хочевара легко написать и понять позже. В моей книге это лучше.
источник
Вот код C #, который я только что написал, потому что вы меня вдохновили:
Он принимает любое количество аргументов и сообщит вам, являются ли n из них истинными.
и вы называете это так:
Теперь вы можете тестировать 7/9 или 15/100, как хотите.
источник