कितने सप्ताह?


13

आपका कार्य एकल संख्या का उत्पादन करना है; आईएसओ सप्ताह की संख्या जो एक निश्चित तिथि सीमा को काटती है। विकिपीडिया को उद्धृत करने के लिए: An average year is exactly 52.1775 weeks longलेकिन यह औसत के बारे में नहीं है।

इनपुट में दो अलग-अलग आईएसओ तिथियां शामिल हैं:

0047-12-24 2013-06-01

अंतिम तिथि प्रारंभ तिथि से पहले कभी नहीं होती है। हम सरलता के लिए एक्सट्रपलेटेड ग्रेगोरियन कैलेंडर का उपयोग करेंगे।

परीक्षण के मामलों:

Format: input -> output
2015-12-31 2016-01-01 -> 1    (both are within week 53 of 2015)
2016-01-03 2016-01-04 -> 2    (the 3rd is within week 53, and the 4th is in week 1)
2015-12-24 2015-12-24 -> 1    (this single day is of course within a single week)

अपने समाधान के बीच 0001-01-01और तारीखों को संभालना चाहिए 9999-12-31


2
क्या इनपुट एकल स्पेस-पृथक स्ट्रिंग के बजाय स्ट्रिंग्स का एक सरणी हो सकता है? वैकल्पिक रूप से, क्या दो तिथियां एक फ़ंक्शन के लिए दो तर्क हो सकती हैं?
दरवाज़े


इसके अलावा, सप्ताह रविवार या सोमवार से शुरू होता है? आपके दूसरे परीक्षण के मामले के अनुसार, यह सोमवार है, लेकिन सिर्फ यह सुनिश्चित कर रहा है।
दरवाज़े

@Doorknob quote विकिपीडिया उद्धरण: "प्रारूप YYYY में आईएसओ सप्ताह-क्रमांक वर्ष द्वारा एक तिथि निर्दिष्ट की जाती है, प्रारूप में एक सप्ताह संख्या 'डब्ल्यू' द्वारा उपसर्ग किया जाता है, और कार्यदिवस संख्या, 7 से 1 के बीच एक अंक d , सोमवार से शुरू होता है और रविवार के साथ समाप्त होता है "तो आईएसओ 8601 के अनुसार सोमवार से शुरू हो रहा है
तेंसीबाई

2
आईएसओ मानक के अनुसार,Weeks start with Monday.
फिलिप हगलुंड

जवाबों:


2

रूबी, 89 88 86 बाइट्स

->s{a,b=s.split.map{|x|Time.gm *x.split(?-)}
n=1
(a+=86400).wday==1&&n+=1until a==b
n}

एक बहुत ही आदिम समाधान: पहली तारीख aऔर दूसरी तारीख b, वेतन वृद्धि a, यह देखते हुए कि यह सोमवार है (यदि ऐसा है, तो हमने "एक सप्ताह के लिए" लुढ़का हुआ है), और एक बार रोक दिया aहै b

प्रश्न में निर्दिष्ट सटीक प्रारूप में इनपुट लेता है: एक एकल स्थान-पृथक स्ट्रिंग। (जिस तरह से यह इनपुट पार्स करता है वह फैंसी-ईश है: यह रूबी के "स्प्लैट" ऑपरेटर का उपयोग करता है *। यह ऑपरेटर एक सरणी या बाहर निकालने योग्य "विस्तार" करता है, इसलिए Time.gm *[2013, 06, 01]बन जाता है Time.gm 2013, 06, 01।)

एक टिप्पणी चर्चा से आयातित:

हम "एक वर्ष में सप्ताह" के बारे में परवाह नहीं करते हैं; हम केवल "सप्ताह कुल मिलाकर" की परवाह करते हैं। तो क्या एक वर्ष में ५२ या ५३ सप्ताह का कोई फर्क नहीं पड़ता।

भविष्य में भ्रम से बचने के लिए कि क्या यह वर्ष की सीमाओं को सही ढंग से संभालता है - विकिपीडिया के अनुसार , सभी सप्ताह हमेशा सोमवार से शुरू होते हैं और रविवार को समाप्त होते हैं।

कुछ और फैंसी ट्रिक्स के लिए, ये सभी समान हैं:

until a==b;a+=86400;n+=a.wday==1?1:0;end
[a+=86400,n+=a.wday==1?1:0]until a==b
n+=(a+=86400).wday==1?1:0 until a==b
(a+=86400).wday==1&&n+=1 until a==b
(a+=86400).wday==1&&n+=1until a==b

आप 1 वर्ण की जगह बचा सकता है नहीं कर सकते a==bद्वारा a<b?
तनीसीबाई

1

VBA, 125 बाइट्स

स्ट्रिंग के रूप में 2 फ़ंक्शन इनपुट की अपेक्षा करना

Function u(k,j)
f=DateValue(k)
For i=0 To (DateValue(j)-f)
q=DatePart("ww",f+i,2,2)
If q<>j Then u=u+1
j=q
Next
End Function

बहुत यकीन है कि यह गोल्फ हो सकता है। यह 2 तिथियों के बीच हर रोज लूपिंग है और हर बार आईएसओ तिथि में परिवर्तन होने पर काउंटर बढ़ाता है।

DatePart("ww",f+i,2,2)VBA में आईएसओ सप्ताह संख्या पहले 2 का मतलब है Monday (complies with ISO standard 8601, section 3.17)। तो दूसरा 2 का मतलब हैWeek that has at least four days in the new year (complies with ISO standard 8601, section 3.17)

140 बाइट्स w / एकल इनपुट

Function g(k)
y=Split(k)
f=DateValue(y(0))
For i=0 To (DateValue(y(1))-f)
q=DatePart("ww",f+i,2,2)
If q<>j Then g=g+1
j=q
Next
End Function

1

आर, 76 बाइट्स

d=as.Date(scan("","raw"));sum(strftime(seq(d[1],d[2],"day")[-1],"%w")==1)+1

@ डॉर्कनोब के साथ बात करने के बाद, सोमवार को मतगणना करना जितना आसान है।

seq तारीखों का एक वेक्टर बनाने की अनुमति दें (दो तिथियों के बीच प्रत्येक दिन की) और स्ट्रैफ़टाइम इसे 'सप्ताह में दिन की संख्या' में बदल दें, अब समय को गिनता है कि आपके द्वारा सप्ताह में बदले गए समय की संख्या प्राप्त करने और 1 जोड़ने के लिए 1 है पिछले सप्ताह ध्यान में रखें।

एक और दृष्टिकोण लूपिंग:

आर, 85 बाइट्स

n=1;d=as.Date(scan("","raw"));z=d[1];while(z<d[2]){n=n+(strftime(z<-z+1,"%w")==1)};n

1
अपने दूसरे दृष्टिकोण के बारे में, आपको सोमवार की कुल संख्या में 1 को जोड़ना चाहिए यदि पहली तारीख सोमवार को नहीं पड़ती है।
डेविड डे

@DavidCarraher धन्यवाद, आपके उत्तर को पढ़कर मुझे लगा कि मैं रेंज के पहले दिन को हटा सकता हूं, इस प्रकार समस्या को ठीक कर सकता हूं :)
तेनसीबाई

0

गणितज्ञ 135 79 96 96 84 बाइट्स

@ Doorknob के सुझाव के अनुरूप, यह

  • रेंज में सभी तिथियां उत्पन्न करता है

  • सोमवार ( ISOWeekDay= "1") की संख्या DateRangeको छोड़कर (छोड़कर d), और

  • 1कुल में जोड़ता है।


Count[DateString[#,"ISOWeekDay"]&/@Rest@(DateRange@@StringSplit@#),"1"]+1&

Count[DateString[#,"ISOWeekDay"]&/@Rest@(DateRange@@StringSplit@#),"1"]+1&
/@ {"2015-12-31 2016-01-01", "2016-01-04 2016-01-05","2016-01-03 2016-01-04", 
"2015-12-24 2015-12-24", "1876-12-24 2016-01-01"}

{, 1, 2, 1, 7255}

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