какая математика мне нужно, чтобы преобразовать это число - PullRequest
9 голосов
/ 04 мая 2010

с учетом X, какая математика необходима, чтобы найти его Y, используя эту таблицу?

x->y
0->1
1->0
2->6
3->5
4->4
5->3
6->2

языковая проблема

и нет, я не могу сохранить массив и выполнить поиск.

Да, вход всегда будет конечным набором от 0 до 6. Он не будет масштабироваться позже.

Ответы [ 11 ]

36 голосов
/ 04 мая 2010

Это:

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
26 голосов
/ 04 мая 2010
int f(int x)
{
    return x["I@Velcro"] & 7;
}
23 голосов
/ 04 мая 2010

0,048611x ^ 6 - 0,9625x ^ 5 + 7,340278x ^ 4 - 26,6875x ^ 3 + (45 + 1/9) x ^ 2 - 25,85x + 1

Иногда простые способы являются лучшими. ;)

16 голосов
/ 04 мая 2010

Похоже:

y = (x * 6 + 1) % 7

13 голосов
/ 04 мая 2010

Мне не очень нравится оператор%, так как он делает деление так:

y = (641921 >> (x*3)) & 7;

Но потом вы сказали что-то о том, что не используете таблицы поиска, так что, возможно, это не сработает для вас: -)

Обновление: Поскольку вы действительно хотите использовать это в реальном коде, а загадочные числа не очень хороши, я могу предложить этот более понятный вариант:

y = (0x2345601 >> (x*4)) & 15;
6 голосов
/ 04 мая 2010

Хотя кажется, что куча правильных ответов уже появилась, я решил опубликовать это, просто чтобы показать другой способ выработать его (все они в основном являются вариациями одного и того же):

Ну, базовый шаблон довольно прост:

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);
4 голосов
/ 04 мая 2010

Объединение идей Дейва и Пола дает довольно элегантный ответ:

y = (8 - x) % 7`

(хотя я вижу, что с этим меня били)

2 голосов
/ 04 мая 2010
unsigned short convertNumber(unsigned short input) {
  if (input <= 1) { return !input; } //convert 0 => 1, 1 => 0
  return (8-input); //convert 2 => 6 ... 6 => 2
}
1 голос
/ 04 мая 2010

Как насчет бит-фу?

Вы можете получить результат, используя только минус, логические операторы и смены.

b = (x >> 2) | ((x >> 1) & 1)
y = ((b << 3)|(b ^ 1)) - x
1 голос
/ 04 мая 2010

и нет, я не могу / не могу просто сохранить массив и выполнить поиск.

Почему бы и нет?

Да, вход всегда будет конечным набором от 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...