Алгоритм или функция для навигации по циферблату или компасу (или любому другому кругу)? - PullRequest
1 голос
/ 13 декабря 2010

Я ищу хороший элегантный способ навигации по дискретным шагам круга.

Итак, представьте, что вы даете стрелке часов команду двигаться по часовой стрелке или против часовой стрелки на один шаг. Начиная с 1 и двигаясь по часовой стрелке, это легко - просто добавьте один. Но когда вы достигнете 12 и добавите единицу, алгоритму нужно сбросить обратно на 1, а не на 13. Аналогичным образом, в противном случае - когда вы двигаетесь против часовой стрелки от 1, алгоритм должен переместить вас на 12, а не на ноль.

Моя первоначальная идея - использовать модуль по модулю, так что представьте 12 приращений, функция может быть такой:

new_position = ((curr_position + 12) + increment) % 12

Но это явно не касается перехода от 12-> 1 или от 12 <-1. </p>

Я уверен, что есть хороший способ сделать это ...

Ответы [ 4 ]

4 голосов
/ 13 декабря 2010

Часть проблемы в том, что вы думаете 12:00 == 12. Это становится легче, когда вы понимаете 12:00 == 0.

0 голосов
/ 13 декабря 2010

Этот алгоритм O (n), но он должен хорошо работать для разумных входных данных.

private static int AdvanceHours(int hour, int hoursToAdvance)
{
    Debug.Assert(1 <= hour && hour <= 12);
    hour += hoursToAdvance;
    while (hour < 1)
        hour += 12;
    while (hour > 12)
        hour -= 12;
    return hour;
}
0 голосов
/ 13 декабря 2010

Может быть, не оптимально, но я бы сделал:

int GetTime(int current, int increment)
{
    int result = current + increment;
    return result >= 0 ? result : result + 12;
}
0 голосов
/ 13 декабря 2010

Если вы не хотите, чтобы if проверял наличие негативов и добавлял 12, вы можете использовать следующее (хотя я не уверен, что это элегантно):

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