(date -f 'd')>>z
gc z|gu|%{$c=(1,++$c)[($d=date $_)-eq$n]
$n=$d+1D}
"You have a $c day streak!"
Hãy thử trực tuyến!
Giải trình
Tôi bắt đầu bằng cách viết ngày hiện tại (ở định dạng ngày ngắn) ra một tệp (có tên z
). >>
hoạt động như bình thường; nối thêm, nhưng tạo ra nếu nó không tồn tại.
Tiếp theo, tôi đọc nội dung của dòng tệp theo dòng với Get-Content
( gc
), pipe through Get-Unique
( gu
) vì có thể có nhiều mục từ cùng một ngày, sau đó chuyển qua ForEach-Object
( %
).
Trong vòng lặp, tôi tạo một mảng 2 phần tử với giá trị 0
trong phần tử đầu tiên và giá trị hiện tại của $c
( +1
) trong phần tử thứ hai. Sử dụng ++$c
cho phép tôi tránh gói một cái gì đó như $c+1
trong ngoặc đơn.
Sau đó, tôi lập chỉ mục vào mảng hai phần tử với phép so sánh boolean, sẽ được kết hợp thành 0
cho $false
hoặc 1
cho $true
. Trong phần so sánh, tôi đang gán cho $d
một [datetime]
đối tượng được tạo từ ngày đọc từ dòng hiện tại trong tệp. Đối tượng đó được so sánh với $n
, trong lần chạy đầu tiên chưa được chỉ định, vì vậy nó sẽ không bao giờ khớp và $c
sẽ được khởi tạo 1
, vì giá trị của việc lập chỉ mục được gán cho $c
.
Tiếp theo, $n
được điền với ngày dự kiến tiếp theo, bằng cách thêm 1
vào đối tượng datetime hiện tại. Chìa khóa ở đây 1D
có nghĩa là nó [decimal]
theo nghĩa đen. Vì một số lý do khi bạn thêm số nguyên vào a [datetime]
, nó được hiểu là dấu tick, nhưng khi bạn thêm số dấu phẩy động, chúng được hiểu là ngày. Vì vậy, điều này cư trú $n
cho lần lặp tiếp theo.
Hiệu quả là bộ đếm được đặt lại mỗi lần ngày hiện tại không khớp với ngày "tiếp theo" (là ngày trước đó cộng với 1 ngày).
Cuối cùng tin nhắn là đầu ra.