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 é código-golfe , então o código mais curto em bytes vence!
Respostas:
Bater,
92,90, 82 bytesGolfe
EDITAR% S
Como funciona !
Cada vez que você inicia, anexa uma linha com a data atual ao arquivo h , por exemplo:
Em seguida, ele será usado
uniq
para filtrar duplicatas (ou seja, vários lançamentos, no mesmo dia) e contar as linhas para obter o comprimento da sequência .Para redefinir uma sequência , ela cumprimentará 'ontem' em h e truncará se não for encontrada.
fonte
Bash, 102 bytes
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
a
para armazenar dados, usando os registros de data e hora acessados / modificados.fonte
Goruby, 85 bytes
Execute com o sinalizador de intérprete
-rdate
.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:
fonte
Python 3, 213 bytes
fonte
Bash + coreutils,
12097 bytesA linha bash acima possui 95 bytes.
Há um segundo arquivo chamado f que contém apenas um único caractere:
(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í.)
fonte
PowerShell , 95 bytes
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ésGet-Unique
(gu
), pois pode haver várias entradas a partir da mesma data, e canalizeForEach-Object
(%
).No loop, crio uma matriz de 2 elementos com o valor
0
no primeiro elemento e o valor atual de$c
(+1
) no segundo elemento. Usar++$c
me 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
0
for$false
ou1
for$true
. Na comparação, estou atribuindo a$d
um[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$c
será inicializado1
, pois o valor da indexação está sendo atribuído$c
.Em seguida,
$n
é preenchido com a próxima data esperada, adicionando1
ao objeto de data e hora atual. A chave aqui é que1D
isso 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$n
para 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.
fonte