คุณมีแนววัน!


15

เขียนโปรแกรมที่ติดตามจำนวนวันติดต่อกันที่ถูกเรียกใช้

รีเซ็ตวันเวลาเที่ยงคืน (เวลาท้องถิ่นของคอมพิวเตอร์ที่เปิดโปรแกรม)

หากมีวันที่โปรแกรมไม่ทำงานตัวนับจะถูกรีเซ็ตเป็นศูนย์

ทุกครั้งที่มีการเรียกใช้โปรแกรมตัวนับควรขึ้นไปหนึ่งวันหากเป็นครั้งแรกที่โปรแกรมทำงานในวันนั้น ซึ่งหมายความว่าครั้งแรกที่มีการเรียกใช้โปรแกรมควรพูดว่า "คุณมีเวลา 1 วัน!"

ผลลัพธ์ของโปรแกรมอยู่ในรูปแบบ: You have a [streak_length] day streak!

คุณได้รับอนุญาตให้เก็บข้อมูลภายนอกหรือแก้ไขซอร์สโค้ด - - ตัวเลือกของคุณ

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!


ต้องเป็นเวลาท้องถิ่นหรือไม่ หรืออาจเป็นเพียงเขตเวลาใดก็ได้
Rɪᴋᴇʀ

@EasterlyIrk วันนี้จะรีเซ็ตเวลาเที่ยงคืนตามเวลาท้องถิ่น
แดเนียล

ดังนั้นต้องเป็นแบบโลคัลจากคอมพิวเตอร์อยู่ที่ไหน หรืออย่างน้อยก็ในช่วงเวลาที่ผู้ดำเนินการเปิด ไม่สามารถใช้ UTC ได้
Rɪᴋᴇʀ

@EasterlyIrk มันจะต้องมีโซนเวลาของคอมพิวเตอร์
แดเนียล

อ่าโอเค. ขอบคุณสำหรับการชี้แจง
Rɪᴋᴇʀ

คำตอบ:


4

ทุบตี, 92, 90, 82 ไบต์

แข็งแรงเล่นกอล์ฟ

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

การแก้ไข

  • ตัดไฟล์แทนการลบ -8 ไบต์
  • แทนที่ - เริ่มต้นวันด้วย! - ไม่ต้องบันทึก 2 ไบต์

มันทำงานอย่างไร !

ทุกครั้งที่คุณเรียกใช้มันจะเพิ่มบรรทัดที่มีวันที่ปัจจุบันลงในไฟล์hเช่น:

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

จากนั้นจะใช้uniqเพื่อกรองรายการที่ซ้ำกัน (เช่นการเปิดตัวหลายครั้งภายในวันเดียวกัน) และนับจำนวนบรรทัดเพื่อให้ได้ความยาวตามแนว

uniq h|wc -l

หากต้องการรีเซ็ตแนวใหม่มันจะ grep สำหรับ 'เมื่อวานนี้' ในชั่วโมงและตัดถ้าไม่พบ

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

Goruby, 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$c1$cตั้งแต่ค่าของดัชนีจะถูกมอบหมายให้

ถัดไป$nจะเติมด้วยวันที่คาดหวังถัดไปโดยการเพิ่ม1วัตถุวันที่และเวลาปัจจุบัน กุญแจนี่คือนั่น1Dหมายความว่ามันเป็น[decimal]ตัวอักษร ด้วยเหตุผลบางอย่างเมื่อคุณเพิ่มตัวเลขจำนวนเต็มลงใน a [datetime]มันถูกตีความว่าเป็นเห็บ แต่เมื่อคุณเพิ่มหมายเลขจุดลอยตัวพวกเขาจะถูกตีความว่าเป็นวัน ดังนั้นสิ่งนี้จะเติม$nสำหรับการทำซ้ำครั้งถัดไป

ผลกระทบคือตัวนับได้รับการรีเซ็ตทุกครั้งที่วันที่ปัจจุบันไม่ตรงกับวันที่ "ถัดไป" (ซึ่งเป็นวันที่ก่อนหน้านี้บวก 1 วัน)

ในที่สุดข้อความก็จะถูกส่งออก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.