Vous avez une séquence de jours!

15

Écrivez un programme qui enregistre le nombre de jours consécutifs d'exécution.

Le jour se réinitialise à minuit (l'heure locale de l'ordinateur sur lequel le programme est exécuté).

S'il y a un jour où le programme n'est pas exécuté, le compteur est remis à zéro.

Chaque fois que le programme est exécuté, le compteur doit augmenter d'un jour si c'est la première fois que le programme est exécuté ce jour-là. Cela signifie que la première fois que le programme est exécuté, il devrait dire: "Vous avez une séquence d'une journée!"

La sortie du programme est sous la forme: You have a [streak_length] day streak!

Vous êtes autorisé à stocker des données en externe ou à modifier le code source –– votre choix.

C'est du , donc le code le plus court en octets gagne!

Daniel
la source
Doit-il être l'heure locale? Ou peut-il s'agir de n'importe quel fuseau horaire?
Rɪᴋᴇʀ
@EasterlyIrk, la journée se réinitialise à minuit, heure locale.
Daniel
Il faut donc que ce soit local d'où se trouve l'ordinateur? Ou du moins avec quel fuseau horaire le compteur est activé. Il ne peut pas utiliser l'UTC malgré tout?
Rɪᴋᴇʀ
@EasterlyIrk, ce doit être le fuseau horaire de l'ordinateur
Daniel
Ah ok. Merci de clarifier.
Rɪᴋᴇʀ

Réponses:

4

Frapper, 92, 90, 82 octets

Golfé

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

MODIFICATIONS

  • Tronquer le fichier, au lieu de le supprimer, -8 octets;
  • -Daystart remplacé par ! -newermt pour enregistrer 2 octets.

Comment ça fonctionne !

Chaque fois que vous le lancez, il ajoutera une ligne avec la date actuelle au fichier h , par exemple:

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

Il sera ensuite utilisé uniqpour filtrer les doublons (c'est-à-dire plusieurs lancements, dans la même journée) et compter les lignes pour obtenir la longueur de séquence .

uniq h|wc -l

Pour réinitialiser une séquence , il recherchera «hier» en h et la tronquera s'il n'est pas trouvé.

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

Bash, 102 octets

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

Attention, ne vous exécutez dans aucun dossier qui vous intéresse. Il supprime tout fichier non consulté au cours du dernier jour dans le répertoire de travail.

Utilise un fichier apour stocker des données, en utilisant les horodatages accessibles / modifiés.

orlp
la source
2

Goruby, 85 octets

Exécutez avec le drapeau d'interprète -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!"

Il fonctionne en stockant un nouveau fichier pour chaque jour où il est invoqué, puis compte le nombre de fichiers consécutifs en arrière pour obtenir la longueur de la séquence. Il ne supprime jamais les fichiers, donc il finira par, après un très, très, très, très, très long temps, remplir votre disque dur, une poignée d'octets à la fois.

En voici une version non golfée:

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
la source
1

Python 3, 213 octets

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
la source
1

Bash + coreutils, 120 97 octets

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 ligne bash ci-dessus contient 95 octets.

Il y a un deuxième fichier appelé f qui ne contient qu'un seul caractère:

0

(Le programme écrit sur f.)

Je pense donc que le nombre total d'octets doit être marqué comme 97 (95 octets pour le contenu du fichier bash, 1 octet pour le contenu du fichier externe et 1 octet car 1 fichier autre que le programme est utilisé). Ceci est basé sur le comptage des octets pour les programmes multi-fichiers .

Remarque: Merci à @orlp d'avoir souligné qu'une réponse antérieure à cela que j'avais publiée était un non-sens; J'avais complètement mal lu le problème. (Il a été publié comme une réponse différente, que j'ai supprimée.)

Mitchell Spector
la source
0

PowerShell , 95 octets

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

Essayez-le en ligne!

Explication

Je commence par écrire la date actuelle (au format de date courte) dans un fichier (nommé z).>>fonctionne comme d'habitude; s'ajoute, mais crée s'il n'existe pas.

Ensuite, je lis le contenu du fichier ligne par ligne avec Get-Content( gc), pipe through Get-Unique( gu) car il peut y avoir plusieurs entrées à partir de la même date, puis pipe through ForEach-Object(% ).

Dans la boucle, je crée un tableau à 2 éléments avec la valeur 0dans le premier élément et la valeur actuelle de $c( +1) dans le deuxième élément. L'utilisation ++$cme permet d'éviter d'envelopper quelque chose comme$c+1 entre parenthèses.

Ensuite, je indexe dans le tableau à deux éléments avec une comparaison booléenne, qui sera fusionnée en 0pour $falseou 1pour $true. Dans la comparaison, j'assigne à $dun [datetime]objet créé à partir de la date lue à partir de la ligne actuelle dans le fichier. Cet objet est comparé à $n, qui lors de la première exécution n'a pas encore été attribué, il ne correspondra donc jamais et $csera initialisé à 1, car la valeur de l'indexation est affectée à $c.

Ensuite, $nest rempli avec la prochaine date attendue, en ajoutant 1à l'objet datetime actuel. La clé ici est que 1Dcela signifie que c'est un [decimal]littéral. Pour une raison quelconque, lorsque vous ajoutez des nombres entiers à a [datetime], il est interprété comme des graduations, mais lorsque vous ajoutez des nombres à virgule flottante, ils sont interprétés comme des jours. Donc, cela remplit$n pour la prochaine itération.

L'effet est que le compteur est réinitialisé à chaque fois que la date actuelle ne correspond pas à la date "suivante" (qui est la date précédente plus 1 jour).

Enfin, le message est sorti.

briantiste
la source