Мне нужен код, возвращающий True, если true или только один или два из трех параметров являются истинными
что является самым коротким/лучшим способом?
Мне нужен код, возвращающий True, если true или только один или два из трех параметров являются истинными
что является самым коротким/лучшим способом?
Я увлекаюсь этим вопросом!
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; он сообщает о намерениях того, что вычисляется наиболее четко.
Это должно сделать это
return !((a & b & c) || (!a & !b & !c))
Другой ответ... Мне нравится этот вопрос...
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 bools.
Вместо использования 3-х байт, было бы более целесообразно использовать перечисление [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;
}
Изменить: после устранения комментариев комментаторами 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;
bool result = !(a && b && c) && (a || b || c)
Хороший вопрос
Мой ответ:
return (a||b||c) != (a&&b&&c)
69 символов в bash
x (){ test "$(echo [email protected]|sed 's/ /\n/g'|sort|uniq|grep -c .)" == "2"; }
32 символа в python
def x(a,b,c):return a!=b or b!=c