У вас денна смуга!


15

Напишіть програму, яка відстежує кількість запущених днів поспіль.

День скидається опівночі (місцевий час комп'ютера, на якому запускається програма).

Якщо є день, коли програма не запускається, лічильник скидається до нуля.

Кожен раз, коли програма запускається, лічильник повинен підніматися на один день, якщо це вперше запуск програми в цей день. Це означає, що при першому запуску програми слід сказати: "У вас 1-денна смуга!"

Вихід програми складається у вигляді: You have a [streak_length] day streak!

Вам дозволяється зберігати дані зовні або змінювати вихідний код - на ваш вибір.

Це , тому найкоротший код у байтах виграє!


Чи має бути місцевий час? Або це може бути просто будь-який часовий пояс?
Rɪᴋᴇʀ

@EasterlyIrk, день скидається о півночі за місцевим часом.
Даніель

Тож він повинен бути локальним, звідки комп'ютер? Або, принаймні, за часовим поясом, на якому працює комп’ютер. Він не може використовувати UTC незалежно?
Rɪᴋᴇʀ

@EasterlyIrk, це повинен бути часовий пояс комп'ютера
Даніель

Ага гаразд. Дякуємо за уточнення.
Rɪᴋᴇʀ

Відповіді:


4

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

Гольф

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

РЕДАКТИ

  • Обрізати файл, а не видаляти його, -8 байт;
  • Замінено -daystart з ! -newermt, щоб зберегти 2 байти.

Як це працює !

Кожен раз, коли ви запускаєте, додає рядок з поточною датою до файлу h , наприклад:

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

Потім він буде використовувати uniqдля фільтрації дублікатів (тобто декількох запусків, за один день) та підрахунку рядків, щоб отримати довжину смуги .

uniq h|wc -l

Щоб скинути смугу , вона буде перехоплюватися на "вчорашню" годину , і скоротити її, якщо її не буде знайдено.

grep `date -d-1day -I` h||>h

5

Bash, 102 байти

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

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

Використовує файл aдля зберігання даних, використовуючи доступні / модифіковані часові позначки.


2

Горуби, 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!"

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))

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

(Програма пише на f.)

Тому я думаю, що загальна кількість байтів повинна бути набрана як 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), труби через Get-Unique( gu) , так як там може бути кілька записів з однієї і тієї ж дати, то труба через ForEach-Object( %).

У циклі я створюю масив 2 елементів зі значенням 0у першому елементі та поточним значенням $c( +1) у другому елементі. Використання ++$cдозволяє мені уникати загортання чогось подібного $c+1до дужок.

Потім я індексую в масив двох елементів з булевим порівнянням, яке буде зв'язано 0для $falseабо 1для $true. У порівнянні, я присвоювання $dна [datetime]об'єкт , створений з моменту читання з поточного рядка в файлі. Цей об'єкт порівнюється з тим $n, якому під час першого запуску ще не було призначено, тому він ніколи не збігатиметься та $cбуде ініціалізований 1, оскільки значення індексації призначено $c.

Далі $nзаповнюється наступна очікувана дата шляхом додавання 1до поточного об'єкта date date . Ключовим тут є те, що 1Dце [decimal]буквально. Чомусь, коли ви додаєте цілі числа до а [datetime], це трактується як галочки, але коли ви додаєте числа з плаваючою комою, вони інтерпретуються як дні. Отже, це заповнюється $nдля наступної ітерації.

Ефект полягає в тому, що лічильник перезавантажується кожного разу, коли поточна дата не відповідає даті «наступної» (що є попередньою датою плюс 1 день).

Нарешті повідомлення виводиться.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.