Zaimplementuj prosty cyfrowy stoper , który wyświetli upływ czasu w sekundach i minutach, jak opisano poniżej.
Ważny
Proszę przeczytać sekcje Wyświetlania i Kontroli !
Pokaz
Upływający czas powinien być wyświetlany w MM:SS
formacie, zastępując poprzednio wyświetlany ciąg czasu „w miejscu” (dozwolone jest również wyczyszczenie całego ekranu lub jego części).
Stoper musi być aktualizowany co najmniej co sekundę.
Przykłady:
0 minut, 0 sekund
00:00
0 minut, 33 sekund
00:33
1 minuta, 50 sekund
01:50
Początkowo możesz zacząć od „00: 00” lub dowolnej innej wartości z zakresu [00: 00-59: 59].
Po osiągnięciu stopera 59:59
należy go zresetować 00:00
i kontynuować od nowa.
Możesz użyć innej podstawy (zamiast dziesiętnej) lub nawet innego systemu liczbowego, jeśli chcesz, o ile postępujesz według ogólnego wzorca.
Na przykład 13:03
może być wyświetlany jako:
13:03
0D:03
N:D
10101:3
XIII:III
Uwaga: jeśli używasz systemu dziesiętnego / bazy dziesiętnej, musi być on zakodowany przy użyciu drukowalnych znaków ASCII (lub Unicode), np. Użycie dwóch binarnych (niedrukowalnych) bajtów na minuty i sekundy jest niedozwolone.
Musisz także uzupełnić dane wyjściowe odpowiednio zerami, jeśli twój system numeryczny na to pozwala.
:
Dopuszczalne jest również zastąpienie znaku separatora dowolnym innym znakiem drukowalnym (w tym cyframi).
Sterownica
Stoper powinien rozpocząć wstrzymane , a pobyt w tym stanie, aż użytkownik wyraźnie zaczyna go, naciskając „kontrola” klucza (patrz poniżej).
Jeśli podczas odliczania stopera użytkownik ponownie naciśnie klawisz „Control” , stoper powinien zatrzymać się (zachowując bieżący czas), aż do ponownego naciśnięcia klawisza „Control” .
Klawisz „kontrolny” może być pojedynczym naciśnięciem klawisza, np. s
Lub dowolną kombinacją klawiszy, np. Ctrl+Shift+X
Ale musi być „atomowy”, naciskanie wielu klawiszy w sekwencji, np. s
Wtedy Enter
, nie jest dozwolone .
Do zatrzymania i wznowienia stopera należy użyć tego samego klawisza „kontrolnego” (lub kombinacji) .
Musisz użyć specjalnego klawisza „kontrolnego” , tzn. „Dowolny klucz” jest niedozwolony.
Alternatywnie możesz użyć pojedynczego lub podwójnego kliknięcia myszą zamiast naciśnięcia klawisza w celu „sterowania”.
Zasady
- To jest golf golfowy , najkrótsza odpowiedź w bajtach wygrywa;
- Obowiązują standardowe luki w kodzie golfowym;
- Twój program musi (teoretycznie) działać wiecznie.
źródło
00:05
znaczy, jeśli użytkownik zatrzyma około 7000 milisekund po wydrukowaniu, a następnie w pewnym momencie wznowi ponownie, czy musi00:06
pojawić się 3000 milisekund po naciśnięciu przycisku wznowienia, czy też czy można wydrukować go pełną sekundę po naciśnięciu przycisku wznowienia?Odpowiedzi:
SmileBASIC,
867771 bajtówDIALOG
wyświetla pole tekstowe na ekranie dotykowym.N
to liczba sekund, przez które pole tekstowe pozostanie na ekranie, zanim zniknie. JeśliN
tak0
, pozostaje, dopóki użytkownik nie naciśnie przycisku na ekranie dotykowym.DIALOG
Zwraca,1
jeśli użytkownik nacisnął przycisk i0
zamknął się automatycznie. Gdy użytkownik naciska przycisk pauzy, powraca1
, a czas wyświetlania jest ustawiony na0
, wstrzymując stoper. Po tym, jak użytkownik ponownie naciśnie przycisk, ustawiamy czas wyświetlania z powrotem na1
, wznawiając licznik czasu. Zasadniczo, za każdym razem , gdyDIALOG
powraca1
, czas wyświetlania jest przełączany pomiędzy1
i0
używaniem!=
, co jest równoważne logicznemu XOR, o ile oba wejścia są równe 1 lub 0.źródło
Python 2,
167129 bajtów-36 bajtów głównie * od wykorzystania pomysłu Maltysena na łapanie
ctrl-c
za pomocą wyjątku - idź, daj kredyt!-4 bajty dzięki DLosc (init
n
ib
zamiast 0f()
)-1 bajt dzięki FlipTack (
p^=1
raczej zamiastp=1-p
)-2 bajty dzięki Felipe Nardi Batista (usuń specyfikatory precyzji)
Działa tak samo jak mój oryginał, ale z sekwencją klawiszy sterujących
ctrl+c
.(Testowany przeze mnie z Python 2.7.8 na Windows 7, 64-
bitowy ; Testowany przez Briana Mintona z Python 2.7.13 na Linux, 64-bitowy)
* zwinął również
if
instrukcję do wyszukiwania listy, aby uzyskać jątry
jako jednowierszową.Mój oryginał:
(Testowany przeze mnie w Pythonie 2.7.8 w systemie Windows 7, 64-bitowym - ten kod jest jednak specyficzny dla systemu Windows z powodu korzystania z
msvcrt
biblioteki)Klawisz sterujący to „p”.
n
ib
są inicjowane do tej samej wartości przy uruchomieniu, dając „przesunięcie” równe 0;p
jest inicjowany na 0, co oznacza stan wstrzymania.Każde naciśnięcie klawisza sterującego powoduje zmianę wartości
p
. Podczas przełączania ze stanu wstrzymanego na aktywny stanb
jest aktualizowany do nowej wartości, zachowując wszelkie bieżące przesunięcie względem poprzednich aktywnych stanów za pomocąb-n
.Podczas stanu aktywnego
n
jest wielokrotnie aktualizowany do aktualnego czasu przez połączenietime.time()
.Różnica pomiędzy
n
ab
,t
jest to całkowita liczba sekund (w tym części ułamkowej) upłynął w stan aktywny (e).Minęły minuty,
t/60
a każda minuta i sekunda są wyświetlane mod 60 z(t/60%60,t%60)
. Zera wiodące są poprzedzane przed każdym za pomocą formatowania ciągu części całkowitej za pomocą'...%0.2d...'
. Wydrukowanie krotki (końcowej,
), w której pierwszy element ma wiodący znak powrotu karetki (\r
), powoduje zastąpienie wcześniej wydrukowanego tekstu.źródło
^=
ale w pewnym momencie zmieniłem formułę..
w%0.2d
? działa dobrze, ponieważ%02d
Python -
160159143 bajtówDzięki @JonathanAllan za uratowanie mnie 18 bajtów!
Używa tylko wbudowanych bibliotek, więc kluczem sterującym jest
ctrl-c
łapanie go za pomocąexcept keyboardInterrupt
.źródło
except:
? Mam działającą wersję, która to robi ...narzędzia bash + Unix, 90 lub 93 bajty
Wersja 90-bajtowa:
Wersja 93-bajtowa:
Ctrl-C jest znakiem wznowienia / pauzy. Spacja to separator między minutami a sekundami.
Różnica między dwiema wersjami polega na tym, że 90-bajtowy program będzie działał przez 2 ^ 63 sekundy (w tym momencie bash da mi przepełnienie liczb całkowitych).
Wersja 93-bajtowa będzie naprawdę działać wiecznie.
Pierwotny problem zawierał wymóg: „Twój program musi (teoretycznie) działać wiecznie”.
Jeśli uruchomienie przez 2 ^ 63 sekundy wystarczy, aby spełnić to wymaganie, wówczas rozwiązanie 90-bajtowe działa. Ten czas trwania jest ponad 20 razy większy niż wiek wszechświata!
Jeśli program musi być w stanie działać dłużej, będę musiał skorzystać z 93-bajtowego rozwiązania.
Powinienem chyba zaznaczyć, że to rozwiązanie, a także co najmniej niektóre inne opublikowane, będzie bardzo powoli opóźniało się do prawdziwego upływu czasu. Ten poślizg jest spowodowany tym, że program śpi przez jedną sekundę między każdym wykonaniem korpusu pętli, ale wykonanie pętli zajmuje trochę czasu. W praktyce będzie to nieistotne.
źródło
Initially, you can start with '00:00' or with any other value in range [00:00-59:59]
, która pozostanie na ekranie, dopóki nie naciśniesz „control” po raz pierwszy. Przepraszam, jeśli nie byłem w stanie sformułować tego wystarczająco jasno!QBasic,
213211 bajtówKlawisz Control to tab. Pozostawienie tego działania może spowodować pożary laptopa. Zostałeś ostrzeżony.
Tutaj jest w akcji, wstrzymuje się o 10, 15 i 20 sekund:
Nie golfił i skomentował
Zauważ, że wartości
TIMER
są zmiennoprzecinkowe. Nie wpływa to na wynik, ponieważMOD
i\
obcina się do liczb całkowitych. Ale zwiększa dokładność zaoszczędzonego czasu: jeśli zatrzymasz stoper tuż przed tyknięciem, zobaczysz, gdy uruchomisz go ponownie, że liczba zmienia się w mniej niż sekundę.źródło
Partia, 132 bajty
Naciśnięcie
n
spowoduje (od) wstrzymanie stopera. Migotanie wyjściowe można zmniejszyć kosztem trzech (lub czterech) bajtów.źródło
Pure Bash, 141 bajtów
Wykorzystuje to tylko wbudowane Bash (bez narzędzi zewnętrznych). Znak kontrolny jest Ctrl-Ztaki, że standardowa
SIGTSTP
obsługa wstrzymuje stoper.set -m
włącza kontrolę zadań , która zwykle jest wyłączona w skrypcie.&
) .read -t 1
czeka jedną sekundę na dane wejściowe od użytkownika , a następnie kończy się niepowodzeniem.until
Pętla trwa tak długo, jak długoread
utrzymuje niepowodzeniem.printf
wyświetla poprawnie wypełniony i sformatowany czas$[s=s>3598?0:s+1,s/60]
interpretacja arytmetyczna najpierw oblicza zaktualizowany czas, sprawdzając, czy owinąć i zwiększając licznik sekunds
, a następnie zwraca zmienną dzielącąs/60
.$[s%60]
daje pozostałą sekundę.trap
obsługi dlaTSTP
sygnał Ctrl-Zgeneruje. Naciśnięcie Ctrl-Zprzycisku podczas działania zewnętrznego skryptu spowoduje jego uruchomieniefg>/dev/null
i umieszczenie podpowłoki z powrotem na pierwszym planie .>/dev/null
jest konieczne, abyfg
za każdym razem przestać drukować polecenie podpowłoki.00:00
i wysyłaSTOP
sygnał do procesu potomnego$!
, który wstrzyma proces.read
czeka na dane wejściowe na zawsze, utrzymując skrypt przy życiu.Jeśli Ctrl-Zzostanie naciśnięty, gdy podpowłoka jest na pierwszym planie, spowoduje wstrzymanie wykonania i powrót skryptu zewnętrznego na pierwszy plan, gdzie będzie cicho czekać. Jeśli zewnętrzny skrypt jest na pierwszym planie, moduł obsługi pułapek wznowi wykonywanie podpowłoki i będzie odliczał ponownie.
źródło
JavaScript w konsoli Chrome, 143 bajty
Po wprowadzeniu w konsoli włącza licznik do 00:00, a następnie włącza kontrolę naciśnięcia klawisza na dokumencie.
Nie dzieje się wiele magii, zwłaszcza
(i/60)|0
liczba pięterWykonano i przetestowano w konsoli Chrome
źródło
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 bajtówWyjaśnienie
Kliknij stoper, aby uruchomić lub zatrzymać stoper. W związku z tym jedno kliknięcie jest klawiszem sterującym . Separator między dwiema wartościami to dwukropek.
Za każdym razem, gdy użytkownik kliknie kliknięcie, wartość parametru
b
jest sprawdzana. Jest on inicjowany, dla0
którego następuje ocenafalse
, więc ciąg kodu jest oceniany co 1000 milisekund. Ustawia zmienną na identyfikator interwału, dzięki czemu można ją później zatrzymać. Jeślib
zawiera liczbę, sprawdzatrue
, więc interwał jest zatrzymywany. Zwraca wartośćundefined
, więc cykl trwa.Łańcuch kodu zmienia html elementu o id
a
(stoper). Najpierw minuty są analizowane przez pobranie poprzedniej wartości stopera, podzielenie jej przez dwukropek i uzyskanie wartości minut, która jest zwiększana o 0, jeśli wartość sekund nie jest 59 (większa niż 58), a 1 w przeciwnym razie, modulo 60 Następnie ta wartość jest uzupełniana. Potem pojawia się dwukropek i wreszcie sekundy. Kod po prostu pobiera starą wartość, zwiększa ją o 1, pobiera modulo 60 i opcjonalnie uzupełnia.źródło
C
309179 bajtówWersja bez golfa:
Użycie: Naciśnij, Enteraby zatrzymać i wznowić stoper.
Wyjaśnienie:
break
pierwsząwhile
pętlę i poczekaj, aż Enterpojawi się następna .goto
pierwszawhile
pętla i wznawianie liczenia.Wiem, że
goto
jest to zła praktyka kodowania w C, ale nie mogłem wymyślić innego sposobu.źródło
getchar()
blokuje do momentu naciśnięcia jakiejś postaci.m=0,s=0;
nie udaje, ponieważ nigdzie nie zadeklarowano tych zmiennych.JavaScript, 124 bajty
„Klawisz sterujący” to kliknięcie dokumentu. Aby to przetestować, wklej kod w konsoli lub w pliku HTML wewnątrz
<script>
tagu.Wyjaśnienie:
Testowane w Chrome
źródło
PHP,
9491 bajtówZakładam, że 32 to kod klucza spacji (który prawdopodobnie nie jest);
Obecnie nie mam możliwości przetestowania ncurses. Ale reszta kodu działa dobrze.
zaczyna się o
00:00
, ale zwiększa się natychmiast po zakończeniu pauzyJeśli (podobnie jak ja) nie masz ncurses, możesz przetestować, zastępując drugi
date
parametr przez$t+=$r^=!rand(sleep(1),19);
lub$t+=$r^=++$x%20<1+sleep(1);
. (sleep
zawsze wraca0
.)awaria
źródło
C # 220 bajtów
Grał w golfa
Używanie
s
klawisza do uruchamiania / zatrzymywania. Cały program działa, pamiętając o użyciu TimeDeltaDateTime.Now
Większość C # -Magic tutaj pochodzi z funkcji C # 7.0
using static
.źródło
Bash, 65 bajtów
trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}
Pamiętaj, że musi być zapisany w skrypcie pliku, aby działał poprawnie, w przeciwnym razie spróbuj:
bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'
Wersja rozszerzona, aby to wyjaśnić:
%(...)T
Format printf jest ważna w bash 5+.źródło
00:00
i zwiększa licznik po uderzeniuCtrl-C
. Nie ma animacji timera. (Testowane na bash 5.0.7)bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'
. @roblogicbash -c
:)C (gcc) ,
121115 bajtówWypróbuj online!
Ustawia moduł obsługi sygnału dla SIGINT, który jest wyzwalany przez naciśnięcie Control-C. Trzymamy przesunięcie czasowe
b
i wyświetlamy zegar ścienny minus przesunięcie czasowe. Jeśli jesteśmy zatrzymani, zwiększaj podstawę czasu za każdym razem, gdy tyka zegar ścienny, aby zatrzymać wyświetlany czas.Dzięki @ceilingcat za golenie 6 bajtów!
źródło
Data Zsh + Gnu, 242 bajty
Wyposażony w 1/100 sekundy! Wymaga interaktywnego terminala, ale tutaj jest link TIO .
Naciśnij, Enteraby uruchomić / zatrzymać stoper; Ctrl-Cdo wyjścia.
Komentarze (nieco nieaktualne):
źródło
Commodore BASIC (C64 / TheC64 Mini, VIC-20, PET, C16 / + 4) - 147 bajtów tokenizowanych i BASIC
{clear}
w wykazie jest to,SHIFT+CLR/HOME
który wyprowadza jako jeden znak PETSCII, gdy występuje po otwierającym cudzysłowie, podczas gdy{home}
jestCLR/HOME
kluczem bez przesunięcia, pod tym samym warunkiem podążania za otwierającym cudzysłowiem.Użyj spacji jako klawisza sterującego.
Aby pracować z Commodore 128 w BASIC 7, zmień listę w następujących wierszach:
Dodaje dodatkowe siedem tokenów do liczby (ponieważ wszystkie liczby są przechowywane w języku BASIC jako 7 bajtów, więc
goto10
jest 8 bajtów tokenizowanych, podczas gdygoto
jest tylko 1).źródło