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:00
etc) -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 0
und 23
(einschließlich) Minute ist ein ganzzahliger Wert zwischen 0
und 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 .0
für ganze Zahlen einfügen
Wertung
Dies ist Codegolf, 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
00:59 -> 35.5
(Ein kleiner Wert von mit einem großen Wert von führt wahrscheinlich dazu, dass einige Implementierungen fehlschlagen.) mAntworten:
JavaScript (ES6),
41 4039 ByteÜbernimmt Eingaben als
(h)(m)
.Probieren Sie es online!
Wie?
Anstatt direkt im Bereich[ 0..360 ] , definieren wir eine temporäre Variable x im Bereich [ 0..4 ] :
Der Winkel in Grad ist gegeben durch:
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öchtenMath.min()
.Anstatt den absoluten Wert zu berechnen, erzwingen wir einen positiven Wert in[ 0..12 ] durch Berechnen von:
Und anstatt das Minimum zu berechnen, bestimmen wir, in welchem Fall wir es sind, indem wir einfach ein bitweises UND mit2 - und deshalb haben wir zunächst ein Intervall gewählt, das durch eine Potenz von 2 begrenzt ist .
quelle
Jelly ,
1412 BytesProbieren 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
quelle
(-180, 180]
, die äquivalent sind (mod 360). Diese eingebauten ...Ø°
for360
und“<¿‘
for arbeiten60,11
. Wie soד<¿‘Iæ%Ø°AH
TIOMATL, 18 Bytes
Akzeptiert zwei Eingaben von Stunden, gefolgt von Minuten. Verwendet die gleiche Methode wie diese Antwort
Probieren Sie es bei MATL Online aus
Erläuterung
quelle
180
stattdessen ausgegeben0
?Wolfram Language (Mathematica) ,
302928 BytesProbieren Sie es online!
ungolfed version:
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 unterMod[#.{30,-5.5}, 360, -180]
Angabe eines Winkels im Intervall -180 .. + 180.Abs
nimmt 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
5
aus dem Ausdruck und Teilen aller Zahlen im Ausdruck durch 5 wird die Anzahl der Bytes minimiert.quelle
Alchemist , 134 Bytes
Probieren Sie es online!
Erläuterung
Ersteinrichtung. Gibt Stunden und Minuten in
h
und einm
, setzt den aktuellen Winkeld
auf 360 Grad (720 halbe Grad), richtet diea
Berechnung des Hauptwinkels ein und setzt das Ausgabe-Flag.Jede Stunde addiert 30 Grad und jede Minute subtrahiert 5,5 Grad.
Solange das
r
(Reverse-) Flag nicht gesetzt ist, sollte jedesd
Atom um eina
Atom verschoben werdenb
. Dies geschieht, nachdem alle Minuten aufgebraucht sind, um eine "Rennbedingung" zu vermeiden. Wenn keinea
Atome mehr vorhanden sind, stellen Sier
diesen 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
0x
Bedingung behandelt einen Kantenfall: Wenn die Eingabe 6:00 ist, gibt es keinea
Atome, wenn das Programm beendet wird, aberx
Atome, wenn das Endergebnis mindestens 1 Grad beträgt.Umgekehrt: Wenn der Winkel mit Vorzeichen größer als 180 Grad ist, bewegen Sie die
b
Atome nacha
, um den Winkel für die Ausgabe zu verringern. Stoppen Sie die Rückwärtsfahrt, wenn der Winkel "360" erreicht.Wenn alle Gradatome aufgebraucht sind, dividieren Sie durch 2, um den Winkel für die Ausgabe zu erhalten.
Geben Sie danach genau einmal mit dem
f
Flag aus der Ersteinrichtung aus.quelle
Python 3.8 (Vorabversion) ,
4543 Byte-2 Bytes dank Erik .
Probieren Sie es online!
h%12
- Stunde im 12-Stunden-Formath%12*30
- Winkel des Stundenzeigers zur vollen Stundem/2
- Winkel des Stundenzeigers inm
Minutenh%12*30+m/2
- aktuelle Position des Stundenzeigers als Winkelm*6
- Winkel des Minutenzeigers (360°/60 = 6°
)quelle
Stax , 15 Bytes
Führen Sie es aus und debuggen Sie es
m =
Anzahl der Minuten seit Mitternachtd = 5.5 * m
min(d % 360, -d % 360)
.quelle
C # (Visual C # Interactive Compiler) ,
47 bis45 ByteProbieren Sie es online!
quelle
Holzkohle , 22 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Nimmt die Eingabe als zwei Ganzzahlen. Erläuterung:
quelle
Perl 6 , 28 Bytes
Probieren Sie es online!
Verwendet ein paar Tricks, die aus anderen Antworten gestohlen und berechnet wurden
quelle
Python 3 , 40 Bytes
Probieren Sie es online!
h*30
- Winkel zwischen Mittag und Stunde,h
wenn die Minute ist0
; Wenn die Stunde gleich oder größer als 12 ist, kann dieser Winkel gleich oder größer als 360 ° seinm*6
- Winkel zwischen Mittag und dem Minutenzeigerm*.5
- Winkel, den der Stundenzeiger von der vollen Stunde nachm
Minuten 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ürm
ist5.5
weilm*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: ifh,m=13,0
) oder kleiner als 0 ° (zB: ifh,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 wollen180-abs(180-(h*30-m*5.5)%360)
- dies ist das Endergebnis; die allgemeine Regel ist, dassx-abs(x-y)
äquivalent istmin(y,x-y)
, was das richtige Ergebnis ergeben würdequelle
Tcl ,
71745954 BytesProbieren Sie es online!
5 Bytes mit einem Lambda-Ausdruck gespart
quelle
Python 3,
5857 Bytes-1 / -2 Danke an @Shaggy
Naive Implementierung, Eingabe in Form von
[6,32]
. Einige Bytes können wahrscheinlich speziell von der letzten Zeile entfernt werden.Python 2,
5250 Bytesquelle
30*h-5.5*m
sollten Sie ein paar Bytes sparen.def
-Style-Funktion sollte auch einige Bytes speichern.Perl 5
-MList::Util=min -p
, 37 BytesProbieren Sie es online!
Nimmt Eingaben als Stunden gefolgt von Minuten in einer separaten Zeile entgegen, da einige Bytes gespart wurden.
quelle
[R] 45 Bytes
quelle
Japt , 16 Bytes
Versuch es
quelle
> <> , 17 Bytes
Probieren Sie es online! (6:32)
Übernimmt die Eingabe als h, m auf dem Stapel.
Erläuterung
quelle
05AB1E , 16 Bytes
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:
quelle
Pyret, 59 Bytes
quelle