আবার কোন তারিখ?


10

আমার ওয়েবসাইটে, ব্যবহারকারীরা শৈলীতে তাদের জন্ম তারিখ প্রবেশ করান xx.xx.xx- বিন্দু দ্বারা পৃথক তিনটি দুই-অঙ্কের সংখ্যা। দুর্ভাগ্যক্রমে, আমি ব্যবহারকারীদের ঠিক কোন ফর্ম্যাটটি ব্যবহার করতে হবে তা বলতে ভুলে গিয়েছি। আমি শুধু জানি যে একটি বিভাগ মাসের জন্য, একটি তারিখের জন্য এবং একটি বছরের জন্য ব্যবহৃত হয় for বছরটি অবশ্যই বিশ শতকে (1900-1999), সুতরাং ফর্ম্যাটটির 31.05.75অর্থ 31 May 1975। এছাড়াও, আমি ধরে নিচ্ছি সবাই গ্রেগরিয়ান বা জুলিয়ান ক্যালেন্ডার ব্যবহার করে।

এখন, আমি গণ্ডগোলটি পরিষ্কার করতে আমার ডাটাবেসটি দিয়ে যেতে চাই through আমি ব্যবহারকারীদের সাথে সর্বাধিক অস্পষ্টতম তারিখগুলি ব্যবহার করে সূচনা করতে চাই, অর্থাৎ, যেখানে সম্ভাব্য তারিখের সীমাটি সবচেয়ে বড়।

উদাহরণস্বরূপ, তারিখটির 08.27.53অর্থ 27 August 1953গ্রেগরিয়ান বা জুলিয়ান ক্যালেন্ডারে হয়। জুলিয়ান ক্যালেন্ডারে তারিখ, 13 দিন পরে, তাই সীমার ঠিক হয় 13 days

বিপরীতে, স্বরলিপিটি 01.05.12অনেকগুলি সম্ভাব্য তারিখগুলি উল্লেখ করতে পারে। প্রাচীনতম 12 May 1901 (Gregorian), এবং সর্বশেষ হয় 1 May 1912 (Julian)। পরিসরটি হ'ল 4020 days

বিধি

  • ইনপুট বিন্যাসের একটি স্ট্রিং xx.xx.xx, যেখানে প্রতিটি ক্ষেত্র দুটি অঙ্ক এবং শূন্য প্যাডযুক্ত pad
  • আউটপুট হ'ল পরিসরের দিনগুলির সংখ্যা।
  • আপনি ধরে নিতে পারেন যে ইনপুটটি সর্বদা একটি বৈধ তারিখ হবে।
  • আপনি কোনও বিল্ট-ইন তারিখ বা ক্যালেন্ডার ফাংশন ব্যবহার করতে পারবেন না।
  • সংক্ষিপ্ততম কোড (বাইটে) জয়ী।

Testcases

  • 01.00.31 => 12
  • 29.00.02=> 0(একমাত্র সম্ভাবনা 29 February 1900 (Julian))
  • 04.30.00 => 13
  • 06.12.15 => 3291

থাকার 5, May 1975কথা কি 31st? এছাড়াও, আমাদের কি লিপ বছরের জন্য অ্যাকাউন্ট করতে হবে?
মালটিসেন 12'15 এ 23: 23

@ মালটিসেন হ্যাঁ, স্থির হ্যাঁ.
Ypnypn

কেন এটি একবিংশ শতাব্দীতে হতে পারে না?
এলিফ্যান্টফেজ

@ এলিফ্যান্টফেজ বিধিগুলিতে বিংশ শতাব্দী ধরে নেওয়া হয়েছে; অন্যথায় কোনও সর্বাধিক তারিখ থাকবে না।
Ypnypn

উত্তর:


6

পাইথ, 118 বাইট

M++28@j15973358 4G&qG2!%H4FN.pmv>dqhd\0cz\.I&&&hN<hN13eN<eNhgFPNaYK+++*365JhtN/+3J4smghdJthNeNInK60aY-K+12>K60;-eSYhSY

এটি অনলাইনে ব্যবহার করে দেখুন: বিক্ষোভ বা পরীক্ষার স্যুট

জুলিয়ান এবং গ্রেগরিয়ান ক্যালেন্ডারগুলির প্রয়োজনীয় জ্ঞান

জুলিয়ান এবং গ্রেগরিয়ান ক্যালেন্ডার বেশ একই রকম। প্রতিটি ক্যালেন্ডার এক বছরে 12 মাসে বিভক্ত হয়, যার প্রত্যেকটিতে 28-31 দিন থাকে। এক মাসের সঠিক দিনগুলি [31, 28/29 (depends on leap year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]। ক্যালেন্ডারগুলির মধ্যে কেবলমাত্র পার্থক্য হ'ল তাদের একটি লিপ বছরের সংজ্ঞা। জুলিয়ান ক্যালেন্ডারে যে কোনও বছর 4 দ্বারা বিভাজ্য একটি লিপ বছর। গ্রেগরিয়ান ক্যালেন্ডারটি কিছুটা সুনির্দিষ্ট। 4 দ্বারা বিভাজ্য যে কোনও বছর 100 বছর দ্বারা বিভাজ্য এবং 400 দ্বারা বিভাজ্য নয়, বাদে একটি লিপ বছর।

সুতরাং বিংশ শতাব্দীতে শুধুমাত্র এক বছর আলাদা। 1900 সাল, যা জুলিয়ান ক্যালেন্ডারে একটি লিপ বছর, তবে গ্রেগরিয়ান ক্যালেন্ডারে লিপ বছর নয়। সুতরাং একমাত্র তারিখ, যেটি একটি ক্যালেন্ডারে বিদ্যমান তবে অন্য ক্যালেন্ডারে নেই সেদিন 29.02.1900

বিভিন্ন লিপ বছরের সংজ্ঞার কারণে, জুলিয়ান ক্যালেন্ডারে এবং গ্রেগরিয়ান ক্যালেন্ডারে একটি তারিখের মধ্যে পার্থক্য রয়েছে। পূর্বের তারিখের জন্য 12 দিনের পার্থক্য এবং পরবর্তী তারিখের জন্য 29.02.190013 দিনের পার্থক্য 29.02.1900

সরলীকৃত সিউডো-কোড

Y = []  # empty list
for each permutation N of the input date:
   if N is valid in the Julian Calendar:
      K = number of days since 0.01.1900
      append K to Y
      if K != 60:  # 60 would be the 29.02.1900
         L = K - (12 if K < 60 else 13) 
         append L to Y
print the difference between the largest and smallest value in Y

বিস্তারিত কোড ব্যাখ্যা

প্রথম অংশটি M++28@j15973358 4G&qG2!%H4একটি ফাংশন সংজ্ঞায়িত করে g(G,H), যা জুলিয়ান ক্যালেন্ডারে Gবছরের এক মাসের দিনগুলি গণনা করে H

M                            def g(G,H): return
      j15973358 4               convert 15973358 into base 4
     @           G              take the Gth element
  +28                           + 28
 +                &qG2!%H4      + (G == 2 and not H % 4)

এবং পরবর্তী অংশটি কেবল লুপের জন্য এবং আইএফএস রয়েছে। লক্ষ্য করুন যে আমি Nবিন্যাসে ব্যাখ্যা করি (month, year, day)। এটি কিছু বাইট সংরক্ষণ করে, কারণ

FN.pmv>dqhd\0cz\.
             cz\.        split input by "."
    mv>dqhd\0            map each d of ^ to: eval(d[d[0]=="0":])
FN.p                     for N in permutations(^):

I&&&hN<hN13eN<eNhgFPN   
I                          if 
    hN                        month != 0
   &                          and
      <hN13                   month < 13
  &                           and
           eN                 day != 0
 &                            and
             <eNhgFPN         day < 1 + g(month,year):

aYK+++*365JhtN/+3J4smghdJthNeN
          JhtN                    J = year
     +*365J   /+3J4               J*365 + (3 + J)/4
    +              smghdJthN      + sum(g(1+d,year) for d in [0, 1, ... month-2])
   +                        eN    + day
  K                               K = ^
aYK                               append K to Y

InK60aY-K+12>K60            
InK60                             if K != 60:
     aY-K+12>K60                    append K - (12 + (K > 60)) to Y

;-eSYhSY
;          end for loop
 -eSYhSY   print end(sorted(Y)) - head(sorted(Y))

0

পার্ল 5 , 294 বাইট

sub f{map/(\d\d)(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])/             #1             
      &&$3<29+($2==2?!($1%4):2+($2/.88)%2)                        #2  
      &&($j{$_}=++$j+12)                                          #3
      &&$j!#1=60?$g{$_}=++$g:0,'000101'..'991231'if!%g;           #4
      pop=~/(\d\d).(\d\d).(\d\d)/;                                #5
      @n=sort{$a<=>$b}                                            #6
         grep$_,                                                  #7
         map{($j{$_},$g{$_})}                                     #8
         ("$1$2$3","$1$3$2","$2$1$3","$2$3$1","$3$1$2","$3$2$1"); #9
      $n[-1]-$n[0]}                                               #10

এটি অনলাইন চেষ্টা করুন!

298 বাইট যখন স্পেস, নিউলাইন এবং মন্তব্যগুলি সরানো হয়।

1-4 লাইনগুলি আরম্ভ করে (যদি না করা হয়) %gএবং %jহ্যাশ যেখানে মানগুলি গ্রেগরিয়ান এবং জুলিয়ান দিনের সংখ্যা অনুসারে জোনারি 1 ম 1900 থেকে 31 ডিসেম্বর 1999 পর্যন্ত গণনা করা হয়।

লাইন 5 ইনপুট তারিখটিকে $ 1, $ 2 এবং $ 3 এ রাখে।

লাইন 9 এই তিনটি ইনপুট সংখ্যার সমস্ত ছয়টি ক্রমানুসারে তালিকাবদ্ধ করে।

লাইন 8 এই ছয়টিকে দুটি করে দুটি সংখ্যায়, গ্রেগরিয়ান এবং জুলিয়ান দিনের সংখ্যাগুলিতে রূপান্তরিত করে, তবে কেবল বৈধ তারিখগুলি।

লাইন 7 এটি নিশ্চিত করে, এটি অ-অযৌক্তিক দিনের সংখ্যাগুলি ফিল্টার করে।

লাইন 6 সবচেয়ে ছোট থেকে বৃহত্তম পর্যন্ত বৈধ তারিখ সংখ্যাগুলির তালিকা সাজায়।

লাইন 10 রিটার্ন করে তারপরে সর্বশেষ এবং প্রথম (সর্বাধিক এবং মিনিট) এর মধ্যে পার্থক্য, যা চেয়েছিল পরিসর ছিল।

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