Подтвердить что ты не робот

Код, возвращающий True, если верно только один или два из трех параметров

Мне нужен код, возвращающий True, если true или только один или два из трех параметров являются истинными

что является самым коротким/лучшим способом?

4b9b3361

Ответ 1

Я увлекаюсь этим вопросом!

bool MyFourthAnswer(bool a, bool b, bool c)
{
   return (a != b) || (b != c);
}

Ответ 2

Просто проверьте, установлено ли хотя бы одно из значений, а не все три значения:

bool result = (a | b | c) & !(a & b & c);

Ответ 3

Здесь фантастический способ:

bool oneOrTwoTrue = a ? (!b || !c) : (b || c);

Если первый bool установлен, любой из оставшихся должен быть отменен. В противном случае необходимо установить любое из оставшихся.

EDIT. В ответ на комментарии: в производственном коде я бы, вероятно, пошел с @AS-CII или @Stuart; он сообщает о намерениях того, что вычисляется наиболее четко.

Ответ 4

Это должно сделать это

return !((a & b & c) || (!a & !b & !c))

Ответ 5

Другой ответ... Мне нравится этот вопрос...

bool MyThirdAnswer(params bool[] list)
{
   return list.Distinct().Count() == 2;
}

Ответ 6

Способ LINQ:

bool[] params = { true, false, true };
int count = params.Count(a => a);
bool result = count == 2 || count == 1;

Ответ 7

Окончательный ответ от меня... честный!

Один вопрос, который возник для меня, заключается в том, действительно ли это ситуация, когда нужно использовать 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 вопроса в исходном вопросе?

Ответ 8

Просто для удовольствия, если true = 1 и false = 0:

return (a + b + c) % 3

И еще один, предполагая false = 0 и true = любое строго положительное целое число:

return (a*b + b*c + c*a) > (3*a*b*c)

Зачем придерживаться пары сравнений/логических операций, когда вы могли бы сделать 6 умножений и сделать это полностью неясным?; -)

Ответ 9

bool MyAnswer(params bool[] list)
{
   var countTrue = list.Where(x => x).Count();
   return countTrue == 1 || countTrue == 2;
}

Изменить: после устранения комментариев комментаторами true == x удалено... извините - это было в документе "стандарты кодирования", который я должен был выполнить один раз!

Ответ 10

Это такой забавный вопрос - мне пришлось попробовать его в 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

Ответ 11

Поскольку мой предыдущий ответ был слишком длинным, я попробую еще раз:

bool MySecondAnswer(params bool[] list)
{
   return list.GroupBy(x => x).Count() == 2;
}

Ответ 12

Поместите булевы в список, а затем отфильтруйте с помощью linq:

var options = new List<bool>() { true, true, false };
var trueOptions = options.Where( opt => opt };
var count = trueOptions.Count();

return count == 1 || count == 2;

Ответ 13

bool result = !(a && b && c) && (a || b || c)

Ответ 14

Хороший вопрос
Мой ответ:

return (a||b||c) != (a&&b&&c)

Ответ 15

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