Bạn có một ngày ngày!


15

Viết chương trình theo dõi số ngày liên tiếp được chạy.

Ngày đặt lại vào nửa đêm (giờ địa phương của máy tính chạy chương trình).

Nếu có một ngày chương trình không chạy, bộ đếm được đặt lại về không.

Mỗi khi chương trình được chạy, bộ đếm sẽ tăng lên một ngày nếu đó là lần đầu tiên chương trình được chạy vào ngày đó. Điều này có nghĩa là lần đầu tiên chương trình được chạy, nó sẽ nói: "Bạn có chuỗi 1 ngày!"

Đầu ra của chương trình có dạng: You have a [streak_length] day streak!

Bạn được phép lưu trữ dữ liệu từ bên ngoài hoặc sửa đổi mã nguồn của Google.

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!


Nó có phải là giờ địa phương? Hoặc nó chỉ có thể là bất kỳ múi giờ?
Rɪᴋᴇʀ

@EasterlyIrk, ngày đặt lại vào nửa đêm theo giờ địa phương.
Daniel

Vì vậy, nó phải là địa phương từ nơi máy tính là? Hoặc ít nhất là múi giờ của máy tính đang bật. Nó không thể sử dụng UTC bất kể?
Rɪᴋᴇʀ

@EasterlyIrk, nó phải là múi giờ của máy tính
Daniel

À được rồi. Cảm ơn đã làm rõ.
Rɪᴋᴇʀ

Câu trả lời:


4

Bash, 92, 90, 82 byte

Chơi gôn

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

EDITS

  • Cắt bớt tệp, thay vì loại bỏ nó, -8 byte;
  • Đã thay thế-ngày bắt đầu với ! -newermt để lưu 2 byte.

Làm thế nào nó hoạt động !

Mỗi khi bạn khởi chạy, nó sẽ nối một dòng có ngày hiện tại vào tệp h , ví dụ:

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

Sau đó, nó sẽ sử dụng uniqđể lọc các bản sao (tức là nhiều lần khởi chạy, trong cùng một ngày) và đếm các dòng để có được độ dài chuỗi .

uniq h|wc -l

Để thiết lập lại một vệt , nó sẽ grep cho 'ngày hôm qua' trong h và cắt bớt nó nếu không tìm thấy.

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

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!

Cảnh báo, không chạy trong bất kỳ thư mục bạn quan tâm. Nó xóa bất kỳ tập tin không được truy cập vào ngày cuối cùng trong thư mục làm việc.

Sử dụng một tệp ađể lưu trữ dữ liệu, sử dụng dấu thời gian được truy cập / sửa đổi.


2

Goruby, 85 byte

Chạy với cờ phiên dịch -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!"

Nó hoạt động bằng cách lưu trữ một tệp mới cho mỗi ngày mà nó được gọi, sau đó đếm số lượng tệp liên tiếp ngược lại để có được độ dài của chuỗi. Nó không bao giờ xóa các tập tin, vì vậy, cuối cùng, sau một thời gian rất, rất, rất, rất lâu, sẽ lấp đầy ổ cứng của bạn, một số byte mỗi lần.

Đây là một phiên bản chưa được chỉnh sửa của nó:

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

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!

Dòng bash ở trên có 95 byte trong đó.

Có một tệp thứ hai được gọi là f chỉ chứa một ký tự:

0

(Chương trình ghi vào f.)

Vì vậy, tôi nghĩ rằng tổng số byte nên được ghi là 97 (95 byte cho nội dung của tệp bash, 1 byte cho nội dung của tệp bên ngoài và 1 byte vì 1 tệp không phải là chương trình được sử dụng). Điều này dựa trên Đếm byte cho các chương trình nhiều tệp .

Lưu ý: Cảm ơn @orlp đã chỉ ra rằng một câu trả lời trước đó cho điều này mà tôi đã đăng là vô nghĩa; Tôi đã đọc sai vấn đề hoàn toàn. (Nó được đăng dưới dạng một câu trả lời khác mà tôi đã xóa.)


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!"

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ị 0trong 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 ++$ccho phép tôi tránh gói một cái gì đó như $c+1trong 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 0cho $falsehoặc 1cho $true. Trong phần so sánh, tôi đang gán cho $dmộ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à $csẽ đượ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 1vào đối tượng datetime hiện tại. Chìa khóa ở đây 1Dcó 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ú $ncho 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.