দুই দিনের মধ্যে পার্থক্য গণনা করুন।


11

আরেকটি তারিখ-কারচুপি সমস্যা: পি

কার্য

এমন কোনও প্রোগ্রাম বা একটি ফাংশন লিখুন যা কোনও ব্যবহারকারী দ্বারা প্রদত্ত দুটি তারিখের মধ্যে পার্থক্য গণনা করে।

ইনপুট আউটপুট

অনুরূপ আগের , ইনপুট দুটি YYYYMMDDগুলি, একটি স্থান দ্বারা পৃথক , একটি কমা ,, অথবা একটি বিয়োগ চিহ্ন -

ইনপুট মানগুলির উদাহরণ:

20100101-20010911
20110620-20121223
19000101 20101010
33330101,19960229
00010101 99991231

আউটপুট একটি পূর্ণসংখ্যা, যা দিনের মধ্যে দুটি তারিখের মধ্যে পার্থক্য।

উদাহরণস্বরূপ, ইনপুট 20110101-20100101ফলন দেয় 365এবং 33320229 17000101ফলন দেয় 596124

আপনি ফলাফল পরীক্ষা করতে পারেন এইখানে এখানে । (নীচে রিন্টন এর মন্তব্য দেখুন)) দুটি তারিখ একই 0হলে, তারিখটি বৈধ হলে প্রোগ্রামটি ফেরত আসা উচিত ( স্কোর দেখুন )।

সীমাবদ্ধতা

অবশ্যই, আপনার অবশ্যই কোনও ধরণের ফাংশন / শ্রেণি / ... ব্যবহার করা উচিত নয় যা টাইমস্ট্যাম্প বা তারিখের সাথে সম্পর্কিত এবং আপনার গ্রেগরিয়ান ক্যালেন্ডার ব্যবহার করা উচিত ।

স্কোর

যদি আপনার কোড সীমাবদ্ধতা না রাখে, তবে score = -∞

ডিফল্ট bonusহয় 1।

  • যদি আপনার কোড ইনপুটগুলির আদেশ নির্বিশেষে কাজ করে (উদাহরণস্বরূপ, 20100101,20110101রিটার্ন 365বা -365) bonus+=1,।
  • যদি আপনার কোড বছর 0 , পরিচালনা করতে পারে bonus+=0.5
  • আপনার কোড স্বীকার করে অবৈধ মাস / তারিখ (1 ~ 12 মধ্যে), মত (1 ~ 31 মধ্যে) যদি 20109901বা 34720132, এবং কপি করে প্রিন্ট E(& মত প্রোগ্রাম বা আয় কিছু বন্ধ 0), bonus+=1
  • উপরে শাসনের হোক না কেন, আপনার কোডটি অবৈধ তারিখ, মত স্বীকার করে যদি 20100230, 20100229অথবা 20111131, এবং কপি করে প্রিন্ট E(& বন্ধ মত প্রোগ্রাম বা আয় কিছু 0), bonus+=1
  • উপরোক্ত দুটি নিয়ম নির্বিশেষে, যদি আপনার কোডটি অবৈধ ইনপুট স্ট্রিংকে পছন্দ করে 20100101|20100202বা পছন্দ করে 2010010120100202এবং মুদ্রণ করে E(& প্রোগ্রামটি শেষ করে দেয় বা এর মতো কিছু ফেরত দেয় 0) bonus+=1,।

score = floor(-4.2*code.length/bonus)। সর্বোচ্চ স্কোর জয়যুক্ত কোড। দুটি শীর্ষ কোডের যদি একই স্কোর থাকে তবে সর্বোচ্চ বোনাসযুক্ত কোডগুলি জয়ী হয়। যদি দুটি শীর্ষ কোডের উভয়ই একই স্কোর এবং বোনাস থাকে তবে সর্বাধিক ভোটের কোডগুলি জয়ী হয়।

(নির্ধারিত: যখন 5 টিরও বেশি কোড রয়েছে যেখানে বেশি (বা সমান) +1ভোট রয়েছে)


20030229 তৃতীয় বোনাস দ্বারা একটি অবৈধ তারিখ হিসাবে বিবেচনা করা হয়?
রিন্টন

@ প্রিন্টন হ্যাঁ এটি অবৈধ, বিপরীতে 20040229। : পি
জিমিনপি

1
ওল্ফরামআল্ফা কি আসলেই সঠিক ফলাফলটি ফিরিয়ে দেয়? আমি এটির এবং টাইমঅনডেট ডট কম থেকে বিবাদী উত্তর পাচ্ছি । আমার প্রোগ্রাম, যা আমি বিশ্বাস করি সঠিকভাবে কাজ করছে (কমপক্ষে সেই উদাহরণে: পি), পরবর্তীগুলির সাথে একমত হয়।
রিন্টন

@ প্রিন্টন আমার মনে হয় ওল্ফ্রাম | 365*4 + 2 + 2= 1464 সাল থেকে আলফা ভুল ছিল the তথ্যের জন্য ধন্যবাদ!
জিমিনপি

1
এটি লক্ষ্য করা উচিত যে টাইমেন্ডেট ডট কমের সাথেও কিছু সমস্যা রয়েছে: এটি কেবল বছর 1-3999 বছর গ্রহণ করে, এবং জুলিয়ান এবং গ্রেগরিয়ান ক্যালেন্ডারগুলির মধ্যে 11 দিনের তফাতটি 3 সেপ্টেম্বর, 1752 এর পূর্বের তারিখগুলির জন্য স্বয়ংক্রিয়ভাবে সামঞ্জস্য করে (সুতরাং 17520903 এর মাধ্যমে 17520914 বৈধ তারিখ নয়)। ফলাফল পরীক্ষা করার সময় এটি মনে রাখবেন।
রিন্টন

উত্তর:


3

পার্ল 5.14, স্কোর = -162

-163 -181 -196 -214 -167 -213 -234
  • কোডের দৈর্ঘ্য = 211: 208 -pবিকল্প অক্ষরের সাথে পার্ল চালানোর জন্য উত্স অক্ষর + 3
  • বোনাস = 5.5: ডিফল্ট, অর্ডার, বছর 0, কখনই-বৈধ মাস / দিন, অবৈধ তারিখ, সম্পূর্ণ-অবৈধ ইনপুট

কোড

$_=eval(join'-',map{($y,$m,$d)=/(....)(..)(..)/;die"E\n"if!($m*$d)||$m>12||$d>30+($m&1^$m>7)-($m==2)*(2-!($y=~s/00$//r%4));$y-=($m<3)-400;$d+int(($m+9)%12*30.6+.4)+int(365.2425*$y)}/^(\d{8})[ ,-](\d{8})$/)//E

প্রতিটি তারিখের জন্য একটি সংশোধিত জুলিয়ান দিন নম্বর গণনা করে (কোডের দৈর্ঘ্য সংরক্ষণের জন্য যুগ-সম্পর্কিত সমন্বয়গুলি উপেক্ষা করে) এবং দুটিকে বিয়োগ করে। (রেফারেন্স। উইকিপিডিয়ায় "জুলিয়ান ডে" )

  • জন্য Perl 5.14+ প্রয়োজন /rবদল বিকল্পটি
  • অবৈধ তারিখ বোনাস পেতে মাসের দৈর্ঘ্যের গণনা: 30+($m&1^$m>7)অংশটি কোনও মাসের দৈর্ঘ্য দেয় তবে ফেব্রুয়ারি; বাকীগুলি একটি সাধারণ বা লিপ বছরে ফেব্রুয়ারির জন্য সামঞ্জস্য করে

অনুমিতি

  • "গ্রেগরিয়ান ক্যালেন্ডার ব্যবহার করুন" এর অর্থ হল জুলিয়ান থেকে গ্রেগরিয়ান ট্রানজিশনের যে কোনওটি আমরা ব্যবহার করছি তার আগে তারিখগুলির জন্য প্রলেপটিক গ্রেগরিয়ান ক্যালেন্ডার। এটি হ'ল 11 দিন বিয়োগকারী অন্তরগুলির জন্য বিয়োগ করবেন না, উদাহরণস্বরূপ, 3 সেপ্টেম্বর 1752 - 14 সেপ্টেম্বর 1752 ব্রিটিশ রূপান্তর।
  • "হ্যান্ডেল ইয়ার 0" এর অর্থ, উদাহরণস্বরূপ, 00000101-00010101366 দেওয়া উচিত, কারণ 0 400 এর অবিচ্ছেদ্য একাধিক, এবং তাই বছর 0 একটি লিপ বছর।

আপনি যে পরিবর্তনগুলি করেছেন তার সাথে দেখে মনে হচ্ছে আপনার প্রোগ্রামটি এখন অবৈধ মাস এবং দিনগুলি গ্রহণ করবে, যেমন 20111300-20119999ফেরতের মতো 2717
মাইগিমারু

@ মিগিমারু: আমি প্রকৃতপক্ষে নির্ভুলতাটি অপ্টিমাইজ করেছি। অভিশাপ। আমি সম্পাদনা করব এবং সম্ভবত এটিতে ফিরে আসব।
ডিসিচারনেস

2

পিএইচপি, স্কোর: -539.1

  • 706 টি অক্ষর
  • সমস্ত বোনাস আইটেম; বোনাস = 5.5

কোড

<?php $a='(\d{4})(0[0-9]|1[0-2])([0-2][0-9]|3[01])';@$p=preg_match;if(!$p('/^(\d{8})[- ,](\d{8})$/',fgets(STDIN),$z))@die(E);unset($z[0]);sort($z);foreach($z AS$x){if(!$p('/(\d{4})(0[0-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])/',$x,$w))die(E);$n[]=$w;}$m=array(31,28,31,30,31,30,31,31,30,31,30,31);$r=0;$b=$n[0][1];$c=$n[0][2];$d=$n[0][3];$e=$n[1][1];$f=$n[1][2];$g=$n[1][3];@$t=str_pad;if((($b.$e==229)&&(!(!($b%4)+!($b%100)-!($b%400))))||($c>12))die(E);for($z=$b.$c.$d;;$s=$d,$r++){if($z==$e.$f.$g)break;if($z>$e.$f.$g)@die(E);if(@$s==$d)$d++;if((($c!=2)&&($d>$m[$c-1]))||(($c==2)&&($d>($m[$c-1]+!($b%4)-!($b%100)+!($b%400))))){$c++;$d=1;}if($c>12){$b++;$c=1;}$z=$b.$t($c,2,0,0).$t($d,2,0,0);}echo($r>0)?--$r:0;

Ungolfed

<?php
$a='(\d{4})(0[0-9]|1[0-2])([0-2][0-9]|3[01])';
@$p=preg_match;
if(!$p('/^(\d{8})[- ,](\d{8})$/',fgets(STDIN),$z)) @die(E);
unset($z[0]);
sort($z);
foreach($z AS $x)
{
        if (!$p('/(\d{4})(0[0-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])/',$x,$w)) die(E);
        $n[]=$w;
}
$m=array(31,28,31,30,31,30,31,31,30,31,30,31);
$r=0;
$b=$n[0][1];
$c=$n[0][2];
$d=$n[0][3];
$e=$n[1][1];
$f=$n[1][2];
$g=$n[1][3];
@$t=str_pad;
if ((($b.$e==229)&&(!(!($b%4)+!($b%100)-!($b%400))))||($c>12)) die(E);
for ($z=$b.$c.$d;;$s=$d,$r++)
{
        if ($z==$e.$f.$g)break;
        if ($z>$e.$f.$g)@die(E);
        if (@$s==$d)$d++;
        if ((($c!=2)&&($d>$m[$c-1]))||(($c==2)&&($d>($m[$c-1]+!($b%4)-!($b%100)+!($b%400)))))
        {
                $c++;
                $d=1;
        }
        if ($c>12)
        {
                $b++;
                $c=1;
        }
        $z=$b.$t($c,2,0,0).$t($d,2,0,0);
}
echo($r>0)?--$r:0;

বিঃদ্রঃ

প্রদত্ত দুজনের মধ্যে প্রতিটি বৈধ তারিখ দিয়ে পুনরাবৃত্তি করে দিনের সংখ্যা গণনা করে। বড় পরিসরে এটি বেশ ধীর। আমি নিশ্চিত যে এটি সমাধানের এটি সর্বোত্তম উপায় নয়, তবে আমি অধৈর্য হয়েছি এবং এটিই আমি শেষ করেছি। :)

এছাড়াও, আমি জানি যে "অবরুদ্ধ" কোডটি এখনও খুব বেশি পঠনযোগ্য নয় তবে এটি সম্পূর্ণরূপে পুনরায় লেখার জন্য খুব বেশি পরিশ্রমের প্রয়োজন হবে।


2

রুবি 1.9, স্কোর: -175 -186 -191 -199

  • কোড দৈর্ঘ্য: 229 243 250 260 টি অক্ষর
  • বোনাস: 5.5 (ডিফল্ট, অর্ডার, বছর 0, অবৈধ মাস / দিন, অবৈধ তারিখ, অবৈধ ইনপুট)

কোড স্টিডিনের মাধ্যমে ইনপুট গ্রহণ করে।

h=->n{n/4-n/100+n/400+1}
u,v=gets.split(/[ ,-]/).map{|s|s=~/^\d{8}$/?(d,e,f=[s[0,4],s[4,2],s[6,2]].map &:to_i;x=[0,y=31,28+h[d]-z=h[d-1]]+[y,30,y,30,y]*2
(!x[e]||e*f<1||f>x[e])?0:d*365+z+eval(x[0,e]*?+)+f):0}
puts (v*u>0)?u-v :?E

মন্তব্য:

  • এইচটি সেই বছর অবধি লিপ বছরগুলিতে ফিরে আসে (বোনাসের জন্য 0 বছর সহ)।
  • রেজেক্স অবৈধ ইনপুট বোনাস পরিচালনা করে।
  • (!x[e]||e*f<1||f>x[e])শর্ত অবৈধ মাস / দিন / তারিখ বনাস পরিচালনা করে।
  • ফলাফলটি প্রথম তারিখের বিয়োগ দ্বিতীয় তারিখ হিসাবে প্রদর্শিত হয়, সুতরাং দ্বিতীয় তারিখটি যদি পরে হয় তবে এটি নেতিবাচক সংখ্যা হিসাবে আউটপুট হবে।
  • জুলিয়ান এবং গ্রেগরিয়ান ক্যালেন্ডারগুলির মধ্যে পরিবর্তনের জন্য সামঞ্জস্য করে না, ফলে 33320229 17000101ফলাফল 596134

আমার সমাধানটি ত্রুটি-যাচাইয়ের জন্য এবং উন্নতি করতে আমাকে চাপ দেওয়ার জন্য ধন্যবাদ। আমি বিশেষত এখানে আপনার ফেব্রুয়ারির দৈর্ঘ্যের গণনা পছন্দ করি।
DCharness

@ ডিচার্সনেস আমাকেও চাপ দেওয়ার জন্য ধন্যবাদ আমি বুঝতে পারি যে আমার মূল জমা দেওয়ার উন্নতির জন্য প্রচুর জায়গা রয়েছে।
মাইগিমারু

1

পাইথন, স্কোর: -478

  • অক্ষর: 455
  • বোনাস: বিপরীত তারিখ, অবৈধ দিন / মাস, অবৈধ তারিখ

সমাধান:

import re
a=re.split('[-, ]',raw_input())
def c(x):return x[0]
def f(x,y=3):return(1if x%400==0 or x%100!=0and x%4==0 else 0)if y>2 else 0
t=[31,28,31,30,31,30,31,31,30,31,30,31]
[q,w,e],[i,o,p]=sorted([map(int,[a[x][:4],a[x][4:6],a[x][6:]])for x in[0,1]],key=c)
print sum(map(f,range(q,i)))+(i-q)*365+p+sum(t[:o-1])-e-sum(t[:w-1])+f(i,o)-f(q,w)if 0<w<13and 0<e<32and 0<o<13and 0<p<32and(e<=t[w-1]or(f(q)and e==29))and(p<=t[o-1]or(f(i)and p==29))else 'E'

আমার "অলগল্ফড" সংস্করণ নেই কারণ আমি এটি এটি লিখেছিলাম। আমি এটি সঠিকভাবে পরীক্ষা করি নি তাই আপনি যদি কোনও বাগ খুঁজে পান - দয়া করে মন্তব্য করুন।

সম্পাদনা: আশা করা যায় একটি মন্তব্যে একটি বাগ নির্দেশিত এবং [ক, খ], [সি, ডি] = [[1,2], [3,4] আকারে আনপ্যাকিং যুক্ত করা হয়েছে


দুঃখিত, তবে যখন আমি পাইথন ২. She শেলটি পরীক্ষা করেছি তখন '20000001,20010101' এর মতো অবৈধ ইনপুটগুলি মুদ্রণ করে না E। (অবগতির জন্য, 0>-1>12, 0>6>12, 0>13>12আয় False।)
JiminP

ধন্যবাদ। আমি অজগর থেকে বেশ নতুন। এই স্ক্রিপ্টটি লিখে আমি শিখেছি যে অজগর এই x<y<zতুলনা করে বা একটি আছে x if y else z। এটি ঠিক করার চেষ্টা করা হয়েছে।
rplnt

@rpInt: গল্ফ করার জন্য, এর [x,z][y]চেয়ে কম যা ছোট x if y else z, যদিও এটি সর্বদা কার্যকর হয় না কারণ এটি যদি অলস নয় তবে ইফ-এক্সপ্রেশনটির বিপরীতে।
মিথ্যা রায়ান

1

পিএইচপি, স্কোর: -516

অক্ষর: 685 676

বোনাস: 5.5

<? $z='/((\d{1,4})(\d\d)(\d\d))[- ,]((\d{1,4})(\d\d)(\d\d))/';if(!preg_match($z,$argv[1],$m))die('E');$s=1;if($m[1]>$m[5]){if(!preg_match($z,"$m[5] $m[1]",$m))die('E');$s=-1;}$b=array(31,28,31,30,31,30,31,31,30,31,30,31);list($x,$v,$c,$d,$e,$w,$f,$g,$h)=$m;if($d>12||1>$d||$g>12||1>$g||1>$e||1>$h||($e>$b[$d-1]&&!($d==2&&$e<30&&$c%4==0))||($h>$b[$g-1]&&!($g==2&&$h<30&&$f%4==0)))die('E');$z='array_slice';$y='array_sum';$x=$d!=$g||$e>$h;$r=$x?$b[$d-1]+$h-$e:$h-$e;$d+=$x;if($d>12){$c++;$d=1;}$r+=$d>$g?$y($z($b,$d-1,13-$d))+$y($z($b,0,$g-1)):($d!=$g?$y($z($b,$d-1,$g-$d)):0);$r+=($f-$c-($d>$g))*365;for($i=$c;$i<=$f;$i++)if($i%4==0&&$i.'0229'>$v&&$i.'0229'<$w)$r++;echo $s*$r;

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