Платформа: CodeWars
Название задачи: Shortest direction on circle (Кратчайшее направление по окружности)
Ссылка на задачу: https://www.codewars.com/kata/686fd320adc800ab627089c2
Сложность: 7 kyu
Уже решили (На момент написания статьи): 94 из 476
Тэги: Mathematics, Geometry
Оригинальное описание задачи:
Given coordinates of two points A and B on a circle determine what is the shortest direction from A to B.
To be clear with context, let's make some definitions:
- Direction on a circle is number of degrees to advance along the circle from a point counterclockwise (positive sign) or clockwise (negative sign). - Length of a direction is its absolute value.
- A point coordinate is value of a direction to the point from the rightmost circle point.
- As any number of full turns doesn't change actual point position, with this definition multiple coordinates may correspond to a same point.
Conditions:
1) coordinates are integer
2) coordinates are NOT limited to 0..360 and may be negative
Examples:
1) With A at 0 (right) and B at 90 (top) the shortest direction is counterclockwise +90.
2) If points are swapped in the previous example, the shortest direction is flipped to -90.
3) With A at 180 (left) and B at -450 (bottom) the shortest direction is counterclockwise +90.
4) With A at 90 (top) and B at 270 (bottom) both 180 and -180 are correct.
Пояснение задачи:
Задача формулируется следующим образом:
Даны координаты двух точек A и B на окружности, представленные целыми числами, выражающими направление от точки отсчёта (правого края окружности) в градусах.
Необходимо определить кратчайший угол поворота (направление) от точки A к точке B, двигаясь по окружности против часовой стрелки (положительное направление) или по часовой стрелке (отрицательное направление).
Пояснение:
1. Определение направления движения: Нам нужно найти кратчайшее направление, которое минимизирует абсолютную величину угла. Это означает, что мы можем двигаться либо по часовой стрелке, либо против часовой стрелки, и нам важно выбрать тот путь, который даёт наименьшую длину пути (по модулю).
2. Обработка координат: Координаты точек могут быть отрицательными и превышать 360^\circ. Поскольку координаты соответствуют направлениям относительно начальной точки, они не ограничены диапазоном 0 \ldots 360^\circ. Поэтому перед вычислениями мы приведём обе координаты к положительным значениям, добавив необходимое количество полных оборотов (360^\circ) таким образом, чтобы получить эквивалентные положительные значения.
3. Вычисление разницы направлений: Разница между координатами двух точек даст нам начальное направление, однако оно может быть слишком длинным (не кратчайшим).
Например, разница 350^\circ и 10^\circ будет равна 340^\circ, хотя кратчайший путь — это 20^\circ (противоположный путь). Чтобы найти кратчайший путь, нужно сравнить два возможных направления:
- Прямой путь по часовой стрелке (разница координат).
- Противоположный путь (разность координат, увеличенная на 360^\circ).
4. Выбор кратчайшего пути: Выбираем минимальное по модулю значение из двух возможных путей (прямой и противоположный).
- Пример: A = 0^\circ, B = 90^\circ
- Прямой путь: 90^\circ (против часовой стрелки).
- Противоположный путь: 360^\circ - 90^\circ = 270^\circ.
- Кратчайший путь: +90^\circ