Du hast eine Tagessträhne!

15

Schreiben Sie ein Programm, das die Anzahl der aufeinanderfolgenden Tage protokolliert, an denen es ausgeführt wurde.

Der Tag wird um Mitternacht (die Ortszeit des Computers, auf dem das Programm ausgeführt wird) zurückgesetzt.

Wenn es einen Tag gibt, an dem das Programm nicht ausgeführt wird, wird der Zähler auf Null zurückgesetzt.

Jedes Mal, wenn das Programm ausgeführt wird, sollte der Zähler um einen Tag erhöht werden, wenn es das erste Mal ist, dass das Programm an diesem Tag ausgeführt wird. Dies bedeutet, dass beim ersten Ausführen des Programms die Meldung "Sie haben eine eintägige Pause!" Angezeigt wird.

Die Ausgabe des Programms erfolgt in der Form: You have a [streak_length] day streak!

Sie dürfen Daten extern speichern oder den Quellcode ändern - nach Ihrer Wahl.

Das ist , also gewinnt der kürzeste Code in Bytes!

Daniel
quelle
Muss es Ortszeit sein? Oder kann es einfach irgendeine Zeitzone sein?
3.
@EasterlyIrk, der Tag wird um Mitternacht Ortszeit zurückgesetzt.
Daniel
Also muss es lokal sein, wo sich der Computer befindet? Oder zumindest die Zeitzone, in der sich der Computer befindet. UTC kann es trotzdem nicht verwenden?
3.
@EasterlyIrk, es muss die Zeitzone des Computers sein
Daniel
Ah okay. Danke fürs klarstellen.
3.

Antworten:

4

Bash, 92, 9082 Bytes

Golf gespielt

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

EDITS

  • Datei abschneiden, anstatt sie zu entfernen, -8 Byte;
  • Ersetzt -daystart mit ! -newermt um 2 Bytes zu sparen.

Wie es funktioniert !

Bei jedem Start wird eine Zeile mit dem aktuellen Datum an die Datei h angehängt , z.

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

Anschließend uniqwerden Duplikate (dh mehrere Starts innerhalb desselben Tages) herausgefiltert und die Linien gezählt, um die Streifenlänge zu erhalten .

uniq h|wc -l

Um einen Streifen zurückzusetzen , sucht er in h nach 'gestern' und schneidet ihn ab, wenn er nicht gefunden wird.

grep `date -d-1day -I` h||>h
Zeppelin
quelle
5

Bash, 102 Bytes

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

Achtung, nicht in einem Ordner ausführen, der Ihnen am Herzen liegt. Es löscht alle Dateien, auf die am letzten Tag nicht zugegriffen wurde, im Arbeitsverzeichnis.

Verwendet eine Datei azum Speichern von Daten unter Verwendung der aufgerufenen / geänderten Zeitstempel.

orlp
quelle
2

Goruby, 85 Bytes

Führen Sie mit dem Interpreter-Flag aus -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!"

Es speichert eine neue Datei für jeden Tag, an dem sie aufgerufen wird, und zählt dann die Anzahl aufeinanderfolgender Dateien rückwärts, um die Länge der Streifen zu erhalten. Es löscht niemals Dateien, daher wird es nach einer sehr, sehr, sehr, sehr, sehr langen Zeit Ihre Festplatte füllen, eine Handvoll Bytes auf einmal.

Hier ist eine ungolfed Version davon:

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
quelle
1

Python 3, 213 Bytes

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
quelle
1

Bash + Coreutils, 120 97 Bytes

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!

Die obige Bash-Zeile enthält 95 Bytes.

Es gibt eine zweite Datei mit dem Namen f, die nur ein einzelnes Zeichen enthält:

0

(Das Programm schreibt an f.)

Ich denke also, die Gesamtzahl der Bytes sollte mit 97 bewertet werden (95 Bytes für den Inhalt der Bash-Datei, 1 Byte für den Inhalt der externen Datei und 1 Byte, da 1 andere Datei als das Programm verwendet wird). Dies basiert auf dem Zählen von Bytes für Programme mit mehreren Dateien .

Hinweis: Vielen Dank an @orlp für den Hinweis, dass eine frühere Antwort auf diese Frage Unsinn war. Ich hatte das Problem komplett falsch verstanden. (Es wurde als eine andere Antwort gepostet, die ich gelöscht habe.)

Mitchell Spector
quelle
0

PowerShell , 95 Byte

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

Probieren Sie es online!

Erläuterung

Ich beginne damit, das aktuelle Datum (im kurzen Datumsformat) in eine Datei (mit Namen z) zu schreiben . >>funktioniert wie gewohnt; wird angehängt, aber erstellt, wenn es nicht vorhanden ist.

Als nächstes lese ich den Inhalt der Datei Zeile für Zeile mit Get-Content( gc), Pipe Through Get-Unique( gu), da es mehrere Einträge vom selben Datum geben kann, und dann Pipe Through ForEach-Object( %).

In der Schleife erstelle ich ein Array mit 2 Elementen mit dem Wert 0im ersten Element und dem aktuellen Wert von $c( +1) im zweiten Element. Mit ++$ckann ich vermeiden, etwas $c+1in Klammern zu setzen.

Dann indexiere ich in das Array mit zwei Elementen mit einem booleschen Vergleich, der zu 0for $falseoder 1for verschmolzen wird $true. Innerhalb des Vergleichs ordne ich $dein [datetime]Objekt zu, das aus dem Datum erstellt wurde, das aus der aktuellen Zeile in der Datei gelesen wurde. Dieses Objekt wird mit verglichen $n, das beim ersten Durchlauf noch nicht zugewiesen wurde. Daher wird es nie mit dem Objekt übereinstimmen und $cmit initialisiert 1, da der Wert der Indizierung zugewiesen wird $c.

Als nächstes $nwird mit dem nächsten erwarteten Datum 1aufgefüllt , indem zum aktuellen datetime-Objekt hinzugefügt wird. Der Schlüssel hier ist, dass 1Des ein [decimal]Literal ist. Wenn Sie a Ganzzahlen hinzufügen [datetime], wird dies aus irgendeinem Grund als Häkchen interpretiert. Wenn Sie jedoch Gleitkommazahlen hinzufügen, werden diese als Tage interpretiert. Das füllt sich also $nfür die nächste Iteration.

Dies hat zur Folge, dass der Zähler jedes Mal zurückgesetzt wird, wenn das aktuelle Datum nicht mit dem "nächsten" Datum (dem vorherigen Datum plus 1 Tag) übereinstimmt.

Schließlich wird die Nachricht ausgegeben.

Briantist
quelle