У вас есть дневная полоса!

15

Напишите программу, которая отслеживает количество дней, в течение которых она была запущена.

День сбрасывается в полночь (местное время компьютера, на котором запущена программа).

Если есть день, когда программа не запускается, счетчик обнуляется.

Каждый раз, когда программа запускается, счетчик должен увеличиваться на один день, если это программа запускается впервые в этот день. Это означает, что при первом запуске программы должно быть написано: «У вас есть 1-дневная полоса!»

Вывод программы в виде: You have a [streak_length] day streak!

Вам разрешено хранить данные извне или изменять исходный код - по вашему выбору.

Это , поэтому выигрывает самый короткий код в байтах!

Даниил
источник
Это должно быть местное время? Или это может быть какой-то часовой пояс?
Rɪᴋᴇʀ
@EasterlyIrk, день сбрасывается в полночь по местному времени.
Даниэль
Так должно быть локально, откуда компьютер? Или, по крайней мере, в каком часовом поясе включен компьютер. Это не может использовать UTC независимо от?
17
@EasterlyIrk, это должен быть часовой пояс компьютера
Даниэль
Ах хорошо. Спасибо за разъяснение.
17

Ответы:

4

Bash, 92, 90, 82 байта

Golfed

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

редактирует

  • Обрезать файл, вместо того, чтобы удалить его, -8 байт;
  • Заменено -деньстарт с ! -newermt, чтобы сохранить 2 байта.

Как это устроено !

Каждый раз, когда вы запускаете файл, в файл добавляется строка с текущей датой. h , например:

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

Затем он будет использоваться uniqдля фильтрации дубликатов (т.е. нескольких запусков в течение одного дня) и подсчета строк, чтобы получить длину полосы .

uniq h|wc -l

Чтобы сбросить полосу , она отобразит слово «вчера» в h и обрежет ее, если она не найдена.

grep `date -d-1day -I` h||>h
дирижабль
источник
5

Баш, 102 байта

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

Предупреждение, не запускайте ни в одной папке, которая вас волнует. Он удаляет любой файл, к которому не обращались в последний день в рабочем каталоге.

Использует файл aдля хранения данных, используя полученные / измененные временные метки.

orlp
источник
2

Goruby, 85 байт

Запустите с флагом интерпретатора -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!"

Он работает, сохраняя новый файл для каждого дня, в который он был вызван, затем подсчитывает количество последовательных файлов в обратном направлении, чтобы получить длину полосы. Он никогда не удаляет файлы, поэтому он, в конце концов, через очень, очень, очень, очень, очень долгое время заполнит ваш жесткий диск, несколько байтов за раз.

Вот нелегкая версия этого:

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
источник
1

Python 3, 213 байт

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
источник
1

Bash + coreutils, 120 97 байт

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!

В строке bash выше 95 байтов.

Есть второй файл с именем f, который содержит только один символ:

0

(Программа пишет в ф.)

Поэтому я думаю, что общее количество байтов должно быть оценено как 97 (95 байтов для содержимого файла bash, 1 байт для содержимого внешнего файла и 1 байт, потому что используется 1 файл, отличный от программы). Это основано на подсчете байтов для многофайловых программ .

Примечание: Спасибо @orlp за то, что он указал, что более ранний ответ на этот вопрос, который я разместил, был ерундой; Я неправильно понял проблему. (Он был опубликован как другой ответ, который я удалил.)

Митчелл Спектор
источник
0

PowerShell , 95 байт

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

Попробуйте онлайн!

объяснение

Я начинаю с записи текущей даты (в коротком формате даты) в файл (с именем z). >>работает как обычно; добавляет, но создает, если его не существует.

Затем я прочитал содержимое файла построчно с Get-Content( gc), pipe through Get-Unique( gu), так как может быть несколько записей от одной даты, затем pipe through ForEach-Object( %).

В цикле я создаю массив из 2 элементов со значением 0в первом элементе и текущим значением $c( +1) во втором элементе. Использование ++$cпозволяет мне не заключать $c+1в скобки что-то похожее .

Затем я индексирую в массив из двух элементов логическое сравнение, которое будет объединено для 0for $falseили 1for $true. В сравнении, я присваивание $dна [datetime]объект , созданный с момента чтения из текущей строки в файле. Этот объект сравнивается с тем $n, который при первом запуске еще не был назначен, поэтому он никогда не будет соответствовать и $cбудет инициализирован 1, так как присваивается значение индексации $c.

Далее $nзаполняется следующей ожидаемой датой, добавляя 1к текущему объекту datetime. Ключ здесь в том, что 1Dэто [decimal]буквально. По какой-то причине, когда вы добавляете целые числа к a [datetime], это интерпретируется как тики, но когда вы добавляете числа с плавающей запятой, они интерпретируются как дни. Так что это заполняется $nдля следующей итерации.

В результате счетчик сбрасывается каждый раз, когда текущая дата не совпадает со «следующей» датой (т.е. предыдущей датой плюс 1 день).

Наконец сообщение выводится.

briantist
источник