Напишите программу, которая отслеживает количество дней, в течение которых она была запущена.
День сбрасывается в полночь (местное время компьютера, на котором запущена программа).
Если есть день, когда программа не запускается, счетчик обнуляется.
Каждый раз, когда программа запускается, счетчик должен увеличиваться на один день, если это программа запускается впервые в этот день. Это означает, что при первом запуске программы должно быть написано: «У вас есть 1-дневная полоса!»
Вывод программы в виде: You have a [streak_length] day streak!
Вам разрешено хранить данные извне или изменять исходный код - по вашему выбору.
Это код-гольф , поэтому выигрывает самый короткий код в байтах!
Ответы:
Bash,
92,90, 82 байтаGolfed
редактирует
Как это устроено !
Каждый раз, когда вы запускаете файл, в файл добавляется строка с текущей датой. h , например:
Затем он будет использоваться
uniq
для фильтрации дубликатов (т.е. нескольких запусков в течение одного дня) и подсчета строк, чтобы получить длину полосы .Чтобы сбросить полосу , она отобразит слово «вчера» в h и обрежет ее, если она не найдена.
источник
Баш, 102 байта
Предупреждение, не запускайте ни в одной папке, которая вас волнует. Он удаляет любой файл, к которому не обращались в последний день в рабочем каталоге.
Использует файл
a
для хранения данных, используя полученные / измененные временные метки.источник
Goruby, 85 байт
Запустите с флагом интерпретатора
-rdate
.Он работает, сохраняя новый файл для каждого дня, в который он был вызван, затем подсчитывает количество последовательных файлов в обратном направлении, чтобы получить длину полосы. Он никогда не удаляет файлы, поэтому он, в конце концов, через очень, очень, очень, очень, очень долгое время заполнит ваш жесткий диск, несколько байтов за раз.
Вот нелегкая версия этого:
источник
Python 3, 213 байт
источник
Bash + coreutils,
12097 байтВ строке bash выше 95 байтов.
Есть второй файл с именем f, который содержит только один символ:
(Программа пишет в ф.)
Поэтому я думаю, что общее количество байтов должно быть оценено как 97 (95 байтов для содержимого файла bash, 1 байт для содержимого внешнего файла и 1 байт, потому что используется 1 файл, отличный от программы). Это основано на подсчете байтов для многофайловых программ .
Примечание: Спасибо @orlp за то, что он указал, что более ранний ответ на этот вопрос, который я разместил, был ерундой; Я неправильно понял проблему. (Он был опубликован как другой ответ, который я удалил.)
источник
PowerShell , 95 байт
Попробуйте онлайн!
объяснение
Я начинаю с записи текущей даты (в коротком формате даты) в файл (с именем
z
).>>
работает как обычно; добавляет, но создает, если его не существует.Затем я прочитал содержимое файла построчно с
Get-Content
(gc
), pipe throughGet-Unique
(gu
), так как может быть несколько записей от одной даты, затем pipe throughForEach-Object
(%
).В цикле я создаю массив из 2 элементов со значением
0
в первом элементе и текущим значением$c
(+1
) во втором элементе. Использование++$c
позволяет мне не заключать$c+1
в скобки что-то похожее .Затем я индексирую в массив из двух элементов логическое сравнение, которое будет объединено для
0
for$false
или1
for$true
. В сравнении, я присваивание$d
на[datetime]
объект , созданный с момента чтения из текущей строки в файле. Этот объект сравнивается с тем$n
, который при первом запуске еще не был назначен, поэтому он никогда не будет соответствовать и$c
будет инициализирован1
, так как присваивается значение индексации$c
.Далее
$n
заполняется следующей ожидаемой датой, добавляя1
к текущему объекту datetime. Ключ здесь в том, что1D
это[decimal]
буквально. По какой-то причине, когда вы добавляете целые числа к a[datetime]
, это интерпретируется как тики, но когда вы добавляете числа с плавающей запятой, они интерпретируются как дни. Так что это заполняется$n
для следующей итерации.В результате счетчик сбрасывается каждый раз, когда текущая дата не совпадает со «следующей» датой (т.е. предыдущей датой плюс 1 день).
Наконец сообщение выводится.
источник