Код, который возвращает 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; он передает намерение того, что вычисляется наиболее четко.


это должно помочь

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 була.

вместо использования 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;

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

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

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

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