Implementieren Sie eine einfache digitale Stoppuhr , die die verstrichene Zeit in Sekunden und Minuten anzeigt, wie unten beschrieben.
Wichtig
Bitte lesen Sie sowohl den Abschnitt Display als auch die Bedienelemente !
Anzeige
Die abgelaufene Zeit sollte im MM:SS
Format angezeigt werden, indem die zuvor angezeigte Zeitzeichenfolge "an Ort und Stelle" ersetzt wird (das Löschen des gesamten oder eines Teils des Bildschirms ist ebenfalls zulässig).
Die Stoppuhr muss mindestens jede Sekunde aktualisiert werden.
Beispiele:
0 Minuten, 0 Sekunden
00:00
0 Minuten, 33 Sekunden
00:33
1 Minute, 50 Sekunden
01:50
Anfänglich können Sie mit '00: 00 'oder einem anderen Wert im Bereich [00: 00-59: 59] beginnen.
Sobald Ihre Stoppuhr erreicht ist 59:59
, sollte sie auf zurückgesetzt werden 00:00
und von Neuem fortgesetzt werden.
Sie können eine andere Basis (anstelle der Dezimalzahl) oder sogar ein anderes Zahlensystem verwenden, sofern Sie dem allgemeinen Muster folgen.
Zum Beispiel 13:03
kann angezeigt werden als:
13:03
0D:03
N:D
10101:3
XIII:III
Beachten Sie, dass bei Verwendung eines nicht-dezimalen Zahlensystems / einer nicht-dezimalen Basis die Kodierung mit druckbaren ASCII- (oder Unicode-) Zeichen erfolgen muss, z. B. ist die Verwendung von zwei binären (nicht druckbaren) Bytes für Minuten und Sekunden nicht zulässig.
Sie müssen Ihre Ausgabe auch mit Nullen belassen, sofern Ihr numerisches System dies zulässt.
Das Ersetzen des Trennzeichens :
durch ein beliebiges anderes druckbares Zeichen (einschließlich Ziffern) ist ebenfalls zulässig.
Kontrollen
Die Stoppuhr sollte angehalten werden und in diesem Zustand bleiben, bis der Benutzer sie explizit durch Drücken der Steuertaste startet (siehe unten).
Wenn der Benutzer während des Zählens der Stoppuhr erneut die Steuertaste drückt , sollte die Stoppuhr pausieren (wobei die aktuelle Zeit beibehalten wird), bis die Steuertaste ein weiteres Mal gedrückt wird.
Die ‚Kontrolle‘ Schlüssel kann einen einzigen Tastendruck sein, zum Beispiel s
, oder eine beliebige Kombination von Tasten, zum Beispiel Ctrl+Shift+X
, aber es muss ‚atomic‘ Drücken mehrerer Tasten nacheinander sein, beispielsweise s
dann Enter
, wird nicht erlaubt .
Dieselbe 'Steuertaste' (oder Kombination) muss verwendet werden, um die Stoppuhr anzuhalten und fortzusetzen.
Sie müssen einen bestimmten 'Kontroll'- Schlüssel verwenden, dh' jeder Schlüssel 'ist nicht zulässig.
Alternativ können Sie einen einfachen oder doppelten Mausklick anstelle eines Tastendrucks für die 'Steuerung' verwenden.
Regeln
- Dies ist Code-Golf , die kürzeste Antwort in Bytes gewinnt;
- Es gelten die Standard-Code-Golf-Regelungslücken.
- Ihr Programm muss (theoretisch) für immer lauffähig sein.
quelle
00:05
Drucken etwa 7000 Millisekunden pausiert und dann zu einem bestimmten Zeitpunkt wieder aufnimmt, müssen dann00:06
3000 Millisekunden nach dem Drücken der Wiederaufnahmetaste angezeigt werden, oder ist es in Ordnung, sie eine volle Sekunde nach dem Drücken der Wiederaufnahmetaste zu drucken?Antworten:
SmileBASIC,
867771 BytesDIALOG
zeigt ein Textfeld auf dem Touchscreen an.N
Gibt die Anzahl der Sekunden an, die das Textfeld auf dem Bildschirm angezeigt wird, bevor es verschwindet. WennN
ja0
, bleibt es, bis der Benutzer die Taste auf dem Touchscreen drückt.DIALOG
Gibt zurück,1
ob der Benutzer die Schaltfläche gedrückt hat und0
ob sie automatisch geschlossen wurde. Wenn der Benutzer die Pause-Taste drückt, kehrt diese zurück1
und die Anzeigezeit wird auf eingestellt0
, wodurch die Stoppuhr angehalten wird. Nachdem der Benutzer die Taste erneut gedrückt hat, setzen wir die Anzeigezeit auf zurück1
und setzen den Timer fort. Grundsätzlich wird bei jederDIALOG
Rückkehr1
die Anzeigezeit zwischen1
und0
using umgeschaltet!=
, was für ein logisches XOR von Bedeutung ist, solange beide Eingänge 1 oder 0 sind.quelle
Python 2,
167129 Bytes-36 Bytes meistens * von Maltysens Idee ,
ctrl-c
mit einer Ausnahme zu fangen - geben Sie Kredit!-4 Bytes dank DLosc (init
n
undb
stattdessen auf 0f()
)-1 Bytes dank FlipTack (
p^=1
stattdessen verwendenp=1-p
)-2 Bytes dank Felipe Nardi Batista (Genauigkeitsangaben entfernen)
Funktioniert genauso wie mein Original, nur mit der Steuertastenfolge von
ctrl+c
.(Getestet von mir mit Python 2.7.8 unter Windows 7, 64bit;
Getestet von Brian Minton mit Python 2.7.13 unter Linux, 64bit)
* auch reduzierte
if
Aussage zu einer Listensuche, um dietry
als Einzeiler zu bekommen .Mein Original:
(Getestet von mir mit Python 2.7.8 unter Windows 7, 64-Bit - dieser Code ist jedoch Windows-spezifisch, da die
msvcrt
Bibliothek verwendet wird.)Die Steuertaste ist 'p'.
n
undb
werden beim Start auf den gleichen Wert initialisiert, was einen "Offset" von 0 ergibt;p
wird auf 0 initialisiert, was einen angehaltenen Zustand anzeigt.Bei jedem Drücken der Steuertaste wird der Wert von
p
umgeschaltet. Beim Umschalten von einem angehaltenen Zustand in einen aktiven Zustandb
wird mit ein neuer Wert unter Beibehaltung des aktuellen Offsets von dem vorherigen aktiven Zustand (den vorherigen aktiven Zuständen) aktualisiertb-n
.Während eines aktiven Zustands
n
wird durch Aufruf immer wieder die aktuelle Uhrzeit aktualisierttime.time()
.Die Differenz zwischen
n
undb
,t
ist dann die Gesamtanzahl von Sekunden (einschließlich eines Bruchteils), die während eines aktiven Zustands bzw. aktiver Zustände verstrichen sind.Die abgelaufenen Minuten sind dann
t/60
und jede der Minuten und Sekunden wird mit mod 60 angezeigt(t/60%60,t%60)
. Führenden Nullen werden jeweils vorangestellt, indem die Zeichenfolge des ganzzahligen Teils mit formatiert wird'...%0.2d...'
. Durch das Drucken eines Tupels (das nachfolgende,
), bei dem das erste Element einen führenden Wagenrücklauf (das\r
) aufweist, wird der zuvor gedruckte Text überschrieben.quelle
^=
doch irgendwann während der Formulierung umgestellt..
in%0.2d
? Es funktioniert gut als%02d
Python -
160159143 BytesVielen Dank an @ JonathanAllan für die Rettung von 18 Bytes!
Verwendet nur eingebaute Bibliotheken, daher ist der Steuerschlüssel
ctrl-c
, der mit einem abfängtexcept keyboardInterrupt
.quelle
except:
? Ich habe eine funktionierende Version von mir dabei ...Bash + Unix-Dienstprogramme, 90 oder 93 Bytes
90-Byte-Version:
93-Byte-Version:
Strg-C ist das Resume / Pause-Zeichen. Ein Leerzeichen ist das Trennzeichen zwischen Minuten und Sekunden.
Der Unterschied zwischen den beiden Versionen besteht darin, dass das 90-Byte-Programm 2 ^ 63 Sekunden lang funktioniert (an diesem Punkt gibt mir bash einen Ganzzahlüberlauf).
Die 93-Byte-Version wird wirklich für immer funktionieren.
Das ursprüngliche Problem beinhaltete die Anforderung: "Ihr Programm muss (theoretisch) für immer lauffähig sein."
Wenn eine Laufzeit von 2 ^ 63 Sekunden ausreicht, um diese Anforderung zu erfüllen, funktioniert die 90-Byte-Lösung. Diese Dauer ist mehr als das 20-fache des Zeitalters des Universums!
Wenn das Programm länger ausgeführt werden soll, muss ich mich für die 93-Byte-Lösung entscheiden.
Ich sollte wahrscheinlich darauf hinweisen, dass diese Lösung, wie zumindest einige der anderen, sehr langsam hinter der tatsächlich verstrichenen Zeit zurückbleiben wird. Diese Abweichung ist darauf zurückzuführen, dass das Programm zwischen jeder Ausführung des Schleifenkörpers eine Sekunde lang schläft, die Ausführung des Schleifenkörpers jedoch eine winzige Zeit in Anspruch nimmt. Dies ist in der Praxis ohne Belang.
quelle
Initially, you can start with '00:00' or with any other value in range [00:00-59:59]
, der auf dem Bildschirm angezeigt wird, bis Sie zum ersten Mal auf "Steuerung" drücken. Entschuldigung, wenn ich das nicht klar genug formulieren konnte!QBasic,
213211 BytesSteuertaste ist die Registerkarte. Wenn Sie dieses Programm nicht verwenden, kann dies zu Bränden am Laptop führen. Du wurdest gewarnt.
Hier ist es in Aktion und pausiert nach 10, 15 und 20 Sekunden:
Ungolfed und kommentiert
Beachten Sie, dass die Werte von
TIMER
Gleitkomma sind. Dies hat keine Auswirkungen auf die Ausgabe, daMOD
und\
auf ganze Zahlen abgeschnitten. Dies erhöht jedoch die Genauigkeit der gespeicherten Zeit: Wenn Sie den Timer kurz vor einem Häkchen anhalten, werden Sie beim nächsten Start feststellen, dass sich die Zahl in weniger als einer Sekunde ändert.quelle
Batch, 132 Bytes
Durch Drücken von
n
(un) wird der Timer angehalten. Das Ausgabeflackern kann auf Kosten von drei (oder vier) Bytes reduziert werden.quelle
Pure Bash, 141 Bytes
Hierfür werden nur Bash-Builtins verwendet (keine externen Tools). Das Steuerzeichen ist Ctrl-Z, so dass die Standardbehandlung
SIGTSTP
die Stoppuhr anhält.set -m
Aktiviert die Auftragssteuerung , die normalerweise in einem Skript deaktiviert ist.&
) .read -t 1
Wartet eine Sekunde auf Eingaben des Benutzers und schlägt dann fehl.until
Schleife wird so lange fortgesetzt, wie einread
Fehler auftritt.printf
gibt die korrekt aufgefüllte und formatierte Zeit aus$[s=s>3598?0:s+1,s/60]
Die arithmetische Erweiterung berechnet zuerst die aktualisierte Zeit, prüft, ob der Sekundenzähler umgebrochen und auf andere Weise inkrementiert werden solls
, und gibt dann die geschossige Division zurücks/60
.$[s%60]
gibt den Sekundenrest.trap
Handler ein, für denTSTP
das Signal Ctrl-Zgeneriert wird. Wenn Ctrl-Zgedrückt wird, während das äußere Skript ausgeführt wird, wird es ausgeführtfg>/dev/null
und die Subshell wird wieder in den Vordergrund gestellt .>/dev/null
mussfg
jedes Mal beendet werden, um den Befehl subshell auszudrucken.00:00
und sendet einSTOP
Signal an den untergeordneten Prozess$!
, der den Prozess anhält.read
wartet für immer auf Eingaben und hält das Skript am Leben.Wenn Ctrl-Zgedrückt wird, während die Subshell im Vordergrund ist, wird die Ausführung angehalten und das äußere Skript in den Vordergrund zurückgesetzt, wo es still wartet. Wenn das äußere Skript im Vordergrund ist, setzt der Trap-Handler die Ausführung der Subshell fort und zählt erneut hoch.
quelle
Javascript in der Chrome-Konsole, 143 Bytes
Bei Eingabe in der Konsole wird der Zähler auf 00:00 gesetzt und anschließend die Steuerung aktiviert, die auf dem Dokument per Tastendruck ausgeführt wird.
Es ist nicht viel Magie im Gange, vor allem
(i/60)|0
die Anzahl der StockwerkeFertig und in der Chrome-Konsole getestet
quelle
m=s=g=i=0;(f=document).onclick=_=>g++;setInterval("g%2&&f.close(f.write(`${(m=i/60%60|0)>9?m:'0'+m}:`+((s=i++%60)>9?s:'0'+s)))",1e3)
HTML + JavaScript (ES6),
191 192 187 183174 BytesErläuterung
Klicken Sie auf den Timer, um die Stoppuhr zu starten oder anzuhalten. Als solches ist ein einziger Klick der Steuerschlüssel . Das Trennzeichen zwischen den beiden Werten ist ein Doppelpunkt.
Immer wenn der Benutzer auf den Klick klickt, wird der Wert von
b
überprüft. Es wird initialisiert, auf0
was ausgewertet wirdfalse
, sodass alle 1000 Millisekunden eine Code-Zeichenfolge ausgewertet wird. Dadurch wird die Variable auf die ID des Intervalls gesetzt, sodass sie später beendet werden kann. Wennb
eine Zahl enthalten ist, wird sie zu ausgewertettrue
, sodass das Intervall angehalten wird. Dies gibt den Wert zurückundefined
, sodass der Zyklus fortgesetzt wird.Die Code-Zeichenfolge ändert das HTML des Elements mit der ID
a
(der Stoppuhr). Zuerst werden die Minuten analysiert, indem der vorherige Stoppuhrwert durch den Doppelpunkt geteilt und der Minutenwert abgerufen wird, der um 0 erhöht wird, wenn der Sekundenwert nicht 59 (größer als 58) ist, und ansonsten 1, Modulo 60 Dann wird dieser Wert aufgefüllt. Dann kommt der Doppelpunkt und zuletzt die Sekunde. Der Code erhält einfach den alten Wert, erhöht ihn um 1, nimmt modulo 60 und füllt ihn optional auf.quelle
C
309179 BytesUngolfed-Version:
Verbrauch: Drücken Sie Enterauf Pause und Fortsetzen der Stoppuhr.
Erläuterung:
break
die erstewhile
Schleife und warte bis die nächste Enterkommt.goto
erstewhile
Schleife starten und mit dem Zählen fortfahren.Ich weiß, dass
goto
C eine schlechte Codierungspraxis ist, aber ich konnte keinen anderen Weg finden.quelle
getchar()
geblockt, bis ein Zeichen gedrückt wird.m=0,s=0;
daran scheitert es, weil Sie diese Variablen nirgendwo deklariert haben.Javascript, 124 Bytes
Der 'Steuerschlüssel' ist ein Klick auf das Dokument. Um dies zu testen, fügen Sie den Code in die Konsole oder in eine HTML-Datei im
<script>
Tag ein.Erläuterung:
Getestet in Chrome
quelle
PHP,
9491 BytesIch gehe davon aus, dass 32 der Schlüsselcode für die Leertaste ist (was es wahrscheinlich nicht ist);
Ich habe derzeit keine Möglichkeit, ncurses zu testen. Aber der Rest des Codes funktioniert gut.
beginnt um
00:00
, erhöht sich jedoch sofort, wenn die Pause endetWenn Sie (wie ich) keine Flüche haben, können Sie dies testen, indem Sie den zweiten
date
Parameter durch$t+=$r^=!rand(sleep(1),19);
oder ersetzen$t+=$r^=++$x%20<1+sleep(1);
. (sleep
kehrt immer zurück0
.)Nervenzusammenbruch
quelle
C # 220 Bytes
Golf gespielt
Mit der
s
Taste starten / stoppen. Das gesamte Programm merkt sich das TimeDelta mitDateTime.Now
Der größte Teil von C # -Magic stammt aus der C # 7.0-Funktion
using static
.quelle
Bash, 65 Bytes
trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}
Beachten Sie, dass es in ein Dateiskript geschrieben werden muss, damit es ordnungsgemäß funktioniert. Andernfalls versuchen Sie Folgendes:
bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'
Erweiterte Version, um es zu erklären:
Das
%(...)T
zu druckende Format ist in Bash 5+ gültig.quelle
00:00
und erhöht einen Zähler, wenn Sie drückenCtrl-C
. Es gibt keine Animation des Timers. (Getestet auf Bash 5.0.7)bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'
. @roblogicbash -c
:) ausgeführt werdenC (gcc) ,
121115 BytesProbieren Sie es online!
Legt einen Signal-Handler für SIGINT fest, der durch Drücken von Strg-C ausgelöst wird. Wir behalten einen Zeitversatz bei
b
und zeigen die Zeit der Wanduhr abzüglich des Zeitversatzes an. Wenn wir angehalten haben, erhöhen Sie die Zeitbasis jedes Mal, wenn die Wanduhr tickt, um die angezeigte Zeit einzufrieren.Danke an @ceilingcat für das Abschneiden von 6 Bytes!
quelle
Zsh + Gnu Datum, 242 Bytes
Mit 1/100 Sekunde! Es erfordert ein interaktives Terminal, aber hier ist trotzdem eine TIO-Verbindung .
Drücken Sie Enter, um den Timer zu starten / zu stoppen. Ctrl-Cbeenden.
Kommentare (etwas veraltet):
quelle
Commodore BASIC (C64 / TheC64 Mini, VIC-20, PET, C16 / + 4) - 147 tokenisierte und BASIC-Bytes
{clear}
In der Auflistung steht,SHIFT+CLR/HOME
welches als ein PETSCII-Zeichen ausgegeben wird, wenn einem öffnenden Anführungszeichen gefolgt wird, wohingegen{home}
derCLR/HOME
Schlüssel ohne die Verschiebung unter der gleichen Bedingung einem öffnenden Anführungszeichen folgt.Verwenden Sie die Leertaste als Steuertaste.
Ändern Sie die Liste in den folgenden Zeilen, um mit dem Commodore 128 in BASIC 7 zu arbeiten:
Fügt der Zählung weitere sieben Token hinzu (da alle Zahlen in BASIC als 7 Byte gespeichert sind, sind dies
goto10
8 Token-Bytes, wohingegengoto
es sich nur um 1 handelt).quelle