কত সপ্তাহ?


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
ইনপুটটি কি কোনও একক স্থান-পৃথক স্ট্রিংয়ের পরিবর্তে স্ট্রিংগুলির একটি অ্যারে হতে পারে? বিকল্পভাবে, দুটি তারিখ কোনও ফাংশনে দুটি যুক্তি হতে পারে?
ডুরকনব


এছাড়াও, রবিবার বা সোমবার থেকে সপ্তাহ শুরু হয়? আপনার দ্বিতীয় পরীক্ষার কেস অনুসারে এটি সোমবার, তবে ঠিক নিশ্চিত করা।
ডোরকনবব

@ ডুরকনব 冰 উইকিপিডিয়া উক্তি: "ওয়াইওয়াইওয়াই ফর্ম্যাটে আইএসও সপ্তাহের সংখ্যা নির্ধারণের বছর দ্বারা একটি তারিখ নির্দিষ্ট করা হয়েছে, 'ডাব্লু' অক্ষরের দ্বারা উপস্থাপিত ডাব্লুডাব্লুতে একটি সপ্তাহের সংখ্যা, এবং সপ্তাহের দিন নম্বর, 1 থেকে 7 পর্যন্ত একটি অঙ্কের , সোমবার থেকে শুরু করে রবিবারের সাথে শেষ হচ্ছে "সুতরাং আইএসও 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

প্রশ্নের মধ্যে নির্দিষ্ট ফর্ম্যাটটিতে ইনপুট নেয়: একটি একক স্থান-পৃথক স্ট্রিং। (এটি যেভাবে ইনপুটটিকে পার্স করে তা অভিনব-ইশ: এটি রুবির "স্প্ল্যাট" অপারেটর ব্যবহার করে *This এই অপারেটরটি একটি অ্যারে বা বিস্তৃত পরিমাণকে "প্রসারিত" করে, তাই Time.gm *[2013, 06, 01]হয়ে ওঠে Time.gm 2013, 06, 01))

একটি মন্তব্য আলোচনা থেকে আমদানি করা:

আমরা "এক বছরে সপ্তাহ" সম্পর্কে চিন্তা করি না; আমরা কেবল "সামগ্রিক সপ্তাহ" সম্পর্কে যত্নশীল। সুতরাং এক বছরে 52 বা 53 সপ্তাহ রয়েছে কিনা তা কোনও পার্থক্য করে না।

ভবিষ্যতের বিভ্রান্তি এড়াতে কেবল এটি বছরের সীমানা সঠিকভাবে পরিচালনা করে কিনা - উইকিপিডিয়া অনুসারে , সমস্ত সপ্তাহ সর্বদা সোমবার থেকে শুরু হয়ে রবিবারে শেষ হয়।

আরও কিছু অভিনব কৌশলগুলির জন্য, এগুলি সমস্ত সমতুল্য:

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

আপনি কি প্রতিস্থাপন a==bকরে 1 টি চর সংরক্ষণ করতে পারবেন না a<b?
তেনসইবাই

1

ভিবিএ, 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)ভিবিএতে আইএসও সপ্তাহের সংখ্যাটি প্রথম 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 বাইট ডাব্লু / একক ইনপুট

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 যুক্ত করা উচিত।
ডেভিডসি

@ ডেভিডকারারহর ধন্যবাদ, আপনার উত্তরটি পড়ে আমার মনে হয়েছে যে আমি প্রথম দিনের সীমাটি সরিয়ে ফেলতে পারব, এইভাবে সমস্যার সমাধান
করবো

0

গণিত 135 79 96 84 74 বাইট

@ ডুরকনব এর পরামর্শের সাথে সামঞ্জস্যপূর্ণ, এটি

  • পরিসরে সমস্ত তারিখ উত্পন্ন করে

  • (বাদে ) এবং সোমবারের সংখ্যাকে ( ISOWeekDay== "1") গণনা করেDateRanged

  • 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, 1, 2, 1, 7255}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.