Mein Wecker
Ich bin Amerikaner und mein (digitaler) Wecker auch. Um den Alarm einzustellen, startet er zu der Zeit, die er zuvor war. Durch Drücken der Stundentaste wird eine Stunde nach oben und durch Drücken der Minutentaste eine Minute nach oben verschoben. Wenn Sie beide Tasten gleichzeitig drücken, wird dies auf Mitternacht (00:00 Uhr) zurückgesetzt und als zwei Tastendrücke gezählt.
Wenn die Stunden ihre Obergrenze (12) überschreiten, wird sie auf 1 zurückgesetzt und das AM / PM-Licht wird umgeschaltet. Wenn die Minuten ihre Obergrenze (59) überschreiten, werden sie auf 0 zurückgesetzt, ohne die Stunden zu beeinflussen.
Die Aufgabe
Ihre Aufgabe ist es, anhand einer Startzeit und einer Zielzeit die optimale Anzahl von Tastendrücken auszugeben, die erforderlich sind, um meinen Alarm auf die Zielzeit einzustellen.
Sie können Eingaben in einem für Sie am besten geeigneten Format vornehmen. Die einzigen Daten, die Ihr Programm benötigen sollte, sind Stunden und Minuten für beide Eingaben. Das bedeutet, dass Sie zum Beispiel Daten seit der Epoche als Millisekunden annehmen und die Stunden und Minuten extrahieren, aber möglicherweise nichts in das Jahr, den Monat, die Sekunde usw. codieren "Militärzeit" (oder reguläre Zeit für den größten Teil der Welt), aber das ändert nichts an meiner Uhr.
Beispiele
1:15 pm -> 2:30 am
Sie können beide Tasten drücken, um auf 00:00 Uhr zurückzusetzen, und dann auf 02:30 Uhr erhöhen, was einem Drücken von 2+2+30 = 34
Tasten entspricht. Sie können auch auf 2:30 vormittags aufsteigen, was ein 13+15 = 28
Knopfdruck wäre . Daher ist Ihre Ausgabe 28
.
3:58 am -> 4:02 am
Sie könnten zurücksetzen und inkrementieren, was ein 2+4+2 = 8
Knopfdruck wäre . Sie könnten auch erhöhen, was ein 1+4 = 5
Knopfdruck wäre . Daher ist Ihre Ausgabe 5
.
10:55 pm -> 1:00 am
Sie könnten zurücksetzen und inkrementieren, was ein 2+1 = 3
Knopfdruck wäre . Sie könnten auch erhöhen, was ein 3+5=8
Knopfdruck wäre . Daher ist Ihre Ausgabe 3
.
1:00 am -> 1:59 pm
Sie könnten zurücksetzen und inkrementieren, aber das wären drei Druckvorgänge mehr als nur inkrementieren. Daher ist Ihre Ausgabe 12+59 =
71
.
Testfälle
Current Target = Output
1:15pm 2:30am = 28
3:58am 4:02am = 5
10:55pm 1:00am = 3
1:00am 1:59pm = 71
12:00am 12:00am = 0
6:51pm 12:00am = 2
2:01pm 11:00pm = 25
2:01pm 11:01pm = 9
12:59am 12:01am = 2
11:50am 12:00pm = 11
quelle
Antworten:
Schale , 16 Bytes
Probieren Sie es online!
Nimmt Argumente als zwei Listen [Stunden, Minuten] für Start- und Endzeit im 24-Stunden-Format.
Ich bin ziemlich glücklich darüber, wie viel Golf ich in diesem Fall spielen konnte. Ich finde es interessant, wie Argumente in dieser Zusammenstellung von Funktionen verwaltet werden.
Die Funktion, die berechnet, wie viele Tastendrücke erforderlich sind, wenn das Zurücksetzen nicht zulässig ist, lautet wie folgt:
Der interessante Teil ist, dass, da der Rest dieser Lösung nur mit einer einzigen Liste als Argument arbeiten kann, diese teilweise auf das erste Argument des gesamten Programms angewendet wird, es "frisst" und nur das zweite Argument sowohl für sich selbst als auch für sich selbst sichtbar bleibt der Rest des Programms.
Als nächstes berechnen wir, wie viele Tastendrücke wir benötigen, wenn wir die Zeit auf 0:00 zurücksetzen
Wie bereits erwähnt, wird dies nur für das zweite Argument (das letzte Mal) ausgeführt und
hours+minutes+2
nur auf eine golferischere Weise berechnet .Schließlich
§▼
ist dies der Teil, der das zweite Argument an beide Funktionen übergibt und das kleinere der beiden Ergebnisse zurückgibt.quelle
JavaScript (ES6),
7356545250 ByteVerwendet das 24-Stunden-Format. Nimmt die Eingabe als 4 Ganzzahlen, die die Stunden und Minuten jeder Zeit darstellen.
Versuch es
Geben Sie die Zeiten im 24-Stunden-Format mit dem
:
Trennzeichen ein.Erläuterung
(In Kürze zu aktualisieren.)
Anonyme Funktion der ganzen Zahlen als Argumente über die Parameter nehmen
g
,l
,h
&m
, wog
&l
sind jeweils die Stunden und Minuten der aktuellen Zeit undh
&m
sind die Stunden und Minuten von der Zielzeit.Zuerst berechnen wir, wie viele Tastendrücke erforderlich sind, wenn wir nur die Uhr zurücksetzen. Dies ist einfach 2 (für das Zurücksetzen) plus die Zielstunde und die Zielminute.
Als nächstes berechnen wir, wie viele Knopfdrücke erforderlich sind, um die Zielstunde zu erreichen. Dazu subtrahieren wir die aktuelle Stunde von der Zielstunde. Wenn die aktuelle Stunde jedoch kleiner als das Ziel ist, erhalten wir eine negative Zahl, sodass wir diese korrigieren, indem wir 24 multiplizieren, indem wir prüfen, ob
h<g
(was einen Booleschen Wert zurückgibt, aber implizit in eine Ganzzahl umgewandelt wird1
, wenn true oder0
wenn false vom mathematische Operationen.Wir verwenden eine ähnliche Formel, um die Anzahl der Druckvorgänge von der aktuellen Minute zur Zielminute zu berechnen und diese zu den Stundenpressen hinzuzufügen.
Schließlich erhalten wir das Minimum der 2 Zahlen, um unser Ergebnis zu erhalten.
quelle
(h-g+24)%24+(m-l+60)%60
?Pyth , 29 Bytes
Diese Herausforderung hat offensichtlich keinen Vorteil für die Golfsprachen, deshalb ist sie so lang. Andererseits wird dies durch die Tatsache verbessert, dass Python auf Python basiert, so dass wir dessen negativen Modul missbrauchen können.
Test Suite. Zahlen in Pyth unterstützen keine führenden Nullen.
quelle
Jelly , 19 Bytes
Probieren Sie es online!
Eingabe als 4 Ganzzahlen (Endstunde, Endminute, Startstunde, Startminute)
quelle
C # (.NET Core) , 56 Byte
Probieren Sie es online!
Sehr ähnlich der Javascript-Antwort. Bools in C # konvertieren nicht einfach in Zahlen. Stattdessen habe
[diff]+24*(H<h)
ich das getan,([diff]+24)%24
was effektiv dasselbe bewirkt.quelle
2+h+m
für -2 Bytes entfernen .(H,M,h,m)=>Math.Min((h+24-H)%24+(m+60-M%60),2+h+m)
System.Math.Min
?Haskell, 41 Bytes
Ziemlich einfach. Nimmt die Eingabe als vier Argumente unter Verwendung der 24-Stunden-Zeit auf: Endstunde, Endminute, Startstunde, Startminute.
quelle
Python 3 , 43 Bytes
Probieren Sie es online!
Eingabe als 4 Ganzzahlen (Startstunde, Startminute, Endstunde, Endminute)
quelle
2 01 11 00
? Wie bestimmen Sie in Ihrer Antwort, ob die Zeit gekommen istAM
oderPM
ob Sie dies nicht als Eingabe nehmen?13
für diesen Eingang den TIO, der korrekt ist (reset + 11 <9 + 59).%
in Python immer eine positive Zahl zurück?%
.1%24
=1
,1%-24
=-23
. Es ist sehr hilfreich für diese Frage.Java 8,
5450 BytesPort von @KamilDrakaris C # Antwort (nachdem ich
26 Bytes golfen habe ).Erläuterung:
Probieren Sie es hier aus.
quelle
Perl 5 , 71 + 2 (-ap) = 73 Bytes
Probieren Sie es online!
Nimmt Eingaben im 24-Stunden-Format (Militärzeit) vor, getrennt durch Leerzeichen, Startzeit zuerst, Endzeit zweitens: HH MM hh mm
quelle
Netzhaut , 106 Bytes
Probieren Sie es online! Link enthält Testfälle. Übernimmt die Eingabe als aktuelle und gewünschte Zeit in regulären 24 Stunden, wobei die beiden Zeiten durch ein Leerzeichen voneinander getrennt sind. Erläuterung:
In Unary konvertieren.
Dies macht zwei Dinge; Es addiert 24 Stunden und 60 Minuten zu den gewünschten Stunden und Minuten und 2 zu der Summe der ursprünglich gewünschten Stunden und Minuten, dh der Anzahl der Tastendrücke, die mit einem Reset eingestellt werden.
Subtrahieren Sie die aktuellen Stunden von den gewünschten Stunden und subtrahieren Sie die 24, die wir hinzugefügt haben, wenn wir können.
Ähnliches gilt für die Minuten. Dies addiert auch die beiden Ergebnisse.
Wenn die Anzahl der mit der aktuellen Zeit einzustellenden Pressen größer ist als die Anzahl der mit einem Reset einzustellenden Pressen, löschen Sie sie.
Wandle die erste verbleibende Zahl zurück in eine Dezimalzahl.
quelle