Знайдіть найближчі руки годинника


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 руки: години, хвилини та секунди.
  • Всі руки рухаються безперервно, таким чином, години та хвилини рук можна знайти між градаціями на обличчі годинника.


1
Вам, напевно, слід уточнити, що на годиннику є друга рука.
isaacg

Чи можете ви додати кілька тестових випадків?
Бета-розпад

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 's (кутова відстань між рукою і самою) та шість відстаней між різними руками.

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

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

Тепер, замість відображення кожного кута θ в [0,2π) і умовно віднімання результату від π , ми можемо просто обчислити дуги (cos (θ)) , оскільки cos є періодичним і парним, а дуги завжди дають значення в [ 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

Математика, 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.

Якщо ми візьмемо їх різницю mod 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°

Nice рішення для обліку обгорткою навколо
тото

2

TI-BASIC, 17 байт

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

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

Ця програма очікує Degreeрежиму і повертає відповідь у градусах.

EDIT: 5!на один байт коротший, ніж 120.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.