Analog ist stumpf!


23

Eine analoge Uhr hat 2 Zeiger *: Stunde und Minute.
Diese Zeiger kreisen mit der Zeit um das Zifferblatt der Uhr. Jede volle Umdrehung des Minutenzeigers ergibt 1/12 einer Umdrehung des Stundenzeigers. 2 volle Umdrehungen des Stundenzeigers bedeuten einen vollen Tag.

Da diese Zeiger auf demselben Mittelpunkt fixiert sind und sich um diesen Punkt drehen, können Sie immer den Winkel zwischen den Zeigern berechnen. Tatsächlich gibt es zu jeder Zeit zwei Winkel; Ein größeres und ein kleineres (manchmal sind beide gleich 180, aber das ist nicht wichtig)

* Unsere hypothetischen Uhren haben keine Sekundenzeiger

Aufgabe

Geben Sie bei einer Zeit im 24-Stunden-Format den kleineren Winkel zwischen den Zeigern in Grad aus. Wenn die Hände sind direkt einander gegenüber (wie bei 6:00, 18:00etc) -Ausgang 180

Regeln

Eingabe kann entnommen werden , wie: - Ein Trennzeichen getrennt string: 6:32, 14.26 - 2 separate Werte, Strings oder ints: 6, 32, 14, 26 - Eine Reihe von 2 - Werte, Strings oder ints: [6, 32],[14, 26]

Sie können optional auch festlegen , dass Ihre Antwort erfordert Eingaben 2 Stellen gepolstert sein (vorausgesetzt , Sie Strings nehmen), das heißt: 06:32, 06, 32,[06, 32]

Sie können auch die Reihenfolge der Eingänge optional umgekehrt, wobei Minute dann Stunde, das heißt: 32:6, 32, 6,[26, 14]

Stunde ist ein ganzzahliger Wert zwischen 0und 23(einschließlich) Minute ist ein ganzzahliger Wert zwischen 0und 59(einschließlich)

Sie können davon ausgehen, dass der Minutenzeiger in Schritten von 6 Grad entlang des Gesichts einrastet (eine Position mit gleichmäßigem Abstand für jeden Minutenwert).
Sie können davon ausgehen, dass der Stundenzeiger in Schritten von 0,5 Grad entlang des Gesichts einrastet (eine Position mit gleichmäßigem Abstand für jeder Minutenwert pro Stundenwert)

Die Ausgabe muss in Grad erfolgen, nicht im Bogenmaß. Sie können ein Trailing .0für ganze Zahlen einfügen

Wertung

Dies ist so dass die wenigsten Bytes in jeder Sprache gewinnen!

Testfälle

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 "Die Ausgabe muss in Grad angegeben werden, nicht im Bogenmaß", also würde ich nicht raten
Theo


4
Vorgeschlagener Testfall: 00:59 -> 35.5(Ein kleiner Wert von mit einem großen Wert von führt wahrscheinlich dazu, dass einige Implementierungen fehlschlagen.) mhm
Arnauld

1
Danke, @Arnauld, du hast mich nur ein Byte gekostet! : p
Shaggy

Antworten:


14

JavaScript (ES6),  41 40  39 Byte

Übernimmt Eingaben als (h)(m).

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

Probieren Sie es online!

Wie?

Anstatt direkt im Bereich [0..360] , definieren wir eine temporäre Variable x im Bereich [0..4] :

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

Der Winkel in Grad ist gegeben durch:

Mindest(4-x,x)×90

Allerdings ist die Formel im JS-Code etwas anders implementiert, da wir auf jeden Fall auf die Verwendung des langwierigen Math.abs()und verzichten möchten Math.min().

Anstatt den absoluten Wert zu berechnen, erzwingen wir einen positiven Wert in [0..12] durch Berechnen von:

x=4+h3-11m180

Und anstatt das Minimum zu berechnen, bestimmen wir, in welchem ​​Fall wir es sind, indem wir einfach ein bitweises UND mit 2 - und deshalb haben wir zunächst ein Intervall gewählt, das durch eine Potenz von 2 begrenzt ist .


5

Jelly , 14 12 Bytes

ד<¿‘Iæ%Ø°AH

Probieren Sie es online!

Ein monadischer Link, der die Zeit als Liste von zwei Ganzzahlen aufnimmt: Stunde, Minute.

Vielen Dank an @ JonathanAllan für das Speichern von 2 Bytes!

Erläuterung

ד<¿‘        | 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

Symmetrischer Mod? Wie funktioniert das
Shaggy

@Shaggy Sehr bequem, es gibt den Wert in Intervallen zurück (-180, 180], die äquivalent sind (mod 360). Diese eingebauten ...
Neil

1
Sparen Sie zwei Bytes, indem Sie in halben Graden mit Ø°for 360und “<¿‘for arbeiten 60,11. Wie so ד<¿‘Iæ%Ø°AH TIO
Jonathan Allan

Ich wollte 12 Zeichen sagen , aber es stellte sich heraus, dass Windows-1252 (und einige andere Kodierungen) dies tatsächlich in 12 Bytes kodieren kann. Zwischen den verschiedenen Nicht-ASCII-Zeichen hätte ich nicht gedacht, dass eine einzige Nicht-Unicode-Codierung sie alle abdecken würde, aber anscheinend irre ich mich dort sehr.
Thanatos

@Thanatos Einige auf Code-Golf spezialisierte Sprachen haben ihre eigenen Codeseiten für die 256 Zeichen, die sie jeweils in 1 Byte codieren. Jelly ist einer von ihnen, mit dieser benutzerdefinierten Codepage . 05AB1E, Charcoal, MathGolf, Stax usw. sind andere Sprachen mit benutzerdefinierten Codeseiten. Die meisten basieren allerdings auf Windows-1252. :)
Kevin Cruijssen

4

MATL, 18 Bytes

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

Akzeptiert zwei Eingaben von Stunden, gefolgt von Minuten. Verwendet die gleiche Methode wie diese Antwort

Probieren Sie es bei MATL Online aus

Erläuterung

      % 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

Schlägt dies nicht um Mitternacht fehl und wird 180stattdessen ausgegeben 0?
Shaggy

4

Wolfram Language (Mathematica) , 30 29 28 Bytes

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

Probieren Sie es online!

ungolfed version:

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

Das Argument der Funktion # = {h,m}enthält die Stunde und die Minute. Diese Länge-zwei - Liste wird als Vektor und das Punktprodukt interpretiert mit {30,-5.5}berechnet wird : #.{30,-5.5} = 30*h-5.5*m. Dann berechnen wir den Symmetriemodul von 360 unter Mod[#.{30,-5.5}, 360, -180]Angabe eines Winkels im Intervall -180 .. + 180. Absnimmt den absoluten Wert davon.

Da alle beteiligten Operatoren linear sind, können wir alle auftretenden Zahlen multiplizieren und dividieren, wie auch immer dies am bequemsten ist. Durch Herausziehen eines Faktors 5aus dem Ausdruck und Teilen aller Zahlen im Ausdruck durch 5 wird die Anzahl der Bytes minimiert.


3

Alchemist , 134 Bytes

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

Probieren Sie es online!

Erläuterung

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

Ersteinrichtung. Gibt Stunden und Minuten in hund ein m, setzt den aktuellen Winkel dauf 360 Grad (720 halbe Grad), richtet die aBerechnung des Hauptwinkels ein und setzt das Ausgabe-Flag.

h->60d
m+11d->

Jede Stunde addiert 30 Grad und jede Minute subtrahiert 5,5 Grad.

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

Solange das r(Reverse-) Flag nicht gesetzt ist, sollte jedes dAtom um ein aAtom verschoben werden b. Dies geschieht, nachdem alle Minuten aufgebraucht sind, um eine "Rennbedingung" zu vermeiden. Wenn keine aAtome mehr vorhanden sind, stellen Sie rdiesen Fluss um.

Beachten Sie, dass diese zweite Regel mehrere Male und sogar vor der anfänglichen Setup-Regel ausgelöst werden kann. Dies schadet nichts und muss nicht verhindert werden. Die 0xBedingung behandelt einen Kantenfall: Wenn die Eingabe 6:00 ist, gibt es keine aAtome, wenn das Programm beendet wird, aber xAtome, wenn das Endergebnis mindestens 1 Grad beträgt.

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

Umgekehrt: Wenn der Winkel mit Vorzeichen größer als 180 Grad ist, bewegen Sie die bAtome nach a, um den Winkel für die Ausgabe zu verringern. Stoppen Sie die Rückwärtsfahrt, wenn der Winkel "360" erreicht.

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

Wenn alle Gradatome aufgebraucht sind, dividieren Sie durch 2, um den Winkel für die Ausgabe zu erhalten.

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

Geben Sie danach genau einmal mit dem fFlag aus der Ersteinrichtung aus.


3

Python 3.8 (Vorabversion) , 45 43 Byte

-2 Bytes dank Erik .

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

Probieren Sie es online!

h%12- Stunde im 12-Stunden-Format
h%12*30- Winkel des Stundenzeigers zur vollen Stunde
m/2- Winkel des Stundenzeigers in mMinuten
h%12*30+m/2- aktuelle Position des Stundenzeigers als Winkel
m*6- Winkel des Minutenzeigers ( 360°/60 = 6°)




2

Holzkohle , 22 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Nimmt die Eingabe als zwei Ganzzahlen. Erläuterung:

             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 Bytes

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

Probieren Sie es online!

Verwendet ein paar Tricks, die aus anderen Antworten gestohlen und berechnet wurden

r = abs((h/3 - m/9*0.55 + 2) % 4 - 2) * 90
  = abs((h*30 - m*5.5 + 180) % 360 - 180)

2

Python 3 , 40 Bytes

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

Probieren Sie es online!

h*30- Winkel zwischen Mittag und Stunde, hwenn die Minute ist 0; Wenn die Stunde gleich oder größer als 12 ist, kann dieser Winkel gleich oder größer als 360 ° sein
m*6- Winkel zwischen Mittag und dem Minutenzeiger
m*.5- Winkel, den der Stundenzeiger von der vollen Stunde nach mMinuten vorwärts bewegt hat (z. B .: Wenn es 4:24 ist, der Stundenzeiger bewegte sich 12 Grad vorwärts von der Position, in der er sich um 4 Uhr befand)
h*30-m*5.5- einer der beiden Winkel zwischen dem Stundenzeiger und dem Minutenzeiger; der Koeffizient für mist 5.5weil m*6-m*.5=m*5.5; Dies ist immer noch nicht die Antwort, da es sich um einen Wert handeln kann, der größer als 360 ° (zB: if h,m=13,0) oder kleiner als 0 ° (zB: if h,m=12,30) ist.
(h*30-m*5.5)%360- Dieses Modulo berücksichtigt die Fälle, in denen der oben berechnete Wert nicht zwischen 0 und 360 ° liegt. Dies ist immer noch nicht die Antwort, da es der Verstärker der beiden Winkel sein könnte, während wir den engsten wollen
180-abs(180-(h*30-m*5.5)%360)- dies ist das Endergebnis; die allgemeine Regel ist, dass x-abs(x-y)äquivalent ist min(y,x-y), was das richtige Ergebnis ergeben würde



1

Python 3, 58 57 Bytes

-1 / -2 Danke an @Shaggy

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

Naive Implementierung, Eingabe in Form von [6,32]. Einige Bytes können wahrscheinlich speziell von der letzten Zeile entfernt werden.

Python 2, 52 50 Bytes

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

30*h-5.5*msollten Sie ein paar Bytes sparen.
Shaggy

1
Eine def-Style-Funktion sollte auch einige Bytes speichern.
negative sieben

@negativeseven von der Herausforderung Formulierung schien es, als sollte es stdin / stdout verwenden
Theo

Sie können die Klammern in der 2. Zeile ablegen.
Shaggy

Die Lösungen benötigen tatsächlich ein paar Modifikationen (Python 2), um korrekt zu funktionieren. Das Ergebnis sollte kleiner oder gleich 180 und größer oder gleich 0 sein.
Erik the Outgolfer

1

Perl 5 -MList::Util=min -p , 37 Bytes

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

Probieren Sie es online!

Nimmt Eingaben als Stunden gefolgt von Minuten in einer separaten Zeile entgegen, da einige Bytes gespart wurden.


OKAY. Das wurde behoben.
Xcali


1

Japt , 16 Bytes

*FÑ aV*5½
mUa360

Versuch es

*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 Bytes

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

Probieren Sie es online! (6:32)

Übernimmt die Eingabe als h, m auf dem Stapel.

Erläuterung

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 Bytes

60*+5.5*D(‚360%ß

Nimmt Stunden als erste Eingabe, Minuten als zweite.

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

Implementiert grundsätzlich die folgende Formel:

t=(60h+m)×5.5
r=michn(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 Bytes

{(h,m):x=(30 * h) - (m * 5.5)
num-abs(num-min(x,360 - x))}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.