Herausforderung
Geben Sie nach Mitternacht den kleinsten Winkel zwischen zwei Zeigern auf einem Zifferblatt aus, und verwenden Sie dabei so wenige Bytes wie möglich.
Sie können davon ausgehen, dass die Anzahl der Sekunden immer kleiner als 86400 ist. Winkel können in Grad oder Bogenmaß angegeben werden.
Eine Referenzlösung finden Sie unter: http://ideone.com/eVdgC0
Testfälle (Ergebnisse in Grad)
0 -> 0
60 -> 0.5
600 -> 5
3600 -> 0
5400 -> 45
6930 -> 84.75
50000 -> 63.333
Klarstellungen
- Die Uhr hat 3 Zeiger: Stunden, Minuten und Sekunden.
- Alle Zeiger bewegen sich kontinuierlich, so dass Stunden- und Minutenzeiger zwischen den Teilstrichen auf dem Zifferblatt zu finden sind.
Antworten:
CJam,
3635343230 BytesDie Ausgabe erfolgt im Bogenmaß. Ich habe die Lösungen für alle 86400 möglichen Eingaben überprüft.
Probieren Sie es online im CJam-Interpreter aus .
Idee
Da 2π Radiant eine volle Runde ist, ist jedes Minuten / Sekunden-Intervall auf der Uhr 2π / 60 = π / 30 Radiant breit.
Teilen Sie also die Anzahl der Sekunden durch π / 30 Position des Sekundenzeigers.
Der Minutenzeiger bewegt sich um ein Sechzigstel der Geschwindigkeit des Sekundenzeigers. Wenn Sie also das Ergebnis von oben durch 60 dividieren, erhalten Sie die Position des Minutenzeigers.
Ebenso ergibt die Division des letzten Ergebnisses durch 12 die Position des Stundenzeigers.
Beachten Sie, dass unsere drei Quotienten von oben nicht unbedingt im Bereich liegen [0,2π] liegt.
Durch Berechnung aller neun möglichen Unterschiede der Zeigerwinkel erhalten wir drei 0 ‚s (Winkelabstand zwischen einer Hand und selbst) und den sechs Abstände zwischen den verschiedenen Händen.
Wenn sich die nächsten Hände auf einer Hälfte befinden, die 12 nicht enthält , ist einer der Unterschiede von oben die gewünschte Ausgabe (mod 2π ).
Um 01:55:30 (zum Beispiel) befindet sich der Stundenzeiger jedoch in einem Winkel von 1,008 rad (57,75 Grad) und der Minutenzeiger in einem Winkel von 5,812 rad (333,00 Grad) von 12 , was eine Differenz von 4,804 rad ergibt (275,25 Grad). Durch Subtrahieren dieses Ergebnisses von einer vollen Runde erhalten wir den "in der anderen Richtung" gemessenen Winkel, der 1,479 rad (84,75 rad) entspricht.
Anstatt nun jeden Winkel θ in [0,2π] abzubilden und das Ergebnis von π bedingt zu subtrahieren , können wir einfach Arccos (cos (θ)) berechnen , da cos sowohl periodisch als auch gerade ist und Arccos immer einen Wert in [ 0, π) .
Wenn Sie die drei kleinsten Ergebnisse (alle null) überspringen, ist das viertkleinste die gewünschte Ausgabe.
Code
Alternative Version (34 Byte)
Die Ausgabe erfolgt in Grad und es werden keine trigonometrischen Funktionen verwendet.
Probieren Sie es online im CJam-Interpreter aus .
quelle
Mathematica, 40 Bytes
Erläuterung: Geben Sie
t
die Anzahl der Sekunden seit Mitternacht an. Die Position jeder Hand istUm den absoluten Winkelabstand zwischen
x
Grad undy
Grad zu berechnen , können wiry - x
den Bereich um 360 modifizieren[-180, 180]
und dann den absoluten Wert nehmen. (Beachten Sie, dass es keine Beschränkungx
undy
.) Also diese Funktion nur die Unterschiede paarweise berechnett/10-t/120
,6t-t/10
und6t-t/120
und das tut.quelle
&
) und das erste Argument, das übergeben wird, wird als inside bezeichnet#
.Python, 65
Die zurückgelegte Entfernung in Stunden, Minuten und Sekunden in Einheiten von 1/60 des Kreises
h,m,s = n/720, n/60, n/1
. Wir können diese Mod 60 nehmen, um ihre Position im Kreis von0
bis zu erhalten60
.Wenn wir ihren Differenz-Mod 60 nehmen, erhalten wir die Anzahl der Einheiten, die einer vor dem anderen liegt. Wir nehmen alle sechs möglichen Differenzen, finden die min und multiplizieren dann mit
6
zu skalieren360
Grad .Das zweilagige Liste Verständnis wählt zuerst die erste Hand , wie durch dargestellt
720
,60
oder1
wählt dann die andere Hand aus diesem Satz aus, wobei die erste Auswahl über set xor entfernt wird.Ich habe dies ausführlich anhand des Referenzcodes getestet.
quelle
C #,
163152 BytesAuf diese Weise wird jede Hand zweimal erstellt, um für das Umwickeln zu zählen. Anschließend wird jede Kombination durchlaufen und der Mindestwinkel zwischen den Händen ermittelt. Berechnungen werden in 60 Divisionen durchgeführt und dann mit 6 multipliziert, um Grad zu erhalten.
Zur Verdeutlichung eingerückt:
Beispielausgabe:
quelle
TI-BASIC, 17 Bytes
Verwendet Dennis
arccos(cos(
, um Entfernungen zu normalisieren. Anstatt jedoch alle paarweisen Abstände zu berechnen, werden nur die drei benötigten berechnetΔList([seconds],[minutes],[hours],[seconds]
.Dieses Programm erwartet
Degree
Modus und gibt die Antwort in Grad zurück.EDIT:
5!
ist ein Byte kürzer als120
.quelle