Masz serię dnia!

15

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 , więc wygrywa najkrótszy kod w bajtach!

Daniel
źródło
Czy to musi być czas lokalny? A może może to być dowolna strefa czasowa?
Rɪᴋᴇʀ
@EasterlyIrk, dzień resetuje się o północy czasu lokalnego.
Daniel
Więc musi być lokalny, skąd jest komputer? Lub przynajmniej strefa czasowa waht, w której jest włączony komputer. Nie może korzystać z UTC niezależnie od tego?
Rɪᴋᴇʀ
@EasterlyIrk, musi to być strefa czasowa komputera
Daniel
Ah, dobrze. Dzięki za wytłumaczenie.
Rɪᴋᴇʀ

Odpowiedzi:

4

Grzmotnąć, 92, 90, 82 bajty

Grał w golfa

grep `date -d-1day -I` h||>h
date -I>>h
echo You have a `uniq h|wc -l` day streak!

EDYCJE

  • Obetnij plik, zamiast go usuwać, -8 bajtów;
  • Zastąpiony -start z ! -newermt, aby zapisać 2 bajty.

Jak to działa !

Każde uruchomienie spowoduje dołączenie wiersza z bieżącą datą do pliku h , np .:

2017-02-03
2017-02-04
2017-02-05
2017-02-05

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ść.

uniq h|wc -l

Aby zresetować pasmo , będzie grepować na „wczoraj” w godz. I skróci go, jeśli nie zostanie znaleziony.

grep `date -d-1day -I` h||>h
zepelin
źródło
5

Bash, 102 bajty

find ! -newerat 0-1day -delete
touch -a a
echo You have a $((1+(`stat -c %X-%Y a`)/86400)) day streak!

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 ado przechowywania danych, korzystając z uzyskanych / zmodyfikowanych znaczników czasu.

orlp
źródło
2

Goruby, 85 bajtów

Uruchom z flagą interpretera -rdate.

c,t=0,Dae.y
op t.ts,?w
dw{c+=1;t=t.p;Fil.f t.ts}
s"You have a #{c} day streak!"

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:

streak, current_date = 0, Date.today
open(current_date.to_s, 'w')
while File.file?(current_date.to_s)
    streak += 1
    current_date = current_date.prev_day;
end
puts "You have a #{streak} day streak!"
Tutleman
źródło
1

Python 3, 213 bajtów

import time
t=time.time()
try:
 r=open("a").read().split(":")
 open("a","w").write((str(int(r[0])+1)+":"+t)if(t>float(r[1])+86400)and(t<float(r[1])+172800)else("1:"+str(t)))
except:open("a","w").write("1:"+str(t))
drc00k3
źródło
1

Bash + coreutils, 120 97 bajtów

read d n<f;c=`date -d0 +%s`;echo $c $[c>d?c>d+86399?n=1:++n:n]>f;echo You have a $n day streak!

Powyższa linia bash zawiera 95 bajtów.

Istnieje drugi plik o nazwie f, który zawiera tylko jeden znak:

0

(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).

Mitchell Spector
źródło
0

PowerShell , 95 bajtów

(date -f 'd')>>z
gc z|gu|%{$c=(1,++$c)[($d=date $_)-eq$n]
$n=$d+1D}
"You have a $c day streak!"

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 przez Get-Unique( gu), ponieważ może być wiele wpisów z tej samej daty, a następnie potok przez ForEach-Object( %).

W pętli tworzę tablicę 2-elementową z wartością 0w pierwszym elemencie i bieżącą wartością $c( +1) w drugim elemencie. Używanie ++$cpozwala mi uniknąć zawijania czegoś takiego jak $c+1w nawiasach.

Następnie indeksuję do tablicy dwuelementowej z porównaniem boolowskim, które zostanie połączone z 0for $falselub 1for $true. W ramach porównania, jestem przypisanie $ddo [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 $czostanie zainicjowany 1, ponieważ przypisywana jest wartość indeksowania $c.

Następnie $nzapełni się następną oczekiwaną datą, dodając 1do bieżącego obiektu daty i godziny. Kluczem tutaj jest 1Dto, ż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 $ndo 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.

briantist
źródło