Аналог тупой!

23

Аналоговые часы имеют 2 стрелки *: часы и минуты.
Эти стрелки обвивают лицо часов с течением времени. Каждое полное вращение минутной стрелки приводит к 1/12 оборота часовой стрелки. 2 полных оборота часовой стрелки означают полный день.

Поскольку эти руки зафиксированы в одной центральной точке и вращаются вокруг этой точки, вы всегда можете рассчитать угол между руками. На самом деле есть 2 угла в любой момент времени; Больший и меньший (иногда они равны 180, но это не важно)

* У наших гипотетических часов нет секундной стрелки

задача

Учитывая время в 24-часовом формате, выведите меньший угол между стрелками в градусах. Если стрелки находятся прямо напротив друг друга (например, у 6:00и 18:00т. Д.), Выведите 180

правила

Входные данные может быть принята в качестве: - Разделитель разделена строка: 6:32, 14.26 - 2 отдельных значения, строка или Интс: 6, 32, 14, 26 - массив из 2 -х значений, строк или целых чисел: [6, 32],[14, 26]

Вы также можете дополнительно указать , что ваш ответ требует входов быть проложенными до 2 цифр (если вы берете строки), то есть: 06:32, 06, 32,[06, 32]

Вы также можете при необходимости изменить порядок входов, с минуту потом час, т.е. 32:6, 32, 6,[26, 14]

Час будет целочисленным значением между 0и 23(включительно) Минутой будет целочисленное значение между 0и 59(включительно)

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

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

счет

Это поэтому побеждает меньшее количество байтов на каждом языке !

Testcases

Input: 06:32
Output: 4

Input: 06:30
Output: 15

Input: 18:32
Output: 4

Input: 06:01
Output: 174.5

Input: 00:00
Output: 0

Input: 00:01
Output: 5.5

Input: 12:30
Output: 165

Input: 6:00
Output: 180

Input: 23:59
Output: 5.5
Skidsdev
источник
2
@FryAmTheEggman «Вывод должен быть дан в градусах, а не в радианах», так что я бы не догадался
Тео
1
забыл, что в 5:59 часовая стрелка почти в 6
ааааа говорит восстановить Монику
4
Предлагаемый тестовый пример: 00:59 -> 35.5(небольшое значение с большим значением может привести к сбою некоторых реализаций). мhm
Арнаулд
1
Спасибо, @Arnauld, ты просто стоил мне байта! : p
Мохнатый

Ответы:

14

JavaScript (ES6),  41 40  39 байт

Принимает входные данные как (h)(m).

h=>m=>((x=4+h/3-m*.55/9)&2?12-x:x)%4*90

Попробуйте онлайн!

Как?

Вместо того, чтобы работать непосредственно в диапазоне [0..360] , мы определяем временную переменную x в диапазоне [0..4] :

x=|4h12+4m60×124m60|mod4
x=|4h1244m60×12|mod4
x=|h311m180|mod4

Угол в градусах определяется как:

min(4x,x)×90

Тем не менее, формула реализована немного по-другому в коде JS, так как мы определенно хотим избежать использования long Math.abs()и Math.min().

Вместо вычисления абсолютного значения мы принудительно устанавливаем положительное значение в путем вычисления:[0..12]

x=4+h311m180

И вместо того, чтобы вычислять минимум, мы определяем, в каком случае мы просто делаем побитовое И с - и именно поэтому мы выбрали интервал, ограниченный степенью в первую очередь.22

Arnauld
источник
5

Желе , 14 12 байт

ד<¿‘Iæ%Ø°AH

Попробуйте онлайн!

Монадическая ссылка, которая принимает время в виде списка из двух целых чисел: час, минута.

Спасибо @JonathanAllan за сохранение 2 байта!

объяснение

ד<¿‘        | Multiply hour by by 60 and minute by 11
     I       | Find difference
      æ%Ø°   | Symmetric mod 360 [equivalent to (x + 360) mod 720 - 360]
          A  | Absolute
           H | Half
Ник Кеннеди
источник
Симметричный мод? Как это работает?
лохматый
@Shaggy Очень удобно, он возвращает значение в интервале, (-180, 180]который эквивалентен (мод 360). Эти встроенные ...
Нил
1
Сохраните два байта, работая в половине градусов, используя Ø°for 360и “<¿‘for 60,11. Как так ד<¿‘Iæ%Ø°AH TIO
Джонатан Аллан
Я собирался сказать 12 символов , но оказывается, что Windows-1252 (и несколько других кодировок) может фактически закодировать это в 12 байтов. Между различными не-ASCII-символами я не думал, что одна не-Unicode-кодировка охватит их всех, но, видимо, я очень ошибаюсь.
Танатос
@Thanatos Некоторые языки, специализирующиеся на игре в код, имеют свои собственные кодовые страницы для 256 символов, которые они кодируют в 1 байт каждая. Желе является одним из них, с этой пользовательской кодовой страницей . 05AB1E, Charcoal, MathGolf, Stax и т. Д. - другие языки с пользовательскими кодовыми страницами. Большинство из них действительно основаны на Windows-1252. :)
Кевин Круйссен
4

MATL, 18 байт

30*i5.5*-t360-|hX<

Принимает два ввода часов с последующими минутами. Использует тот же метод, что и этот ответ

Попробуйте это на MATL Online

объяснение

      % Implicitly grab first input (hours)
30*   % Multiply by 30
i     % Explicitly grab second input (minutes)
5.5*  % Multiply by 5.5
-     % Take the difference
t     % Duplicate the result
360-  % Subtract 360
|     % Take the absolute value
h     % Horizontally concatenate
X<    % Determine the minimum value
      % Implicitly display the result
Suever
источник
Не получится ли это в полночь, 180вместо вывода 0?
лохматый
4

Wolfram Language (Mathematica) , 30 29 28 байт

5Abs@Mod[#.{6,-1.1},72,-36]&

Попробуйте онлайн!

версия без золота:

Abs[Mod[#.{30,-5.5}, 360, -180]] &

Аргумент функции # = {h,m}содержит час и минуту. Эта длина-два списка интерпретируется как вектор и скалярного произведения с {30,-5.5}рассчитывается следующим образом : #.{30,-5.5} = 30*h-5.5*m. Затем мы вычисляем симметричный модуль 360 с Mod[#.{30,-5.5}, 360, -180]учетом угла в интервале -180 .. + 180. Absпринимает его абсолютное значение.

Поскольку все задействованные операторы являются линейными, мы можем умножить и разделить все появляющиеся числа, однако они наиболее удобны. Вытаскивая коэффициент 5из выражения и деля все числа в выражении на 5, количество байтов минимизируется.

Римский
источник
3

Алхимик , 134 байта

_->In_h+In_m+720d+360a+f
h->60d
m+11d->
0m+d+a+0r->b
0a+0x->r
d+b+r->r+a
r+0b->
b+0d+0h+0y->5y
b+0d+5y->x
0b+0d+f->Out_x+Out_"."+Out_y

Попробуйте онлайн!

объяснение

_->In_h+In_m+720d+360a+f

Начальная настройка. Вводит часы и минуты в hи m, устанавливает текущий угол dв 360 градусов (720 полугодий), устанавливает aдля вычисления основного угла и устанавливает флаг вывода.

h->60d
m+11d->

Каждый час прибавляет 30 градусов, а каждая минута вычитает 5,5 градусов.

0m+d+a+0r->b
0a+0x->r

Хотя r(обратный) флаг не установлен, каждый dатом должен переместиться на один aатом b. Это происходит после того, как все минуты исчерпаны, чтобы избежать «состояния гонки». Когда aатомов не осталось, установите rобратный поток.

Обратите внимание, что это второе правило может запускаться несколько раз и даже может запускаться перед правилом начальной настройки. Это ничего не вредит, поэтому нет необходимости предотвращать это. 0xУсловие обрабатывает ребро случая: когда вход 6:00, нет aатомов , когда программа завершается, но есть xатомы , если конечный результат, по крайней мере 1 градус.

d+b+r->r+a
r+0b->

Обратное: когда угол со знаком больше 180 градусов, переместите bатомы в, aчтобы уменьшить угол вывода. Прекратите движение задним ходом, когда угол достигнет «360».

b+0d+0h+0y->5y
b+0d+5y->x

Когда все атомы степени израсходованы, разделите на 2, чтобы получить угол на выходе.

0b+0d+f->Out_x+Out_"."+Out_y

После того, как это сделано, выведите ровно один раз, используя fфлаг из начальной настройки.

Nitrodon
источник
3

Python 3.8 (предварительная версия) , 45 43 байта

-2 байта благодаря Эрику .

lambda h,m:min(x:=abs(h%12*30-m*5.5),360-x)

Попробуйте онлайн!

h%12- час в 12-часовом формате
h%12*30- угол часовой стрелки в полный час
m/2- угол, в котором часовая стрелка перемещена в mминутах
h%12*30+m/2- текущее положение часовой стрелки в виде угла
m*6- угол минутной стрелки ( 360°/60 = 6°)

овс
источник
2

Древесный уголь , 22 байта

I↔⁻¹⁸⁰﹪⁻׳⁰⁺⁶N×⁵·⁵N³⁶⁰

Попробуйте онлайн! Ссылка на подробную версию кода. Принимает ввод как два целых числа. Объяснение:

             N          First input
           ⁺⁶           Plus literal 6
        ׳⁰             Multiplied by literal 30
       ⁻                Minus
                  N     Second input
              ×⁵·⁵      Multiplied by literal 5.5
      ﹪            ³⁶⁰  Modulo literal 360
  ⁻¹⁸⁰                  Subtracted from literal 180
 ↔                      Absolute value
I                       Cast to string
                        Implicitly print
Нил
источник
2

Perl 6 , 28 байт

((*/3-*/9*.55+2)%4-2).abs*90

Попробуйте онлайн!

Использует несколько уловок, украденных из других ответов и вычисляет

r = abs((h/3 - m/9*0.55 + 2) % 4 - 2) * 90
  = abs((h*30 - m*5.5 + 180) % 360 - 180)
nwellnhof
источник
2

Python 3 , 40 байт

lambda h,m:180-abs(180-(h*30-m*5.5)%360)

Попробуйте онлайн!

h*30- угол между полуднем и часом, hкогда минута равна 0; если час равен или больше 12, этот угол может быть равен или больше 360 °
m*6- угол между полуднем и минутной стрелкой
m*.5- угол, на который часовая стрелка переместилась вперед от полного часа после mминут (например, если это 4:24, часовая стрелка сместилась вперед на 12 градусов от положения, в котором она находилась в 4 часа)
h*30-m*5.5- один из двух углов между часовой стрелкой и минутной стрелкой; коэффициент для mIS , 5.5потому что m*6-m*.5=m*5.5; это все еще не ответ, потому что это может быть значение больше 360 ° (например: если h,m=13,0) или меньше 0 ° (например: если h,m=12,30)
(h*30-m*5.5)%360- это по модулю учитывает случаи, когда вычисленное выше значение не находится между 0 и 360 °; это все еще не ответ, потому что это может быть более широким из двух углов, в то время как мы хотим, чтобы самый узкий
180-abs(180-(h*30-m*5.5)%360)- это конечный результат; общее правило x-abs(x-y)эквивалентно тому min(y,x-y), что даст правильный результат

MarcusWolf
источник
1

Python 3, 58 57 байт

-1 / -2 Благодаря @Shaggy

h,m=eval(input())
x=(30*h-5.5*m)
print(abs(min(x,360-x)))

Наивная реализация, принимает входные данные в виде [6,32]. Некоторые байты, вероятно, могут быть сбриты с последней строки, особенно.

Python 2, 52 50 байт

h,m=input()
x=(30*h-5.5*m)
print abs(min(x,360-x))
Тео
источник
30*h-5.5*mдолжен сэкономить вам пару байтов.
лохматый
1
Функция def-стиля также должна сохранять некоторые байты.
отрицательное семь
@negativeseven из формулировки вызова казалось, что он должен использовать stdin / stdout
Тео
Вы можете опустить скобки во 2-й строке.
лохматый
Решения действительно нуждаются в нескольких модификациях (Python 2) для правильной работы. Результат должен быть меньше или равен 180 и больше или равен 0.
Эрик Игрок в гольф
1

Perl 5 -MList::Util=min -p , 37 байт

$_=abs<>*5.5-$_%12*30;$_=min$_,360-$_

Попробуйте онлайн!

Принимает ввод в виде часов с последующими минутами в отдельной строке, поскольку он сэкономил несколько байтов.

Xcali
источник
ХОРОШО. Исправлено
Xcali
1

[R], 45 байт

 function(h,m)min(t=(60*h+m)*5.5%%360,-t%%360)
Захиро Мор
источник
1

Japt , 16 байт

*FÑ aV*5½
mUa360

Попытайся

*FÑ aV*5½     :Implicit input of integers U=h and V=m
*F            :Multiply U by 15
  Ñ           :Multiply by 2
    a         :Absolute difference with
     V*5½     :V multiplied by 5.5
mUa360        :Reassign to U
m             :Minimum of U and
 Ua360        :Absolute difference of U and 360
мохнатый
источник
0

> <> , 17 байт

b*$6a**-:0)12,-*n

Попробуйте онлайн! (6:32)

Принимает ввод как h, m в стеке.

объяснение

b*$6a**-:0)12,-*n
b*                Multiplies m by 11
  $               Swaps m & h
   6a**           Multiplies h by 60
       -          Subtracts m & h (v)
        :0)       Checks if v > 0 (b=0/1)
           12,-   Subtracts .5 from b (-.5/.5)
               *  Multiplies v by b (halve & abs)
                n Outputs result
b*                Errors
tjjfvi
источник
0

05AB1E , 16 байтов

60*+5.5*D(‚360%ß

Принимает часы в качестве первого ввода, минуты в качестве второго.

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

В основном реализует следующую формулу:

t=(60h+m)×5.5
r=min(tmod360,tmod360)

60*               # Multiply the (implicit) hours-input by 60
   +              # Add it to the (implicit) minutes-input
    5.5*          # Multiply it by 5.5
        D(‚       # Pair it with it's negative
           360%   # Take modulo-360 on both
               ß  # And then pop and push the minimum of the two
                  # (which is output implicitly as result)
Кевин Круйссен
источник
0

Pyret, 59 байт

{(h,m):x=(30 * h) - (m * 5.5)
num-abs(num-min(x,360 - x))}
MLavrentyev
источник