Hai una serie di giorni!


15

Scrivi un programma che tenga traccia del numero di giorni consecutivi in ​​cui è stato eseguito.

Il giorno viene reimpostato a mezzanotte (l'ora locale del computer su cui viene eseguito il programma).

Se c'è un giorno in cui il programma non viene eseguito, il contatore viene resettato a zero.

Ogni volta che viene eseguito il programma, il contatore dovrebbe aumentare di un giorno se è la prima volta che il programma viene eseguito quel giorno. Ciò significa che la prima volta che il programma viene eseguito, si dovrebbe dire "Hai una serie di 1 giorno!"

L'output del programma è nella forma: You have a [streak_length] day streak!

Puoi memorizzare i dati esternamente o modificare il codice sorgente - a tua scelta.

Questo è , quindi vince il codice più breve in byte!


Deve essere l'ora locale? O può essere solo un fuso orario?
R

@EasterlyIrk, il giorno si ripristina a mezzanotte ora locale.
Daniel,

Quindi deve essere locale da dove si trova il computer? O almeno nel fuso orario in cui si trova il computer. Non può usare UTC a prescindere?
R

@EasterlyIrk, deve essere il fuso orario del computer
Daniel

Ah ok. Grazie per il chiarimento.
R

Risposte:


4

bash, 92, 90, 82 byte

golfed

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

EDITS

  • Tronca il file, anziché rimuoverlo, -8 byte;
  • Sostituito -daystart con ! -newermt per salvare 2 byte.

Come funziona !

Ad ogni avvio, verrà aggiunta una riga con la data corrente al file h , ad esempio:

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

Verrà quindi utilizzato uniqper filtrare i duplicati (vale a dire lanci multipli, nello stesso giorno) e contare le linee per ottenere la lunghezza della striscia .

uniq h|wc -l

Per reimpostare una serie , verrà chiamato per "ieri" in h e troncato se non trovato.

grep `date -d-1day -I` h||>h

5

Bash, 102 byte

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

Attenzione, non eseguire in nessuna cartella a cui tieni. Elimina qualsiasi file non accessibile nell'ultimo giorno nella directory di lavoro.

Utilizza un file aper archiviare i dati, utilizzando i timestamp accessibili / modificati.


2

Goruby, 85 byte

Esegui con il flag interprete -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!"

Funziona memorizzando un nuovo file per ogni giorno in cui viene richiamato, quindi conta il numero di file consecutivi all'indietro per ottenere la lunghezza della sequenza. Non elimina mai i file, quindi, alla fine, dopo molto, molto, molto, molto, molto tempo, riempirà il tuo disco rigido, una manciata di byte alla volta.

Ecco una versione non modificata di esso:

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!"

1

Python 3, 213 byte

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

1

Bash + coreutils, 120 97 byte

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!

La riga bash sopra contiene 95 byte.

C'è un secondo file chiamato f che contiene solo un singolo carattere:

0

(Il programma scrive in f.)

Quindi penso che il numero totale di byte dovrebbe essere valutato come 97 (95 byte per il contenuto del file bash, 1 byte per il contenuto del file esterno e 1 byte perché viene utilizzato 1 file diverso dal programma). Questo si basa sul conteggio dei byte per i programmi multi-file .

Nota: grazie a @orlp per aver sottolineato che una precedente risposta a ciò che ho pubblicato era una sciocchezza; Ho letto male il problema completamente. (È stato pubblicato come una risposta diversa, che ho eliminato.)


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!"

Provalo online!

Spiegazione

Comincio scrivendo la data corrente (in formato data breve) in un file (denominato z). >>funziona come al solito; aggiunge, ma crea se non esiste.

Successivamente, ho letto il contenuto del file riga per riga con Get-Content( gc), pipe through Get-Unique( gu) poiché potrebbero esserci più voci dalla stessa data, quindi pipe through ForEach-Object( %).

Nel ciclo, creo un array di 2 elementi con il valore 0nel primo elemento e il valore corrente di $c( +1) nel secondo elemento. L'uso ++$cmi consente di evitare di avvolgere qualcosa di simile $c+1tra parentesi.

Poi indice I in due serie di elementi con un confronto booleano, che andranno a coalescenza 0per $falseo 1per $true. All'interno del confronto, sto assegnando a $dun [datetime]oggetto creato dalla data letta dalla riga corrente nel file. Quell'oggetto viene confrontato con il $nquale alla prima esecuzione non è stato ancora assegnato, quindi non corrisponderà mai e $cverrà inizializzato 1, poiché il valore dell'indicizzazione viene assegnato a $c.

Successivamente, $nviene popolato con la data prevista successiva, aggiungendo 1all'oggetto datetime corrente. La chiave qui è che 1Dsignifica che è [decimal]letterale. Per qualche motivo quando aggiungi numeri interi a [datetime], viene interpretato come tick, ma quando aggiungi numeri in virgola mobile, vengono interpretati come giorni. Quindi questo si popola $nper la prossima iterazione.

L'effetto è che il contatore viene resettato ogni volta che la data corrente non corrisponde alla data "successiva" (che è la data precedente più 1 giorno).

Alla fine viene emesso il messaggio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.