Если действия симметричны, т.е. при X > (C > B > A) действия те же, что при X > (A > B > C),
можно привести переменные к однозначно возрастающему варианту — поменять местами A и C если A > C.
Так вариантов останется 7.
if (A > C) [A, C] = [C, A]; // поменять местами значения A и C
// теперь точно A < B < C
if (X < A) { // вар. 0
} else if (X == A) { // вар. 1
} else if (X < B) { // вар. 2
} else if (X == B) { // вар. 3
} else if (X < C) { // вар. 4
} else if (X == C) { // вар. 5
} else { // X > C // вар. 6
}
Ещё один способ — с бинарным деревом, который интуитивно но неправильно пытался подсказать
xmoonlight
Всего есть 2 * 7 = 14 вариантов. Гипотеза о том, что действия зеркальны для двух вариантов
A > B > C
и
A < B < C
вроде бы подтвердилась, поэтому оставлю первый шаг, где меняем местами A и C, чтобы последовательность точно была возрастающей.
Остаётся 7 вариантов. Достаточно 3 битов, чтобы закодировать любой из них. Каждый бит это ответ на 1 вопрос, проверка одного условия. Т.е. достаточно всего трёх if'ов для определения нужного блока кода:
0 1 2 3 4 5 6
---o-----o-----o---
A B C
0 1 0 1 0 1 0 1
0 0 1 1 0 0 1 1
0 0 0 0 1 1 1 1
Примерно так:
if (A > C) [A, C] = [C, A]; // поменять местами значения A и C
// теперь точно A < B < C
if (X > B) {
if (X > C) { // вар. 6
} else {
if (X == C) { // вар. 5
} else { // вар. 4
}
}
} else {
if (X > A) {
if (X == B) { // вар. 3
} else { // вар. 2
}
} else {
if (X == A) { // вар. 1
} else { // вар. 0
}
}
}
Так менее наглядно и читаемо, но сэкономили на спичках – меньше проверок.
Не более 3 проверок условий, чтобы определиться, куда попали.