Код, который возвращает True, если только один или два из трех параметров true
Мне нужен код, который возвращает True, если только один или два из трех параметров true
какой самый короткий/лучший способ?
15 ответов
я зависим от этого вопроса!
bool MyFourthAnswer(bool a, bool b, bool c)
{
return (a != b) || (b != c);
}
просто проверьте, установлено ли хотя бы одно из значений и не все три значения:
bool result = (a | b | c) & !(a & b & c);
вот причудливый способ:
bool oneOrTwoTrue = a ? (!b || !c) : (b || c);
если установлен первый bool, то любой из оставшихся должен быть снят. В противном случае должен быть установлен любой из оставшихся.
EDIT-в ответ на комментарии: в производственном коде я бы, вероятно, пошел с @AS-CII или @Stuart; он передает намерение того, что вычисляется наиболее четко.
другого ответа... Мне нравится этот вопрос...
bool MyThirdAnswer(params bool[] list)
{
return list.Distinct().Count() == 2;
}
LINQ, которая так:
bool[] params = { true, false, true };
int count = params.Count(a => a);
bool result = count == 2 || count == 1;
окончательный ответ от меня... честно!
один вопрос, который пришел мне в голову, заключается в том, действительно ли это ситуация, когда следует использовать 3 була.
вместо использования 3 bools может быть более уместным использовать перечисление [Flags] - и это может сделать код быстрее, более читаемым и более удобным.
код для этого может быть:
[flags]
enum Alarm
{
None = 0x0,
Kitchen = 0x1,
Bathroom = 0x2,
Bedroom = 0x4,
All = Kitchen | Bathroom | Bedroom,
}
bool MyFifthAnswer(Alarm alarmState)
{
switch (alarmState)
{
case Alarm.None:
case Alarm.All:
return false;
default:
return true;
}
}
из интереса, каковы 3 була в исходном вопросе?
просто для удовольствия, если true = 1 и false = 0:
return (a + b + c) % 3
и еще один, предполагая false = 0 и true = любое строго положительное целое число:
return (a*b + b*c + c*a) > (3*a*b*c)
зачем придерживаться пары сравнений / булевых операций, когда вы можете сделать 6 умножений и сделать его полностью неясным? ;-)
bool MyAnswer(params bool[] list)
{
var countTrue = list.Where(x => x).Count();
return countTrue == 1 || countTrue == 2;
}
Edit: после травли комментаторами true == x
удалены... извините - это было в документе "стандарты кодирования", которому я должен был следовать один раз!
Это такой забавный вопрос - я должен был попробовать его в Clojure (язык, который я изучаю)
(defn one-or-two-args-true? [& args]
(> 3 (count (filter true? args)) 0))
user=> (one-or-two-args-true? false false false)
false
user=> (one-or-two-args-true? false false true)
true
user=> (one-or-two-args-true? false true true)
true
user=> (one-or-two-args-true? true true true)
false
Так как мой предыдущий ответ был слишком длинным, я попробую еще раз:
bool MySecondAnswer(params bool[] list)
{
return list.GroupBy(x => x).Count() == 2;
}
поместите логические значения в список, а затем отфильтруйте с помощью linq:
var options = new List<bool>() { true, true, false };
var trueOptions = options.Where( opt => opt };
var count = trueOptions.Count();
return count == 1 || count == 2;
69 символов в bash
x (){ test "$(echo $@|sed 's/ /\n/g'|sort|uniq|grep -c .)" == "2"; }
32 символа в python
def x(a,b,c):return a!=b or b!=c