Если вы ограничиваете символы в ASCII, а не в юникоде, тогда мне нравится:
http://ideone.com/khacx. (отредактировано в ответ на комментарий, указывающий, что я не совсем правильно понял спецификации, но мне все еще нравится основная идея. Добавлен дополнительный тест в качестве проверки).
using System;
class example {
static void elegant(char a, char b, char c) {
int y = ((int) a - 48) + ((int) b - 48) + ((int) c - 48);
int z = ((int) a - 48) * ((int) b - 48) * ((int) c - 48);
bool result = y == ((int) a-48)*3 || (z ==0 && (a==b || b==c || a==c));
Console.WriteLine(result);
}
static void Main() {
elegant('0', 'b', 'c'); // false
elegant('a', '0', 'c'); // false
elegant('a', 'b', '0'); // false
elegant('a', 'b', 'c'); // false
elegant('0', '0', '0'); // true
elegant('a', 'a', 'a'); // true
elegant('0', 'a', 'a'); // true
elegant('a', '0', 'a'); // true
elegant('a', 'a', '0'); // true
elegant('0', '0', 'a'); // true
elegant('0', 'a', '0'); // true
elegant('a', '0', '0'); // true
}
}
Для более общего решения, которое охватывает неограниченное количество символов, вот для чего нужны регулярные выражения: ^ (.) (\ 1 | 0) * $