(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 0
di elemen pertama, dan nilai saat ini dari $c
( +1
) di elemen kedua. Menggunakan++$c
memungkinkan saya untuk menghindari membungkus sesuatu seperti $c+1
di dalam tanda kurung.
Kemudian saya indeks ke dalam array dua elemen dengan perbandingan boolean, yang akan digabung menjadi 0
untuk $false
atau 1
untuk $true
. Dalam perbandingan, saya menugaskan ke $d
sebuah [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 $c
akan diinisialisasi 1
, karena nilai pengindeksan ditugaskan $c
.
Selanjutnya, $n
diisi dengan tanggal yang diharapkan berikutnya, dengan menambahkan 1
ke objek datetime saat ini. Kuncinya di sini adalah itu 1D
artinya [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 $n
untuk 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.