Anda memiliki beruntun hari!

15

Tulis program yang mencatat jumlah hari berturut-turut yang telah dijalankan.

Hari direset pada tengah malam (waktu lokal komputer tempat program dijalankan).

Jika ada hari di mana program tidak berjalan, penghitung diatur ulang ke nol.

Setiap kali program dijalankan, penghitung akan naik satu hari jika itu adalah pertama kalinya program dijalankan hari itu. Ini berarti bahwa pertama kali program dijalankan, itu harus mengatakan, "Anda memiliki 1 hari beruntun!"

Output dari program ini adalah dalam bentuk: You have a [streak_length] day streak!

Anda diizinkan untuk menyimpan data secara eksternal atau memodifikasi kode sumber –– pilihan Anda.

Ini adalah , jadi kode terpendek dalam byte menang!

Daniel
sumber
Apakah harus jam lokal? Atau bisakah itu hanya zona waktu saja?
Rɪᴋᴇʀ
@EasterlyIrk, hari ini direset pada tengah malam waktu setempat.
Daniel
Jadi itu harus lokal dari tempat komputer itu berada? Atau setidaknya zona waktu yang dihidupkan konsumen. Tidak bisa menggunakan UTC, terlepas?
Rɪᴋᴇʀ
@EasterlyIrk, itu harus menjadi zona waktu komputer
Daniel
Ah baiklah. Terima kasih telah mengklarifikasi.
Rɪᴋᴇʀ

Jawaban:

4

Pesta, 92, 90, 82 byte

Golf

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

EDIT

  • Pangkas file, alih-alih menghapusnya, -8 byte;
  • Diganti -hari dengan ! -baru untuk menyimpan 2 byte.

Bagaimana itu bekerja !

Setiap kali Anda meluncurkannya akan menambahkan baris dengan tanggal saat ini ke file h , misalnya:

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

Kemudian akan digunakan uniquntuk menyaring duplikat (yaitu beberapa peluncuran, pada hari yang sama), dan menghitung garis untuk mendapatkan panjang garis .

uniq h|wc -l

Untuk mengatur ulang goresan , itu akan menangkap untuk 'kemarin' di h , dan memotongnya jika tidak ditemukan.

grep `date -d-1day -I` h||>h
zeppelin
sumber
5

Bash, 102 byte

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

Peringatan, jangan tidak berjalan di setiap folder yang Anda pedulikan. Itu menghapus file yang tidak diakses pada hari terakhir di direktori kerja.

Menggunakan file auntuk menyimpan data, menggunakan cap waktu yang diakses / dimodifikasi.

orlp
sumber
2

Goruby, 85 Bytes

Jalankan dengan bendera juru bahasa -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!"

Ini bekerja dengan menyimpan file baru untuk setiap hari yang diminta, kemudian menghitung jumlah file berturut-turut mundur untuk mendapatkan panjang garis. Itu tidak pernah menghapus file, sehingga akan, pada akhirnya, setelah waktu yang sangat, sangat, sangat, sangat, sangat, sangat mengisi hard drive Anda, beberapa byte pada suatu waktu.

Berikut ini adalah versi yang tidak dipisahkan:

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!"
Pengawas
sumber
1

Python 3, 213 byte

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
sumber
1

Bash + coreutils, 120 97 byte

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!

Garis bash di atas memiliki 95 byte di dalamnya.

Ada file kedua bernama f yang hanya berisi satu karakter:

0

(Program menulis ke f.)

Jadi saya pikir jumlah total byte harus dinilai sebagai 97 (95 byte untuk isi file bash, 1 byte untuk isi file eksternal, dan 1 byte karena 1 file selain dari program yang digunakan). Ini didasarkan pada Menghitung byte untuk program multi-file .

Catatan: Terima kasih kepada @orlp karena menunjukkan bahwa jawaban yang lebih awal untuk ini yang saya posting adalah omong kosong; Saya salah membaca masalahnya. (Itu diposting sebagai jawaban yang berbeda, yang telah saya hapus.)

Mitchell Spector
sumber
0

PowerShell , 95 byte

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

Cobalah online!

Penjelasan

Saya mulai dengan menulis tanggal saat ini (dalam format tanggal pendek) ke file (bernama z). >>bekerja seperti biasa; menambahkan, tetapi membuat jika tidak ada.

Selanjutnya, saya membaca isi file baris demi baris dengan Get-Content( gc), pipe through Get-Unique( gu) karena mungkin ada beberapa entri dari tanggal yang sama, lalu pipe through ForEach-Object( %).

Dalam loop, saya membuat array elemen 2 dengan nilai 0di elemen pertama, dan nilai saat ini dari $c( +1) di elemen kedua. Menggunakan++$c memungkinkan saya untuk menghindari membungkus sesuatu seperti $c+1di dalam tanda kurung.

Kemudian saya indeks ke dalam array dua elemen dengan perbandingan boolean, yang akan digabung menjadi 0untuk $falseatau 1untuk $true. Dalam perbandingan, saya menugaskan ke $dsebuah [datetime]objek yang dibuat dari tanggal dibaca dari baris saat ini dalam file. Objek itu dibandingkan dengan $n, yang pada run pertama belum ditetapkan, jadi itu tidak akan pernah cocok, dan $cakan diinisialisasi 1, karena nilai pengindeksan ditugaskan $c.

Selanjutnya, $ndiisi dengan tanggal yang diharapkan berikutnya, dengan menambahkan 1ke objek datetime saat ini. Kuncinya di sini adalah itu 1Dartinya [decimal]literal. Untuk beberapa alasan ketika Anda menambahkan angka integer ke a[datetime] , itu ditafsirkan sebagai kutu, tetapi ketika Anda menambahkan angka floating point, mereka ditafsirkan sebagai hari. Jadi ini mengisi $nuntuk iterasi berikutnya.

Efeknya adalah bahwa penghitung akan disetel ulang setiap kali tanggal saat ini tidak cocok dengan tanggal "berikutnya" (yang merupakan tanggal sebelumnya ditambah 1 hari).

Akhirnya pesan adalah keluaran.

briantis
sumber