आपके पास एक दिन की लकीर है!


15

एक प्रोग्राम लिखें जो लगातार चलने वाले दिनों की संख्या पर नज़र रखता है।

दिन आधी रात (कंप्यूटर का स्थानीय समय जिस पर प्रोग्राम चलाया जाता है) पर रहता है।

यदि कोई दिन है कि कार्यक्रम नहीं चलाया जाता है, तो काउंटर शून्य पर रीसेट हो जाता है।

जब भी कार्यक्रम चलाया जाता है, तो काउंटर को एक दिन ऊपर जाना चाहिए अगर यह उस दिन पहली बार कार्यक्रम चलाया जाता है। इसका मतलब यह है कि पहली बार कार्यक्रम चलाया जाता है, यह कहना चाहिए, "आपके पास 1 दिन की लकीर है!"

कार्यक्रम का आउटपुट फॉर्म में है: You have a [streak_length] day streak!

आपको डेटा को बाह्य रूप से संग्रहीत करने या स्रोत कोड को संशोधित करने की अनुमति है-अपनी पसंद।

यह , इसलिए बाइट्स जीत में सबसे छोटा कोड है!


क्या इसके लिए स्थानीय समय होना चाहिए? या यह किसी भी समय क्षेत्र हो सकता है?
R

@EasterlyIrk, दिन मध्यरात्रि स्थानीय समय पर रहता है।
डैनियल

तो यह स्थानीय होना है जहां से कंप्यूटर है? या कम से कम waht timezone पर comptuer चालू है। यह परवाह किए बिना UTC का उपयोग नहीं कर सकता है?
R

@ तेजी से, यह कंप्यूटर का समय क्षेत्र होना चाहिए
डैनियल

आह ठीक है। स्पष्टीकरण देने के लिए धन्यवाद।
R

जवाबों:


4

दे घुमा के, 92, 90, 82 बाइट्स

golfed

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

संपादन

  • ट्रंकट फ़ाइल, इसे हटाने के बजाय; -8 बाइट्स;
  • के साथ बदल दिया -स्टार्ट ! 2 बाइट बचाने के लिए -newermt

यह काम किस प्रकार करता है !

हर बार जब आप इसे लॉन्च करते हैं, तो वर्तमान तिथि के साथ फाइल h के लिए एक पंक्ति संलग्न होगी , जैसे:

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

यह तब uniqडुप्लिकेट को फ़िल्टर करने के लिए उपयोग करेगा (यानी एक ही दिन के भीतर कई लॉन्च), और लकीर की लंबाई पाने के लिए लाइनों की गिनती करें ।

uniq h|wc -l

एक लकीर को रीसेट करने के लिए , यह h में 'कल' के लिए grep करेगा , और नहीं मिलने पर इसे काट देगा।

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

5

बैश, 102 बाइट्स

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

चेतावनी, किसी भी ऐसे फ़ोल्डर में चलें जिसकी आपको परवाह है। यह किसी भी फ़ाइल को अंतिम दिन तक नहीं पहुँचाता है जो कार्यशील निर्देशिका में होती है।

aएक्सेस / संशोधित टाइमस्टैम्प का उपयोग करके डेटा को संग्रहीत करने के लिए फ़ाइल का उपयोग करता है।


2

गोरबी, 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!"

यह प्रत्येक दिन के लिए एक नई फ़ाइल संग्रहीत करके काम करता है, जिस पर इसे लागू किया जाता है, फिर स्ट्रीक की लंबाई प्राप्त करने के लिए लगातार पीछे की संख्या की गिनती करता है। यह कभी भी फ़ाइलों को नहीं हटाता है, इसलिए यह, अंततः, बहुत, बहुत, बहुत, बहुत लंबे समय के बाद, आपकी हार्ड ड्राइव को भर देगा, एक समय में एक मुट्ठी भर बाइट्स।

यहाँ इसका एक ungolfed संस्करण है:

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

पायथन 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

बैश + कोरुटिल्स, 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!

ऊपर की बैश लाइन में 95 बाइट्स हैं।

वहाँ एक दूसरी फ़ाइल है जिसे f कहा जाता है जिसमें सिर्फ एक ही वर्ण होता है:

0

(कार्यक्रम च को लिखता है।)

इसलिए मुझे लगता है कि बाइट की कुल संख्या 97 (95 बाइट्स की सामग्री के लिए बैश फ़ाइल की सामग्री के लिए, 1 बाइट बाहरी फ़ाइल की सामग्री के लिए, और 1 बाइट के रूप में होनी चाहिए क्योंकि प्रोग्राम के अलावा 1 फ़ाइल का उपयोग किया जाता है)। यह मल्टी-फाइल प्रोग्राम के लिए काउंटिंग बाइट्स पर आधारित है

नोट: @orlp को इंगित करने के लिए धन्यवाद कि इससे पहले का उत्तर जो मैंने पोस्ट किया था वह बकवास था; मैंने समस्या को पूरी तरह से गलत बताया था। (यह एक अलग उत्तर के रूप में पोस्ट किया गया था, जिसे मैंने हटा दिया है।)


0

पॉवरशेल , 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( %)।

लूप में, मैं 0पहले तत्व में मान के साथ 2 तत्व सरणी बनाता हूं , और दूसरे तत्व में $c( +1) का वर्तमान मूल्य । उपयोग ++$cकरने से मुझे $c+1कोष्ठकों में कुछ लपेटने से बचने की अनुमति मिलती है।

फिर एक बूलियन तुलना है, जो करने के लिए एकत्रित हो जाएगी साथ दो तत्व सरणी में मैं सूचकांक 0के लिए $falseया 1के लिए $true। तुलना के भीतर, मैं फ़ाइल में वर्तमान लाइन से पढ़ी गई तिथि से बनाई गई $dकिसी [datetime]वस्तु को असाइन कर रहा हूं । उस ऑब्जेक्ट की तुलना में हो जाता है $n, जिसे पहले रन के लिए अभी तक असाइन नहीं किया गया है, इसलिए यह कभी भी मेल नहीं खाएगा, और $cइसे इनिशियलाइज़ किया जाएगा 1, क्योंकि इंडेक्सिंग के मूल्य को सौंपा जा रहा है $c

इसके बाद, वर्तमान डेटाटाइम ऑब्जेक्ट में $nजोड़कर, अगली अपेक्षित तिथि के साथ आबादी है 1। यहाँ कुंजी यह है कि 1Dइसका अर्थ है एक [decimal]शाब्दिक। किसी कारण से जब आप पूर्णांक संख्याओं को एक में जोड़ते हैं [datetime], तो इसे टिक्स के रूप में व्याख्या किया जाता है, लेकिन जब आप फ़्लोटिंग पॉइंट संख्या जोड़ते हैं, तो उन्हें दिनों के रूप में व्याख्या की जाती है। तो यह $nअगले पुनरावृत्ति के लिए पॉप्युलेट करता है।

इसका प्रभाव यह है कि काउंटर को हर बार रीसेट किया जाता है जब वर्तमान तिथि "अगली" तारीख (जो कि पिछली तारीख से अधिक 1 दिन है) से मेल नहीं खाती है।

अंत में संदेश आउटपुट है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.