Analog jest tępy!

23

Zegar analogowy ma 2 wskazówki *: Godzina i minuta.
Z upływem czasu wskazówki te okrążają tarczę zegara. Każdy pełny obrót wskazówki minutowej powoduje 1/12 obrotu wskazówki godzinowej. 2 pełne obroty wskazówki godzinowej oznaczają cały dzień.

Ponieważ te dłonie są przymocowane do tego samego punktu centralnego i obracają się wokół tego punktu, zawsze możesz obliczyć kąt między dłońmi. W rzeczywistości istnieją dwa kąty w danym momencie; Większy i mniejszy (czasem oba będą równe 180, ale to nie jest ważne)

* Nasze hipotetyczne zegary nie mają używanych wskazówek

Zadanie

Biorąc pod uwagę czas w formacie 24-godzinnym, wyprowadzaj mniejszy kąt między dłońmi, w stopniach. Jeżeli dłonie są naprzeciwko siebie nawzajem (takich jak na 6:00, 18:00itp) Wyjście 180

Zasady

Wejście może być traktowana jako: - Separator oddziela łańcuch: 6:32, 14.26 - 2 oddzielne wartości, łańcuchy lub ints: 6, 32, 14, 26 - Tablica 2 Wartości, łańcuchów lub wskazówki: [6, 32],[14, 26]

Można też ewentualnie określić, że odpowiedź wymaga wejścia być wzmocniony do 2 cyfr (zakładając, że ma strun), czyli: 06:32, 06, 32,[06, 32]

Można ewentualnie również w odwrotnej kolejności z wejść przy minutę i godziny, to znaczy: 32:6, 32, 6,[26, 14]

Godzina będzie liczbą całkowitą pomiędzy 0i 23(włącznie) Minuta będzie wartością całkowitą pomiędzy 0i 59(włącznie)

Możesz założyć, że wskazówka minutowa przeskakuje co 6 stopni wzdłuż twarzy (jedna równa pozycja dla każdej wartości minutowej)
Możesz założyć, że wskazówka godzinowa zaskoczy co 0,5 stopnia wzdłuż twarzy (jedna równomiernie ustawiona pozycja dla twarzy wartość każdej minuty na godzinę)

Dane wyjściowe należy podawać w stopniach, a nie w radianach. Możesz podać końcowe .0liczby całkowite

Punktacja

To jest więc wygrywa najmniej bajtów w każdym języku !

Przypadki testowe

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
źródło
Piaskownica
Skidsdev
2
@FryAmTheEggman „Dane wyjściowe muszą być podawane w stopniach, a nie w radianach”, więc nie sądzę
Theo
1
zapomniałem, że o 5:59 godzina jest prawie o 6
aaaaa mówi o przywróceniu Moniki
4
Sugerowany przypadek testowy: 00:59 -> 35.5(mała wartość przy dużej wartości m może spowodować, że niektóre implementacje zakończą się niepowodzeniem). hm
Arnauld
1
Dzięki, @Arnauld, właśnie mnie kosztowałeś bajt! : p
Shaggy

Odpowiedzi:

14

JavaScript (ES6),  41 40  39 bajtów

Przyjmuje dane wejściowe jako (h)(m).

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

Wypróbuj online!

W jaki sposób?

Zamiast pracować bezpośrednio w zakresie [0..360] , definiujemy zmienną tymczasową x w zakresie [0..4] :

x=|4h12+4m60×12-4m60|mod4
x=|4h12-44m60×12|mod4
x=|h3)-11m180|mod4

Kąt w stopniach podaje:

min(4-x,x)×90

Jednak formuła jest zaimplementowana nieco inaczej w kodzie JS, ponieważ zdecydowanie chcemy uniknąć używania długich Math.abs()i Math.min().

Zamiast obliczać wartość bezwzględną, wymuszamy wartość dodatnią w [0..12] , obliczając:

x=4+h3)-11m180

I zamiast obliczać minimum, określamy, w którym przypadku robimy po prostu bitowe AND z 2) - i dlatego właśnie wybraliśmy przedział ograniczony siłą 2) .

Arnauld
źródło
5

Galaretka , 14 12 bajtów

ד<¿‘Iæ%Ø°AH

Wypróbuj online!

Monadyczny link, który zajmuje czas jako listę dwóch liczb całkowitych: godzina, minuta.

Dzięki @JonathanAllan za zapisanie 2 bajtów!

Wyjaśnienie

ד<¿‘        | 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
Nick Kennedy
źródło
Symetryczny mod? Jak to działa?
Kudłaty
@Shaggy Bardzo wygodnie, zwraca wartość w interwale, (-180, 180]która jest równoważna (mod 360). Te wbudowane ...
Neil
1
Zaoszczędź dwa bajty, pracując w pół stopniach, używając Ø°for 360i “<¿‘for 60,11. Tak jak ד<¿‘Iæ%Ø°AH TIO
Jonathan Allan
Chciałem powiedzieć 12 znaków , ale okazuje się, że Windows-1252 (i kilka innych kodowań) może faktycznie zakodować to w 12 bajtach. Pomiędzy różnymi znakami spoza ASCII, nie sądziłem, że jedno kodowanie inne niż Unicode obejmie je wszystkie, ale najwyraźniej bardzo się mylę.
Thanatos
@Thanatos Niektóre języki specjalizujące się w grze w golfa kodowego mają własne strony kodowe dla 256 znaków, które kodują w 1 bajcie każdy. Galaretka jest jedną z nich, z tą niestandardową stroną kodową . 05AB1E, Charcoal, MathGolf, Stax itp. To inne języki z niestandardowymi stronami kodowymi. Większość z nich rzeczywiście oparta jest na systemie Windows-1252. :)
Kevin Cruijssen
4

MATL, 18 bajtów

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

Akceptuje dwa wejścia godzin, a następnie minuty. Używa tej samej metody co ta odpowiedź

Wypróbuj w MATL Online

Wyjaśnienie

      % 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
źródło
Czy to nie zawiedzie na północ, generując 180zamiast 0?
Kudłaty
4

Wolfram Language (Mathematica) , 30 29 28 bajtów

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

Wypróbuj online!

wersja bez golfa:

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

Argument funkcji # = {h,m}zawiera godzinę i minutę. Ta długość dwóch lista jest interpretowany jako nosiciela i kropka produktem z {30,-5.5}oblicza: #.{30,-5.5} = 30*h-5.5*m. Następnie obliczamy moduł symetryczny 360 z Mod[#.{30,-5.5}, 360, -180]podaniem kąta w przedziale -180 .. + 180. Absprzyjmuje jego wartość bezwzględną.

Ponieważ wszyscy zaangażowani operatorzy są liniowi, możemy pomnożyć i podzielić wszystkie pojawiające się liczby, jednak są one najwygodniejsze. Wyciągając czynnik z 5wyrażenia i dzieląc wszystkie liczby w wyrażeniu przez 5, liczba bajtów jest minimalizowana.

rzymski
źródło
3

Alchemik , 134 bajty

_->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

Wypróbuj online!

Wyjaśnienie

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

Początkowe ustawienia. Wprowadza godziny i minuty do horaz m, ustawia bieżący kąt dna 360 stopni (720 pół stopnia), ustawia aobliczanie kąta głównego i ustawia flagę wyjściową.

h->60d
m+11d->

Każda godzina dodaje 30 stopni, a każda minuta odejmuje 5,5 stopnia.

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

Chociaż rflaga (rewers) nie jest ustawiona, każdy datom powinien przenieść jeden aatom do b. Dzieje się tak po wyczerpaniu minut, aby uniknąć „warunków wyścigu”. Gdy nie ma już aatomów, ustaw rodwrócenie tego przepływu.

Pamiętaj, że ta druga reguła może być wyzwalana wiele razy, a nawet może zostać uruchomiona przed regułą konfiguracji początkowej. Nic to nie szkodzi, więc nie trzeba temu zapobiegać. 0xStan obsługi przez przypadek kant: gdy wejście jest 6:00, nie ma aatomów chwili gdy koniec zakończony program, ale są xatomy jeśli wynik końcowy jest co najmniej jeden stopień.

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

Odwrotna sytuacja: gdy podpisany kąt jest większy niż 180 stopni, przesuń batomy, aaby zmniejszyć kąt wyjściowy. Przestań cofać, gdy kąt osiągnie „360”.

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

Kiedy wszystkie atomy stopnia zostaną zużyte, podziel przez 2, aby uzyskać kąt wyjściowy.

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

Po wykonaniu tej czynności wypisuj dane dokładnie raz, używając fflagi z początkowej konfiguracji.

Nitrodon
źródło
3

Python 3.8 (wersja wstępna) , 45 43 bajtów

-2 bajty dzięki Erikowi .

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

Wypróbuj online!

h%12- godzina w formacie 12-godzinnym
h%12*30- kąt wskazówki godzinowej o pełnej godzinie
m/2- kąt przesunięcia wskazówki godzinowej w mminutach
h%12*30+m/2- aktualna pozycja wskazówki godzinowej jako kąt
m*6- kąt wskazówki minutowej ( 360°/60 = 6°)

ovs
źródło
2

Węgiel drzewny , 22 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane wejściowe jako dwie liczby całkowite. Wyjaśnienie:

             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
Neil
źródło
2

Perl 6 , 28 bajtów

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

Wypróbuj online!

Wykorzystuje kilka sztuczek skradzionych z innych odpowiedzi i oblicza

r = abs((h/3 - m/9*0.55 + 2) % 4 - 2) * 90
  = abs((h*30 - m*5.5 + 180) % 360 - 180)
nwellnhof
źródło
2

Python 3 , 40 bajtów

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

Wypróbuj online!

h*30- kąt między południem a godziną, w hktórej jest minuta 0; jeśli godzina jest równa lub większa niż 12, kąt ten może być równy lub większy niż 360 °
m*6- kąt między południem a minutową wskazówką
m*.5- kąt, w którym wskazówka godzinowa przesunęła się do przodu od pełnej godziny po mminutach (np. jeśli jest 4:24, wskazówka godzinowa przesunęła się o 12 stopni do przodu od pozycji, w której znajdowała się o godzinie 4)
h*30-m*5.5- jeden z dwóch kątów między wskazówką godzinową a wskazówką minutową; współczynnik dla mIs 5.5, BO m*6-m*.5=m*5.5; to wciąż nie jest odpowiedź, ponieważ może to być wartość większa niż 360 ° (np .: if h,m=13,0) lub mniejsza niż 0 ° (np: if h,m=12,30)
(h*30-m*5.5)%360- ten moduł uwzględnia przypadki, w których powyższa obliczona wartość nie mieści się w przedziale od 0 do 360 °; to wciąż nie jest odpowiedź, ponieważ może to być wzmacniacz dwóch kątów, a my chcemy jak najściślej
180-abs(180-(h*30-m*5.5)%360)- to jest wynik końcowy; ogólna zasada jest x-abs(x-y)równoważna min(y,x-y), co dałoby prawidłowy wynik

MarcusWolf
źródło
2

Tcl , 71 74 59 54 bajtów

{{h m {x (60*$h-$m*11)%720}} {expr min($x,720-$x)/2.}}

Wypróbuj online!

zapisano 5 bajtów za pomocą wyrażenia lambda

SmileAndNod
źródło
1

Python 3, 58 57 bajtów

-1 / -2 Dzięki @Shaggy

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

Naiwne wdrożenie przyjmuje dane w formie [6,32]. Niektóre bajty można prawdopodobnie szczególnie zgolić z ostatniej linii.

Python 2, 52 50 bajtów

h,m=input()
x=(30*h-5.5*m)
print abs(min(x,360-x))
Theo
źródło
30*h-5.5*mpowinien zaoszczędzić kilka bajtów.
Kudłaty
1
Funkcja defstylu powinna również zapisać niektóre bajty.
negatywne siedem
@negativeseven od sformułowania wyzwania wydawało się, że powinien on używać stdin / stdout
Theo
Możesz upuścić nawiasy w drugiej linii.
Kudłaty
Rozwiązania faktycznie wymagają kilku modyfikacji (Python 2), aby działać poprawnie. Wynik powinien być mniejszy lub równy 180, a większy lub równy 0.
Erik the Outgolfer
1

Perl 5 -MList::Util=min -p , 37 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako godziny, a następnie minuty w osobnym wierszu, ponieważ zapisał kilka bajtów.

Xcali
źródło
DOBRZE. Naprawiono to.
Xcali
1

[R], 45 bajtów

 function(h,m)min(t=(60*h+m)*5.5%%360,-t%%360)
Zahiro Mor
źródło
1

Japt , 16 bajtów

*FÑ aV*5½
mUa360

Spróbuj

*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
Kudłaty
źródło
0

> <> , 17 bajtów

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

Wypróbuj online! (6:32)

Pobiera dane wejściowe jako stos h, m na stosie.

Wyjaśnienie

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
źródło
0

05AB1E , 16 bajtów

60*+5.5*D(‚360%ß

Zajmuje godziny jako pierwsze wejście, minuty jako drugie.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

Zasadniczo implementuje następującą formułę:

t=(60h+m)×5.5
r=mjan(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)
Kevin Cruijssen
źródło
0

Pyret, 59 bajtów

{(h,m):x=(30 * h) - (m * 5.5)
num-abs(num-min(x,360 - x))}
MLavrentyev
źródło