Найти ближайшие стрелки часов


15

Вызов

Учитывая количество секунд после полуночи, выведите наименьший угол между любыми двумя стрелками на циферблате, используя как можно меньше байтов.

Вы можете предположить, что количество секунд всегда меньше 86400. Углы могут быть представлены в градусах или радианах.

Справочное решение по адресу: http://ideone.com/eVdgC0

Тестовые случаи (результаты в градусах)

0 -> 0
60 -> 0.5
600 -> 5
3600 -> 0
5400 -> 45
6930 -> 84.75
50000 -> 63.333

Clarificarions

  • Часы имеют 3 стрелки: часы, минуты и секунды.
  • Все стрелки движутся непрерывно, поэтому часовые и минутные стрелки можно найти между градациями на циферблате.

Сопутствующий вызов (только минутная и часовая стрелки, в градусах)
Sp3000

1
Вероятно, вы должны указать, что на часах есть секундная стрелка.
Исаак

Можете ли вы добавить несколько тестов?
Бета-распад

1
На некоторых часах минутная стрелка переходит на следующую минуту, когда секундная стрелка достигает вершины. На других он движется непрерывно. Я полагаю, это часы, где они постоянно движутся? Кроме того, хотя ясно, что после прочтения внимательно, я сначала обнаружил, что «секундная стрелка» неоднозначна, потому что большинство часов в любом случае имеют как минимум две руки, поэтому добавление «секундной стрелки» действительно добавляет третью руку.
Рето Коради

1
@ BetaDecay Конечно. Я мог бы сказать что-то вроде: «Часы имеют три стрелки: часы, минуты и секунды».
Рето Коради

Ответы:


10

CJam, 36 35 34 32 30 байт

riP*30/_60/_C/]2m*::-:mc:mC$3=

Вывод в радианах. Я проверил решения для всех 86400 возможных входов.

Попробуйте онлайн в интерпретаторе CJam .

идея

Поскольку радиан - это полный круг, каждый минутный / секундный интервал на часах составляет 2π / 60 = π / 30 радиан в ширину.

Таким образом, деление количества секунд на π / 30 дает положение секундной стрелки.

Минутная стрелка перемещается на одну шестидесятую часть темпа секундной стрелки, поэтому деление результата сверху на 60 дает положение минутной стрелки.

Аналогично, деление последнего результата на 12 дает положение часовой стрелки.

Обратите внимание, что наши три частных сверху не обязательно находятся в диапазоне [0,2π).

Вычисляя все девять возможных различий в углах рук, мы получаем три 0 (угловое расстояние между рукой и самой собой) и шесть расстояний между разными руками.

Если ближайшие руки находятся на половине, не включающей 12 , одно из отличий сверху будет желаемым результатом (мод ).

Однако в 01:55:30 (например) часовая стрелка находится под углом 1,008 рад (57,75 градуса), а минутная стрелка - под углом 5,812 рад (333,00 градуса) от 12 , что дает разницу в 4,804 рад (275,25 град). Вычитая этот результат из полного круга, мы получаем угол, измеренный «в другом направлении», который равен 1,479 рад (84,75 рад).

Теперь вместо того, чтобы отображать каждый угол θ в [0,2π) и условно вычитать результат из π , мы можем просто вычислить arccos (cos (θ)) , поскольку cos является периодическим и четным, а arccos всегда дает значение в [ 0, π) .

Пропустив три наименьших результата (все ноль), четвертый наименьший будет желаемым результатом.

Код

ri                             e# Read an integer from STDIN.
  P*30/                        e# Multiply by π and divide by 30.
       _60/                    e# Divide a copy by 60.
           _C/                 e# Divide a copy by 12.
              ]2m*             e# Push the array of all pairs of quotients.
                  ::-          e# Replace each pair by its difference.
                     :mc       e# Apply cosine to each difference.
                        :mC    e# Apply arccosine to each cosine.
                           $3= e# Sort and select the fourth smallest element.

Альтернативная версия (34 байта)

rd6*_60/_C/]360f%2m*::m360X$f-+$6=

Вывод в градусах и тригонометрические функции не используются.

Попробуйте онлайн в интерпретаторе CJam .


9

Mathematica, 40 байт

Min@Abs@Mod[#{11,708,719}/120,360,-180]&

Пояснение: Позвольте tбыть количество секунд с полуночи. Положение каждой руки

hour: t/120 (mod 360)
min:  t/10 (mod 360)
sec:  6t (mod 360)

Рассчитать абсолютное угловое расстояние между x градусами и yградусами, мы можем изменить y - xдиапазон на 360, [-180, 180]а затем принять абсолютное значение. (Обратите внимание , что не существует никаких ограничений на xи y.) Таким образом , эта функция просто вычисляет попарные различия t/10-t/120, 6t-t/10и 6t-t/120и делает это.


Извините, не знаком с Mathematica, но принимает ли это аргумент или переменную для количества секунд с полуночи?
Винни

1
@Winny Да, это чистая функция (обозначена &), и первый передаваемый аргумент называется внутри #.
JCai

7

Питон, 65

lambda n,l={720,60,1}:6*min((n/x-n/y)%60for x in l for y in{x}^l)

Расстояние, пройденное часовой, минутной и секундной стрелками, в единицах 1/60 круга равно h,m,s = n/720, n/60, n/1. Мы можем взять эти 60 модов, чтобы получить их положение на круге от 0до 60.

Если мы возьмем их разницу 60 мод, мы получим количество единиц, что один перед другим. Мы берем все шесть возможных различий, находим мин, затем умножаем на, 6чтобы масштабировать до 360градусов.

Понимание двухслойного списка сначала выбирает из первых рук, как представлено 720 , 60или 1, затем выбирает другую руку из этого набора с первым выбором удаляется с помощью множества XOR.

Я проверил это исчерпывающе в отношении кода ссылки.


6

C #, 163 152 байта

Это создает каждую руку дважды для подсчета, а затем перебирает каждую комбинацию и находит минимальный угол между руками. Расчеты выполняются в 60 делениях, затем умножаются на 6, чтобы получить градусы.

Отступы для ясности:

float F(int s){
    float b=60,c;
    float[]a={c=s/b/b%12*5,c+b,c=s/b%b,c+b,s%=60,s+b};
    for(s=36;s-->0;)
        b=s%6!=s/6&(c=(c=a[s%6]-a[s/6])<0?-c:c)<b?c:b;
    return b*6;
}

Пример вывода:

    0 seconds, 00:00:00, smallest angle is 0°
43200 seconds, 12:00:00, smallest angle is 0°
86399 seconds, 23:59:59, smallest angle is 0.09164429°
 3330 seconds, 00:55:30, smallest angle is 54.75°
39930 seconds, 11:05:30, smallest angle is 60.25001°
21955 seconds, 06:05:55, smallest angle is 65.49998°
21305 seconds, 05:55:05, smallest angle is 59.50001°
 5455 seconds, 01:30:55, smallest angle is 75.45831°
41405 seconds, 11:30:05, smallest angle is 44.95834°

Хорошее решение для учета вокруг
до

2

TI-BASIC, 17 байтов

min(cos⁻¹(cos(ΔList(Ans{6,.1,5!⁻¹,6

Использует Денниса arccos(cos(для нормализации расстояний; однако вместо расчета всех парных расстояний он рассчитывает только триΔList([seconds],[minutes],[hours],[seconds] .

Эта программа ожидает Degreeрежим и возвращает ответ в градусах.

РЕДАКТИРОВАТЬ: 5!на один байт короче, чем 120.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.