আইএসও 8601 তারিখগুলি বৈধকরণে খাঁটি নিয়মিত অভিব্যক্তিগুলি বীট করুন


12

ইন হয়েছে RX দ্বারা যাচাই আইএসও 8601 , চ্যালেঞ্জ করার একমাত্র মান রেগুলার এক্সপ্রেশন ব্যবহার ছিল মান তারিখ ফরম্যাটের যাচাই এবং মান (সাবেক হয়েছে RX জন্য একটি সাধারণ কাজ, আধুনিক অস্বাভাবিক ছিল)। বিজয়ী উত্তরটি 778 বাইট ব্যবহার করেছে। এই চ্যালেঞ্জটি হ'ল আপনার পছন্দের কোনও ভাষা ব্যবহার করে তা হারাতে হবে তবে বিশেষ তারিখের ফাংশন বা ক্লাস ছাড়াই

চ্যালেঞ্জ

সংক্ষিপ্ততম কোডটি সন্ধান করুন

  1. প্রলেপটিক গ্রেগরিয়ান ক্যালেন্ডারে প্রতিটি সম্ভাব্য তারিখকে বৈধ করে তোলে ( এটি 1515 সালে প্রথম গ্রহণের আগে সমস্ত তারিখের ক্ষেত্রেও প্রযোজ্য),
  2. কোনও অবৈধ তারিখের সাথে মেলে না এবং
  3. তারিখগুলি (এবং সময়) পরিচালনা করার জন্য কোনও পূর্বনির্ধারিত ফাংশন, পদ্ধতি, শ্রেণি, মডিউল বা অনুরূপ ব্যবহার করে না, অর্থাত স্ট্রিং এবং সংখ্যাসূচক ক্রিয়াকলাপের উপর নির্ভর করে।

আউটপুট

আউটপুট সত্যবাদী বা মিথ্যা। তারিখ আউটপুট বা রূপান্তর করা প্রয়োজন হয় না।

ইনপুট

ইনপুটটি 3 টি প্রসারিত আইএসও 8601 তারিখের ফর্ম্যাটের যে কোনও একক স্ট্রিং - কোনও সময় নয়।

প্রথম দুটি হ'ল ±YYYY-MM-DD(বছর, মাস, দিন) এবং ±YYYY-DDD(বছর, দিন)। লিপ দিবসের জন্য দু'জনেরই বিশেষ ক্যাসিং দরকার। এগুলি প্রসারিত আরএক্সগুলির সাথে এগুলি নির্লজ্জভাবে পৃথকভাবে মিলেছে:

(?<year>[+-]?\d{4,})-(?<month>\d\d)-(?<day>\d\d)
(?<year>[+-]?\d{4,})-(?<doy>\d{3})

তৃতীয় ইনপুট ফর্ম্যাটটি ±YYYY-wWW-D(বছর, সপ্তাহ, দিন)। জটিল লিপ সপ্তাহের ধরণের কারণে এটি জটিল।

(?<year>[+-]?\d{4,})-W(?<week>\d\d)-(?<dow>\d)

পরিবেশ

একটি অধিবর্ষ প্রলেপ্টিক গ্রেগরিয়ান ক্যালেন্ডারে রয়েছে লিপ দিন …-02-29 এবং এইভাবে এটি 366 দিন দীর্ঘ, অত: পর …-366বিদ্যমান। এই যে কোনো বছর যার (সম্ভবত ঋণাত্মক) পূরণবাচক সংখ্যা 4 দিয়ে বিভাজ্য ঘটবে, কিন্তু 100 দ্বারা নয় যদি না এটি 400 দ্বারা বিভাজ্য এর বছর শূন্য এই ক্যালেন্ডারটি বিদ্যমান এবং এটি একটি অধিবর্ষ হয়।

একটি দীর্ঘ বছর আইএসও সপ্তাহে ক্যালেন্ডারে একটি 53rd সপ্তাহে রয়েছে …-W53-…, যা এক একটি "শব্দটি পারে লিপ সপ্তাহে "। এটি সমস্ত বছরগুলিতে ঘটে যেখানে 1 জানুয়ারী একটি বৃহস্পতিবার এবং অতিরিক্তভাবে সমস্ত লিপ বছরে যেখানে এটি বুধবার হয়। 0001-01-01এবং 2001-01-01সোমবার হয়। এটি সাধারণত 5 থেকে 6 বছর পরে দেখা যায়, একটি আপাতদৃষ্টিতে অনিয়মিত প্যাটার্নে।

এক বছরে কমপক্ষে 4 টি অঙ্ক থাকে। 10 টিরও বেশি সংখ্যক সংখ্যক বছরগুলিকে সমর্থন করার দরকার নেই, কারণ এটি মহাবিশ্বের বয়সের কাছাকাছি (সিএ। 14 বিলিয়ন বছর)। শীর্ষস্থানীয় প্লাস চিহ্নটি alচ্ছিক, যদিও প্রকৃত স্ট্যান্ডার্ডটি প্রস্তাব দেয় যে এটি 4 টিরও বেশি সংখ্যক বছর ধরে প্রয়োজনীয় হওয়া উচিত।

আংশিক বা কাটা তারিখগুলি, যেমন দিন-নির্ভুলতার চেয়ে কম সহ, গ্রহণ করা উচিত নয়। পৃথক হাইফেন -সব ক্ষেত্রে প্রয়োজন required (এই পূর্বশর্তগুলি +সর্বদা alচ্ছিক হতে পারে))

বিধি

এটি কোড-গল্ফ। বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী। আগের উত্তর একটি টাই জয়।

পরীক্ষার মামলা

বৈধ পরীক্ষা

2015-08-10
2015-10-08
12015-08-10
-2015-08-10
+2015-08-10
0015-08-10
1582-10-10
2015-02-28
2016-02-29
2000-02-29
0000-02-29
-2000-02-29
-2016-02-29
+2016-02-29
200000-02-29
-200000-02-29
+200000-02-29
2016-366
2000-366
0000-366
-2000-366
-2016-366
+2016-366
2015-081
2015-W33-1
2015-W53-7
+2015-W53-7
+2015-W33-1
-2015-W33-1
 2015-08-10 

শেষটি allyচ্ছিকভাবে বৈধ, অর্থাত্ ইনপুট স্ট্রিংগুলিতে শীর্ষস্থানীয় এবং পিছনের স্থানগুলি ছাঁটাই করা যেতে পারে।

অবৈধ ফর্ম্যাটগুলি

-0000-08-10     # that's an arbitrary decision
15-08-10        # year is at least 4 digits long
2015-8-10       # month (and day) is exactly two digits long, i.e. leading zero is required
015-08-10       # year is at least 4 digits long
20150810        # though a valid ISO format, we require separators; could also be interpreted as a 8-digit year
2015 08 10      # separator must be hyphen-minus
2015.08.10      # separator must be hyphen-minus
2015–08–10      # separator must be hyphen-minus
2015-0810
201508-10       # could be October in the year 201508
2015 - 08 - 10  # no internal spaces allowed
2015-w33-1      # letter ‘W’ must be uppercase
2015W33-1       # it would be unambiguous to omit the separator in front of a letter, but not in the standard
2015W331        # though a valid ISO format we require separators
2015-W331
2015-W33        # a valid ISO date, but we require day-precision
2015W33         # though a valid ISO format we require separators and day-precision
2015-08         # a valid ISO format, but we require day-precision
201508          # a valid but ambiguous ISO format
2015            # a valid ISO format, but we require day-precision

অবৈধ তারিখ

2015-00-10  # month range is 1–12
2015-13-10  # month range is 1–12
2015-08-00  # day range is 1–28 through 31
2015-08-32  # max. day range is 1–31
2015-04-31  # day range for April is 1–30
2015-02-30  # day range for February is 1–28 or 29
2015-02-29  # day range for common February is 1–28
2100-02-29  # most century years are non-leap
-2100-02-29 # most century years are non-leap
2015-000    # day range is 1–365 or 366
2015-366    # day range is 1–365 in common years
2016-367    # day range is 1–366 in leap years
2100-366    # most century years are non-leap
-2100-366   # most century years are non-leap
2015-W00-1  # week range is 1–52 or 53
2015-W54-1  # week range is 1–53 in long years
2016-W53-1  # week range is 1–52 in short years
2015-W33-0  # day range is 1–7
2015-W33-8  # day range is 1–7

2
বিষয় ছাড়াই তবে কার্যকর হতে পারে - স্ট্যাক ওভারফ্লো: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ২২০২০৮০৫/২ (যদি আমি এটি পোস্ট না করি তবে আমাকে বলুন)
ড্যানিয়েল ডি

প্রোগ্রামার যদি কোনও YEC (ইয়ং-আর্থ ক্রিয়েটিস্ট) হয় তবে কী হবে?
ফাঁস নুন

-0000-08-10স্বেচ্ছাসেবী সিদ্ধান্ত কি exaclty সম্পর্কে ? বছরটিকে নেতিবাচক 0 হিসাবে অনুমতি দিচ্ছেন না?
edc65

@ edc65 হ্যাঁ, +0000-08-10এবং 0000-08-10পরিবর্তে ব্যবহার করা উচিত। নোট করুন, যদিও, এই চ্যালেঞ্জের নিয়মিত প্রকাশের রূপে গৃহীত উত্তরটি এই নির্দিষ্ট পরীক্ষার ক্ষেত্রে ব্যর্থ হয়, সুতরাং এটি সত্যই একটি ব্যর্থ অবস্থা নয় (অর্থাত্ একটি হওয়া উচিত , আবশ্যক নয় )।
ক্রিসসভ

@ কেনেনিলাউ তাহলে প্রোগ্রামারটি ভুল
আর্টচারাস

উত্তর:


2

জাভাস্ক্রিপ্ট (ES6), 236

236 বাইট নেতিবাচক 0 বছর ( -0000) মঞ্জুরি দেয় । সত্য বা মিথ্যা প্রত্যাবর্তন করে

s=>!!([,y,w,d]=s.match(/^([+-]?\d{4,})(-W?\d\d)?(-\d{1,3})$/)||[],n=y%100==0&y%400!=0|y%4!=0,l=((l=y-1)+8-~(l/4)+~(l/100)-~(l/400))%7,l=l==5|l==4&!n,+d&&(-w?d>`0${2+n}0101001010`[~w]-32:w?(w=w.slice(2),w>0&w<(53+l)&d>-8):d[3]&&d>n-367))

জন্য নেতিবাচক 0 কাটা 2 বাইট চেক যোগ করার পদ্ধতি কিন্তু 13. নোট করুন যে জাভাস্ক্রিপ্ট এর সাংখ্যিক মান যোগ করে -0বিদ্যমান, এবং এটা 0 সমান হতে cased বিশেষ, কিন্তু 1/-0হয় -Infinity। এই সংস্করণটি 0 বা 1 প্রদান করে

s=>([,y,w,d]=s.match(/^([+-]?\d{4,})(-W?\d\d)?(-\d{1,3})$/)||[],n=y%100==0&y%400!=0|y%4!=0,l=((l=y-1)+8-~(l/4)+~(l/100)-~(l/400))%7,l=l==5|l==4&!n,+d&&(-w?d>`0${2+n}0101001010`[~w]-32:w?(w=w.slice(2),w>0&w<(53+l)&d>-8):d[3]&&d>n-367))&!(!+y&1/y<0)

পরীক্ষা

Check=
  s=>!! // to obtain a true/false 
  (
    // parse year in y, middle part in w, day in d
    // day will be negative with 1 or 3 numeric digits and could be 0
    // week will be '-W' + 2 digits
    // month will be negative with2 digits and could be 0
    // if the date is in format yyyy-ddd, then w is empty
    [,y,w,d] = s.match(/^([+-]?\d{4,})(-W?\d\d)?(-\d{1,3})$/) || [],
    n = y%100==0 & y%400!=0 | y%4!=0, // n: not leap year
    l = ((l=y-1) + 8 -~(l/4) +~(l/100) -~(l/400)) % 7, 
    l = l==5| l==4 & !n, // l: long year (see http://mathforum.org/library/drmath/view/55837.html)
    +d && ( // if d is not empty and not 0
     -w // if w is numeric and not 0, then it's the month (negative)
     ? d > `0${2+n}0101001010`[~w] - 32 // check month length (for leap year too)
      : w // if w is not empty, then it's the week ('-Wnn')
        ? ( w = w.slice(2), w > 0 & w < (53+l) & d >- 8) // check long year too
        : d[3] && d > n-367 // else d is the prog day, has to be 3 digits and < 367 o 366
    )
  )

console.log=x=>O.textContent += x +'\n'

OK=['1900-01-01','2015-08-10','2015-10-08','12015-08-10','-2015-08-10','+2015-08-10'
,'0015-08-10','1582-10-10','2015-02-28','2016-02-29','2000-02-29'
,'0000-02-29','-2000-02-29','-2016-02-29','+2016-02-29','200000-02-29'
,'-200000-02-29','+200000-02-29','2016-366','2000-366','0000-366'
,'-2000-366','-2016-366','+2016-366','2015-081','2015-W33-1'
,'2015-W53-7','+2015-W53-7','+2015-W33-1','-2015-W33-1','2015-08-10']

KO=['-0000-08-10','15-08-10','2015-8-10','015-08-10','20150810','2015 08 10'
,'2015.08.10','2015–08–10','2015-0810','201508-10','2015 - 08 - 10','2015-w33-1'
,'2015W33-1','2015W331','2015-W331','2015-W33','2015W33','2015-08','201508'
,'2015','2015-00-10','2015-13-10','2015-08-00','2015-08-32','2015-04-31'
,'2015-02-30','2015-02-29','2100-02-29','-2100-02-29','2015-000'
,'2015-366','2016-367','2100-366','-2100-366','2015-W00-1'
,'2015-W54-1','2016-W53-1','2015-W33-0','2015-W33-8']

console.log('Valid')
OK.forEach(x=>console.log(Check(x)+' '+x))
console.log('Not valid')
KO.forEach(x=>console.log(Check(x)+' '+x))
<pre id=O></pre>

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