Каков краткий, легко читаемый способ проверки, чтобы увидеть, равны ли два числа из трех? - PullRequest
7 голосов
/ 21 марта 2011

В принципе, если у меня есть такая функция:

function foo (int a, int b, int c) {
    return true if two out of the three variables are true otherwise false
}

Есть ли простой и лаконичный способ выяснить, равны ли n чисел из набора? Как насчет только трех предметов? Есть ли математическая операция, которой я могу воспользоваться? Я знаю, что могу использовать итеративный подход к решению, мне просто любопытно, есть ли другие способы решения, более понятные.

Вот разбивка условий, потому что мне трудно выразить проблему:

if no numbers are equal, return false
if two numbers out of three are equal, return true
if all three numbers are equal, return false

Ответы [ 6 ]

12 голосов
/ 21 марта 2011

Один из методов - добавить параметры в набор, а затем посмотреть, равна ли длина этого набора 2 (или меньше 3, если вы вернете true, если все они также равны). Например, в Python:

def foo(a, b, c):
    return len(set((a, b, c))) == 2
5 голосов
/ 21 марта 2011

Я не думаю, что вы получите более эффективный или лаконичный способ, чем ручной:

if a == b 
   return b != c 
else
   return b == c || a == c

Или это:

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

Если a, b и c являются только логическими (0 или 1) значениями, то вы можете просто сделать это:

return a+b+c == 1 || a+b+c == 2 // Either two are false, or two are true
3 голосов
/ 21 марта 2011

В C или C ++ вы можете сделать:

return ((a==b)|(b==c)|(a==c));

или для возврата количества совпадений:

return ((a==b)+(b==c)+(a==c));

Для случая, когда вы хотите указать только, если 2 равны:

return (((a==b)+(b==c)+(a==c)) == 1);

Нам нравится использовать побитовый или | а не логично || для исполнения. Все это основано на стандарте, указывающем, что сравнения возвращают 1 для TRUE и 0 для FALSE.

2 голосов
/ 21 марта 2011

В C вы можете использовать

return ((a == b) || (b == c)) ^ (a == c);
2 голосов
/ 21 марта 2011

если входные переменные являются логическими, то вы могли бы построить таблицу истинности и минимизировать результирующую функцию, например, с помощью KV-диаграммы

a b c f(a,b,c)
0 0 0 0
0 0 1 0
0 1 0 0
0 1 1 1
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 1

При минимизации возвращается результат

  (c and a) or (b and a) or (c and b)

KV-диаграмма проста в обработке до 4 переменных (со стажем, может быть, 6 переменных), для более логических значений требуются более сложные методы.

0 голосов
/ 21 марта 2011
int difference = a-(b-c);
if(a==0 && b==0 && c==0)
  return false;
if((difference == a) /*b=c*/ || (difference == c) /*a=b*/ || (difference == (2*a-b)) /*a=c*/)
  return true;
return false;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...