учитывая X, что математика необходима для нахождения ее Y, с помощью этой таблицы?
x->y
0->1
1->0
2->6
3->5
4->4
5->3
6->2
проблема агностика языка
и не, я/наклоняю, просто хранят массив и делают поиск.
да, вход всегда будет конечным множеством от 0 до 6. это привычка масштабироваться позже.
Это:
y = (8 - x) % 7
Вот как я пришел к этому:
x 8-x (8-x)%7
----------------
0 8 1
1 7 0
2 6 6
3 5 5
4 4 4
5 3 3
6 2 2
0.048611x^6 - 0.9625x^5 + 7.340278x^4 - 26.6875x^3 + (45 + 1/9)x^2 - 25.85x + 1
Иногда простые способы лучше. ;)
Мне не очень нравится оператор %, поскольку он делает деление так:
y = (641921 >> (x*3)) & 7;
Но потом вы сказали, что не используете таблицы поиска, так что, возможно, это вам не подходит :-)
Update: Поскольку вы хотите на самом деле использовать это в реальном коде, а криптографические числа не нравятся, я могу предложить этот более удобный вариант:
y = (0x2345601 >> (x*4)) & 15;
Объединение идей в ответе Дейва и Пола дает довольно элегантный результат:
y = (8 - x) % 7`
(хотя я вижу, что это меня избило)
unsigned short convertNumber(unsigned short input) {
if (input <= 1) { return !input; } //convert 0 => 1, 1 => 0
return (8-input); //convert 2 => 6 ... 6 => 2
}
Домашнее задание?
Как насчет:
y = (x <= 1 ? 1 : 8) - x
и нет, я не могу просто хранить массив и выполнять поиск.
Почему нет?
Да, на входе всегда будет конечное множество от 0 до 6. Оно не будет масштабироваться позже.
Тогда просто используйте кучу условий.
if (input == 0) return 1;
else if (input == 1) return 0;
else if (input == 2) return 6;
...
Или найдите формулу, если ее легко увидеть, а она здесь есть:
if (input == 0) return 1;
else if (input == 1) return 0;
else return 8 - input;
Вот способ избежать и модуля, и условных обозначений, исходя из этого:
y = (8 - x) % 7
Мы знаем, что x % y = x - floor(x/y)*y
Поэтому мы можем использовать y = 8 - x - floor((8 - x) / 7) * 7
Хотя кажется, что уже появилась куча правильных ответов, я решил опубликовать это, чтобы показать другой способ решить эту проблему (они ' все в основном вариации одного и того же):
Что ж, основной шаблон довольно прост:
x y
0 6
1 5
2 4
3 3
4 2
5 1
6 0
y = 6 - x
Ваши данные просто имеют значения y, смещенные «вниз» на два индекса (или значения x смещены » вверх").
Итак, вам нужна функция для сдвига значения x. Это должно сделать это:
x = (x + 5) % 7;
Результирующее уравнение:
y = 6 - ((x + 5) % 7);
А что насчет бит-фу?
Вы можете получить результат, используя только минус, логические операторы и сдвиги.
b = (x >> 2) | ((x >> 1) & 1)
y = ((b << 3)|(b ^ 1)) - x