Napisz program, który śledzi liczbę kolejnych dni, w których był uruchamiany.
Dzień resetuje się o północy (czas lokalny komputera, na którym program jest uruchomiony).
Jeśli jest dzień, w którym program nie zostanie uruchomiony, licznik jest resetowany do zera.
Za każdym razem, gdy program jest uruchamiany, licznik powinien wzrosnąć o jeden dzień, jeśli program jest uruchamiany po raz pierwszy tego dnia. Oznacza to, że przy pierwszym uruchomieniu program powinien powiedzieć: „Masz serię 1 dnia!”
Dane wyjściowe programu mają postać: You have a [streak_length] day streak!
Możesz przechowywać dane zewnętrznie lub modyfikować kod źródłowy - twój wybór.
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach!
Odpowiedzi:
Grzmotnąć,
92,90, 82 bajtyGrał w golfa
EDYCJE
Jak to działa !
Każde uruchomienie spowoduje dołączenie wiersza z bieżącą datą do pliku h , np .:
Będzie on następnie użyć
uniq
, aby odfiltrować duplikaty (tj kilkukrotne wystrzelenie w obrębie tego samego dnia) i policzyć wiersze uzyskać smuga długość.Aby zresetować pasmo , będzie grepować na „wczoraj” w godz. I skróci go, jeśli nie zostanie znaleziony.
źródło
Bash, 102 bajty
Ostrzeżenie: nie uruchamiaj w żadnym folderze, na którym ci zależy. Usuwa każdy plik, do którego nie uzyskano dostępu w ostatnim dniu w katalogu roboczym.
Używa pliku
a
do przechowywania danych, korzystając z uzyskanych / zmodyfikowanych znaczników czasu.źródło
Goruby, 85 bajtów
Uruchom z flagą interpretera
-rdate
.Działa poprzez zapisywanie nowego pliku dla każdego dnia, w którym jest wywoływany, a następnie zlicza liczbę kolejnych plików do tyłu, aby uzyskać długość pasma. Nigdy nie usuwa plików, więc ostatecznie, po bardzo, bardzo, bardzo, bardzo długim czasie, zapełni Twój dysk twardy, garść bajtów naraz.
Oto jego nie golfowa wersja:
źródło
Python 3, 213 bajtów
źródło
Bash + coreutils,
12097 bajtówPowyższa linia bash zawiera 95 bajtów.
Istnieje drugi plik o nazwie f, który zawiera tylko jeden znak:
(Program pisze do f.)
Myślę więc, że całkowita liczba bajtów powinna być oceniana jako 97 (95 bajtów na zawartość pliku bash, 1 bajt na zawartość pliku zewnętrznego i 1 bajt, ponieważ używany jest 1 plik inny niż program). Jest to oparte na liczeniu bajtów dla programów wieloplikowych .
Uwaga: Dzięki @orlp za zwrócenie uwagi, że wcześniejsza odpowiedź na to, którą zamieściłem, była nonsensem; Całkowicie źle odczytałem problem. (Został opublikowany jako inna odpowiedź, którą usunąłem).
źródło
PowerShell , 95 bajtów
Wypróbuj online!
Wyjaśnienie
Zaczynam od zapisania bieżącej daty (w formacie krótkiej daty) do pliku (o nazwie
z
).>>
działa jak zwykle; dołącza, ale tworzy, jeśli nie istnieje.Następnie czytam zawartość pliku linia po linii za pomocą
Get-Content
(gc
), potok przezGet-Unique
(gu
), ponieważ może być wiele wpisów z tej samej daty, a następnie potok przezForEach-Object
(%
).W pętli tworzę tablicę 2-elementową z wartością
0
w pierwszym elemencie i bieżącą wartością$c
(+1
) w drugim elemencie. Używanie++$c
pozwala mi uniknąć zawijania czegoś takiego jak$c+1
w nawiasach.Następnie indeksuję do tablicy dwuelementowej z porównaniem boolowskim, które zostanie połączone z
0
for$false
lub1
for$true
. W ramach porównania, jestem przypisanie$d
do[datetime]
obiektu utworzonego od daty odczytać z bieżącej linii w pliku. Obiekt ten jest porównywany do tego$n
, który przy pierwszym uruchomieniu nie został jeszcze przypisany, więc nigdy nie będzie pasował i$c
zostanie zainicjowany1
, ponieważ przypisywana jest wartość indeksowania$c
.Następnie
$n
zapełni się następną oczekiwaną datą, dodając1
do bieżącego obiektu daty i godziny. Kluczem tutaj jest1D
to, że jest to[decimal]
dosłowne. Z jakiegoś powodu, gdy dodajesz liczby całkowite do a[datetime]
, jest to interpretowane jako tiki, ale kiedy dodajesz liczby zmiennoprzecinkowe, są one interpretowane jako dni. Wypełnia to$n
do następnej iteracji.Skutkuje to tym, że licznik jest resetowany za każdym razem, gdy bieżąca data nie pasuje do „następnej” daty (czyli poprzedniej daty plus 1 dzień).
Wreszcie wiadomość jest wysyłana.
źródło