Você tem uma série de dias!

15

Escreva um programa que monitore o número de dias consecutivos em que foi executado.

O dia é redefinido à meia-noite (o horário local do computador em que o programa é executado).

Se houver um dia em que o programa não seja executado, o contador será zerado.

Toda vez que o programa é executado, o contador deve subir um dia se for a primeira vez que o programa for executado naquele dia. Isso significa que, na primeira vez em que o programa for executado, ele deverá dizer: "Você tem uma sequência de 1 dia!"

A saída do programa está na forma: You have a [streak_length] day streak!

Você tem permissão para armazenar dados externamente ou modificar o código fonte - sua escolha.

Isso é , então o código mais curto em bytes vence!

Daniel
fonte
Tem que ser hora local? Ou pode ser apenas algum fuso horário?
Rɪᴋᴇʀ
@EasterlyIrk, o dia é redefinido à meia-noite, horário local.
Daniel
Então tem que ser local de onde está o computador? Ou pelo menos com o fuso horário em que o computador está ativado. Ele não pode usar o UTC independentemente?
Rɪᴋᴇʀ
@EasterlyIrk, tem que ser o fuso horário do computador #
Daniel Daniel
Ah ok. Obrigado por esclarecer.
Rɪᴋᴇʀ

Respostas:

4

Bater, 92, 90, 82 bytes

Golfe

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

EDITAR% S

  • Truncar arquivo, em vez de removê-lo, -8 bytes;
  • Substituído -daystart por ! -newermt para salvar 2 bytes.

Como funciona !

Cada vez que você inicia, anexa uma linha com a data atual ao arquivo h , por exemplo:

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

Em seguida, ele será usado uniqpara filtrar duplicatas (ou seja, vários lançamentos, no mesmo dia) e contar as linhas para obter o comprimento da sequência .

uniq h|wc -l

Para redefinir uma sequência , ela cumprimentará 'ontem' em h e truncará se não for encontrada.

grep `date -d-1day -I` h||>h
zepelim
fonte
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!

Aviso, não execute em nenhuma pasta de sua preferência. Exclui qualquer arquivo não acessado no último dia no diretório de trabalho.

Usa um arquivo apara armazenar dados, usando os registros de data e hora acessados ​​/ modificados.

orlp
fonte
2

Goruby, 85 bytes

Execute com o sinalizador de intérprete -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!"

Ele funciona armazenando um novo arquivo para cada dia em que é chamado e, em seguida, conta o número de arquivos consecutivos para trás para obter o comprimento da sequência. Ele nunca exclui arquivos e, eventualmente, depois de muito, muito, muito, muito, muito tempo, preenche seu disco rígido, alguns bytes de cada vez.

Aqui está uma versão não destruída:

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

A linha bash acima possui 95 bytes.

Há um segundo arquivo chamado f que contém apenas um único caractere:

0

(O programa grava em f.)

Portanto, acho que o número total de bytes deve ser pontuado como 97 (95 bytes para o conteúdo do arquivo bash, 1 byte para o conteúdo do arquivo externo e 1 byte porque 1 arquivo diferente do programa é usado). Isso é baseado na contagem de bytes para programas com vários arquivos .

Nota: Agradeço ao @orlp por apontar que uma resposta anterior que publiquei foi um absurdo; Eu tinha interpretado mal o problema completamente. (Foi postada como uma resposta diferente, que eu excluí.)

Mitchell Spector
fonte
0

PowerShell , 95 bytes

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

Experimente online!

Explicação

Começo escrevendo a data atual (em formato de data abreviada) em um arquivo (nomeado z).>>funciona como de costume; acrescenta, mas cria se não existir.

Em seguida, leio o conteúdo do arquivo linha por linha com Get-Content( gc), canalize através Get-Unique( gu), pois pode haver várias entradas a partir da mesma data, e canalize ForEach-Object(% ).

No loop, crio uma matriz de 2 elementos com o valor 0no primeiro elemento e o valor atual de $c( +1) no segundo elemento. Usar ++$cme permite evitar envolver algo como$c+1 parênteses.

Então eu indexo na matriz de dois elementos com uma comparação booleana, que será coalescida para 0for $falseou 1for $true. Na comparação, estou atribuindo a $dum [datetime]objeto criado a partir da data lida na linha atual no arquivo. Esse objeto é comparado a $n, o qual, na primeira execução, ainda não foi atribuído, portanto, nunca corresponderá e $cserá inicializado 1, pois o valor da indexação está sendo atribuído $c.

Em seguida, $né preenchido com a próxima data esperada, adicionando 1ao objeto de data e hora atual. A chave aqui é que 1Disso significa que é [decimal]literal. Por alguma razão, quando você adiciona números inteiros a [datetime], ele é interpretado como ticks, mas quando você adiciona números de ponto flutuante, eles são interpretados como dias. Portanto, isso é preenchido $npara a próxima iteração.

O efeito é que o contador é redefinido toda vez que a data atual não coincide com a "próxima" data (que é a data anterior mais 1 dia).

Finalmente, a mensagem é enviada.

briantist
fonte