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


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для цілих чисел

Оцінка балів

Це тому виграє найменше байтів на кожній мові !

Тестові шафи

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


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, оскільки ми, безумовно, хочемо уникати використання longy Math.abs()і Math.min().

Замість обчислення абсолютного значення ми примушуємо позитивне значення у шляхом обчислення:[0..12]

x=4+h311m180

І замість обчислення мінімуму, ми визначаємо, у якому випадку ми просто робимо побіто І з - і саме тому ми обрали в першу чергу інтервал, обмежений потужністю .22


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
Збережіть два байти, працюючи в половині градусів, використовуючи Ø°для 360і “<¿‘для 60,11. Так і ד<¿‘Iæ%Ø°AH TIO
Джонатан Аллан

Я збирався сказати 12 символів , але виявляється, що Windows-1252 (і кілька інших кодувань) насправді можуть кодувати це в 12 байтах. Між різними символами, що не належать до ASCII, я не думав, що одне кодування не Unicode охопить їх усіх, але, мабуть, я там дуже помиляюся.
Танатос

@Thanatos Деякі мови, що спеціалізуються на коді з гольфу, мають власні кодові сторінки для 256 символів, які вони кодують у 1 байт кожен. Jelly - одна з них, із цією спеціальною кодовою сторінкою . 05AB1E, Деревне вугілля, 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

Невже це не вдасться опівночі, вийшов 180замість цього 0?
Кудлатий

4

Мова Вольфрама (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прапор із початкової установки.


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

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- один з двох кутів між годинною рукою і хвилинною рукою; коефіцієнт для mє 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), що дало би правильний результат



1

Пітон 3, 58 57 байт

-1 / -2 Завдяки @Shaggy

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

Наївна реалізація, приймає вклад у вигляді [6,32]. Можливо, деякі байти, особливо, можуть бути відточені останнім рядком.

Пітон 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-style також повинна зберігати деякі байти.
негативний сім

З виклику формулювання @negativeseven здавалося, що слід використовувати stdin / stdout
Тео,

У 2-му рядку можна випустити круглі дужки.
Кудлатий

Для коректної роботи рішення дійсно потребують декількох модифікацій (Python 2). Результат повинен бути меншим або рівним 180 та більшим або рівним 0.
Ерік Атголфер

1

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

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

Спробуйте в Інтернеті!

Вводить дані як години з наступними хвилинами в окремому рядку, оскільки це зберегло кілька байтів.


ДОБРЕ. Виправлено це.
Xcali


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

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)

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