নাকल्स গণনা করে কত মাস পূর্ণ 31 দিন কাটছে তা গণনা করুন


12

আপনারা কতজন এখনও আপনার নিজের কড়া ব্যবহার করে এক মাস পূর্ণ 31 দিন বা তারও কম সময় নির্ধারণ করছেন কিনা তা নির্ধারণ করতে?

আপনার কাজটি হ'ল একটি প্রোগ্রাম লিখতে হয় যে কত মাস, এক মাসের পরিসরে, পুরো 31 দিন কেটে যায় এবং কতজন "নাকুল গণনা করে" 31 দিনেরও কম সময় কাটাচ্ছে?

নাকলেস দ্বারা মাসের দিন গণনা করা

সৌজন্যে: amsi.org.au


ইনপুট

কয়েক মাস, যার মধ্যে প্রথমটি যথাযথ বিন্যাসে দেওয়া দ্বিতীয়টির আগে কালানুক্রমিকভাবে আসতে হবে না। উদাহরণস্বরূপ: 201703 201902- মার্চ 2017 থেকে ফেব্রুয়ারী 2019. দয়া করে আপনার চয়ন করা ইনপুট ফর্ম্যাটটি বর্ণনা করুন। নোট করুন যে ইনপুটটি অবশ্যই 1 থেকে 9999 পর্যন্ত সমস্ত বছর অন্তর্ভুক্ত করতে সক্ষম হতে হবে specified

আউটপুট

দুটি পূর্ণসংখ্যা: 31 দিনের সাথে প্রদত্ত পরিসরে মাসের সংখ্যা এবং 31 দিনেরও কম দিনের সাথে পরিসরে মাসের সংখ্যা।

উদাহরণ: 14 10- ১৪ টি নাকলস, 10 খাঁজ (এর অর্থ হল যে সেই মাসের পরিসরে আমাদের 14 মাস রয়েছে যার পুরো 31 দিন রয়েছে, এবং 10 মাসের মধ্যে 31 দিনেরও কম সময় রয়েছে)।

একটি ইনপুট যেখানে রেঞ্জের দ্বিতীয় মাস প্রথমটির আগে কালানুক্রমিকভাবে আসে, উদাহরণস্বরূপ 201612 201611, আপনাকে শূন্যের একটি জোড়া আউটপুট করতে হবে।

ইনপুট এবং আউটপুট উদাহরণ

| Input         | Output      |
|---------------|-------------|
| 201703 201902 | 14 10       |
| 201701 202008 | 26 18       |
| 000101 999912 | 69993 49995 |
| 201802 201803 | 1 1         |
| 201601 201601 | 1 0         |
| 201612 201611 | 0 0         |

বিধি

  • আপনার পছন্দ মতো যে কোনও ভাষা বেছে নিতে পারেন
  • প্রতি লাইনে একটি ইনপুট
  • এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোড!
  • বিজয়ী নির্বাচন করা হবে 9 এপ্রিল মাসে
  • স্ট্যান্ডার্ড লুফোলস প্রযোজ্য
  • পিএস: এটি পিসিজিতে আমার প্রথম প্রশ্ন, এতে কিছুটা অসঙ্গতি থাকতে পারে। আপনার জন্য অস্পষ্ট কি তা সম্পাদনা করে তা নিশ্চিত করে নির্দ্বিধায়।

5
আপনি যেটির প্রথমটি দ্বিতীয়টির আগে কালানুক্রমিকভাবে আসার গ্যারান্টিযুক্ত বলেছিলেন তবে এটি পরীক্ষার ক্ষেত্রে মিথ্যা 201612 201611
ডেনিস

2
সাইটে একটি স্যান্ডবক্স রয়েছে যেখানে আপনি সমস্ত সন্দেহগুলি পরিষ্কার করার জন্য প্রশ্নটি পোস্ট করতে পারেন।
ভূত_স_ই_কোড

1
ত্রিশ দিন সেপ্টেম্বর, এপ্রিল, জুন এবং নভেম্বর হয়। ফেব্রুয়ারির কাজ শেষ হওয়ার পরে, বাকি সমস্তের একত্রিশটি আছে। এটাই আমার মনে আছে।
অ্যাডমবর্কবার্ক

@ অ্যাডমবার্কবার্ক এর সাথে একমাত্র সমস্যা হ'ল অসীম লুপিং (বাধ্যতামূলক xkcd রেফারেন্স)।
wizzwizz4

আমি ধরে নিয়েছি যে আপনি পুরো তারিখের ব্যাপ্তিতে গ্রেগরিয়ান ক্যালেন্ডারটি ব্যবহার করবেন?
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

উত্তর:


7

জেলি , 21 বাইট

ḅ12r/ị7RḂṁ12¤żC$S×⁼Ṣ$

ইনপুট লাগে [[y, m], [y, m]]

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

কিভাবে এটা কাজ করে

ḅ12r/ị7RḂṁ12¤żC$S×⁼Ṣ$  Main link. Argument: [[a, b], [c, d]]

ḅ12                    Unbase 12; yield [x, y] := [ 12a + b, 12c + d].
   r/                  Reduce by range; yield [x, ..., y].
           ¤           Combine the five links to the left into a niladic chain.
      7                  Set the return value to 7.
       R                 Range; yield [1, 2, 3, 4, 5, 6, 7].
        Ḃ                Bit; yield [1, 0, 1, 0, 1, 0, 1].
         ṁ12             Mold 12; repeat the Booleans to create an array of length
                         12. Yields [1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1].
     ị                 At-index; yield the elements of the array to the right at 
                       the indices (1-based and modular) of the array to the left.
               $       Combine the two links to the left into a monadic chain.
              C          Complement; map t -> 1-t over the array.
             ż           Zip the original array with the complements.
                S      Take the sum of each column.
                    $  Combine the two links to the left into a monadic chain.
                  Ṣ      Sort [[a, b], [c, d]].
                   ⁼     Compare the result with [[a, b], [c, d]], yielding 1 if
                         the input is sorted, 0 if not.
                 ×     Multiply the results to both sides.

5

জাভাস্ক্রিপ্ট (ES6), 70 68 67 64 বাইট

yyyymmবিন্যাসে কারিটিংয়ের ক্ষেত্রে, বিন্যাসে দুটি পূর্ণসংখ্যা হিসাবে ইনপুট নেয় (a)(b)। দুটি পূর্ণসংখ্যার অ্যারের আউটপুট দেয় [knuckles, grooves]

a=>g=(b,c=d=0)=>a>b?[c,d-c]:g(--b,c+!((b%=100)>11||b/.87&!!++d))

ফর্ম্যাট এবং মন্তব্য

a =>                        // main function: takes start date (a) as input / returns g
  g = (                     // recursive function g, which takes:
        b,                  //   - b = end date
        c = d = 0           //   - c = number of knuckles
      ) =>                  // and also keeps track of: d = total number of months
    a > b ?                 // if a is greater than b:
      [ c, d - c ]          //   stop recursion and return the final result
    :                       // else:
      g(                    //   do a recursive call to g():
        --b,                //   - decrement the end date
        c +                 //   - increment the # of knuckles if
        !(                  //     both of these conditions are false:
          (b %= 100)        //     - the end month (now stored in b in 0-based indexing)
          > 11 ||           //       is greater than 11
          b / 0.87 & !!++d  //     - the number of days in this month is not 31
        )                   //       (at the same time, d is incremented if the first
      )                     //       condition is false)

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

এনবি : তৃতীয় পরীক্ষার কেসটি এই স্নিপেটে অন্তর্ভুক্ত নয়, কারণ আপনার ব্রাউজারে টেল কল অপ্টিমাইজেশন সক্ষম না করা হলে এটি কাজ করবে না।


5

পাইথন 2 , 92 90 86 80 বাইট

lambda a,b,c,d:[(bin(2741)[2:]*(c+1-a))[b-1:-12+d or None].count(x)for x in'10']

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

ধারণাটির জন্য @ ম্যাথ_জানকিকে ধন্যবাদ দিয়ে একটি ল্যাম্বডায় রূপান্তর করে আরও 6 জন। এখন দুটি সংখ্যাযুক্ত একটি তালিকা আউটপুট করে।

পূর্ববর্তী ল্যাম্বডা সংস্করণ (86 বাইট)

a,b,c,d=input()
for x in'10':print(bin(2741)[2:]*(c+1-a))[b-1:-12+d or None].count(x),

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

আমাকে @ পরিত্রাণ পেতে সহায়তার জন্য 2 ওভসকে ধন্যবাদ দিয়ে সংরক্ষণ করা হয়েছে len(k)। আমি ব্যবহার সম্পর্কে ভাবিনিNone

ইনপুটটি বিন্যাসে পূর্ণসংখ্যার একটি তালিকা y1,m1,y2,m2

কিছু কিছু কৃতিত্ব @ কীর্তনপ্রভাকরণকে দিয়েছিলাম যারা bin(2741)[2:]আমার আগে পেয়েছিল যা বাইনারি স্ট্রিংকে হার্ড কোডিংয়ের জন্য 1 বাইট সংরক্ষণ করে।


চিত্তাকর্ষক ... কে = বিন (2741) [2:] * (সি + 1-এ) আমার মনকে উড়িয়ে দিয়েছে
অফিসিয়ালাইম

1
এটি 2 বাইট সংক্ষিপ্ত
ovs

উজ্জ্বল! আমি len(k)শেষ স্লাইস থেকে পরিত্রাণ পেতে কুড়ান কাজ করার চেষ্টা করছিলাম । ধন্যবাদ।
এলপেড্রো

1
ল্যাম্বডা ব্যবহার করে আপনি 6 বাইট সংরক্ষণ করতে পারেন: টিআইও
গণিত জাঙ্কি

4

পিএইচপি , 259 256 249 248 237 221 বাইট

আউটগল্ফড আওরেস : https://codegolf.stackexchange.com/a/114512/38505

ছক পূরণ করা: yyyymm,yyyymm

$i=explode(",",fgets(STDIN));$_="DateTime::createFromFormat";foreach(new DatePeriod($_(Ym,$i[0]),new DateInterval(P1M),$_(Ym,$i[1])) as$f)date(t,mktime(0,0,0,$f->format(m),1,$f->format(y)))>30?++$x:++$y;
echo $x.' '.++$y;

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


পুরানো সংস্করণ

$i=explode(",",fgets(STDIN));$_="DateTime::createFromFormat";$y=1;foreach(new DatePeriod($_("Ym",$i[0]),new DateInterval('P1M'),$_("Ym",$i[1])) as$f)date("t",mktime(0,0,0,$f->format("m"),1,$f->format("y")))==31?++$x:++$y;
echo $x.' '.$y;

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

$i=explode(",",fgets(STDIN));$_="DateTime::createFromFormat";$y=1;foreach(new DatePeriod($_(Ym,$i[0]),DateInterval::createFromDateString('1 month'),$_(Ym,$i[1])) as$f)date(t,mktime(0,0,0,$f->format(m),1,$f->format(y)))>30?++$x:++$y;
echo $x.' '.$y;

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

$i=explode(",",fgets(STDIN));$_="DateTime::createFromFormat";$y=1;foreach(new DatePeriod($_(Ym,$i[0]),DateInterval::createFromDateString('1 month'),$_(Ym,$i[1])) as$f)date(t,mktime(0,0,0,$f->format(m),1,$f->format(y)))==31?++$x:++$y;
echo $x.' '.$y;

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

$i=explode(",",fgets(STDIN));$_="DateTime::createFromFormat";foreach(new DatePeriod($_("Ym",$i[0]),DateInterval::createFromDateString('1 month'),$_("Ym",$i[1])) as$f)date("t",mktime(0,0,0,$f->format("m"),1,$f->format("y")))==31?++$x:++$y;
echo $x.' '.++$y;

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

$i=explode(",",fgets(STDIN));$_="DateTime::createFromFormat";$y=1;foreach(new DatePeriod($_("Ym",$i[0]),DateInterval::createFromDateString('1 month'),$_("Ym",$i[1])) as$f)date("t",mktime(0,0,0,$f->format("m"),1,$f->format("y")))==31?++$x:++$y;
echo $x.' '.$y;

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


3

ব্যাচ, 93 বাইট

@set/ag=(y=%2/100-%1/100)*5+(x=%2%%100+6)*5/12-(w=%1%%100+5)*5/12,k=y*12+x-w-g
@echo %k% %g%

Ymm ফর্ম্যাটে দুটি পরামিতি গ্রহণ করে (যেমন 101 - 999912)। পূর্ববর্তী 129-বাইট লুপ-ভিত্তিক সমাধান:

@set/al=%1-%1/100*88,u=%2-%2/100*88,k=g=0
@for /l %%i in (%l%,1,%u%)do @set/a"m=%%i%%12,k+=1451>>m&1,g+=2644>>m&1
@echo %k% %g%

000101 999912 এর জন্য ভুল ফলাফল, সম্ভবত পূর্ণসংখ্যার আকারের সীমাটির কারণে?
officialaimm

1
@officialaimm ভুল ইনপুট ফর্ম্যাট, দুঃখিত - বছরের নেতৃস্থানীয় জিরো না থাকা উচিত।
নীল

3

পাইথন 3.5 ( 164 162 154 152 150 148 140 137 বাইট)

n=int;a,b=input().split();t=k=0
for r in range(n(a[4:]),(n(b[:4])-n(a[:4]))*12+n(b[4:])+1):t+=1;k+=n('101010110101'[r%12-1])
print(k,t-k)

repl.it

yyyymm yyyymm আকারে ইনপুট নেয়

আউটপুটটি নাম্বার_নো_কনাকলস সংখ্যা_ের_গ্রোভ হিসাবে মুদ্রণ করে

  • 2 বাইট সংরক্ষিত: কোল ধন্যবাদ
  • 8 টি বাইট সংরক্ষণ করা হয়েছে: অপ্রয়োজনীয় ভেরিয়েবলগুলি সরানো হয়েছে
  • 2 বাইট সংরক্ষণ করা: টি = 0; কে = 0 টি = কে = 0 হিসাবে হ্রাস
  • 2 টি বাইট সংরক্ষণ করেছেন: কোলকে ধন্যবাদ (আমি এটি আগে মিস করেছি)
  • 2 বাইট সংরক্ষিত: কেরথানা ধন্যবাদ
  • 8 টি বাইট সংরক্ষণ করা হয়েছে: অপ্রয়োজনীয় ভেরিয়েবলগুলি সরানো হয়েছে
  • সংরক্ষিত 3 বাইট: ধন্যবাদ math_junkie (বিভক্ত করার বিভক্ত ( '') ())

1
আমি মনে করি আপনি কিছু বাইটগুলি হ্রাস করতে পারেন n=intএবং সম্ভবত কিছু execটমফুলারিও করতে পারেন।
কোলে

1
আমি মনে করি আপনি এর 2773&1<<r%12-1>0পরিবর্তে করতে পারেনint('101010110101'[r%12-1])
লুভজো

@ লভজো আমি এটি করতে গিয়ে ত্রুটি পাচ্ছি!
অফিসিয়ালাইম

1
ব্যবহার print([k,t-k])যেমন print(k,t-k)যেমন কাঙ্ক্ষিত ফলাফল উত্পাদন করবে (k,g)যার ফলে 2 বাইট হ্রাস!
কীর্তন প্রভাকরণ

1
আমি বিশ্বাস করি আপনি প্রতিস্থাপন করতে পারেন split(' ')সঙ্গেsplit()
গণিত নেশাখোর

3

পাইথন 2 , 147 146 142 বাইট

def s(a,b):y=100;r=bin(2741)[2:];x=b/y-a/y;i=r*(x-1);return((0,0),map((i+r[a%y-1:]+r[:b%y]if i or x else r[a%y-1:b%y]).count,('1','0')))[a<=b]

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

  • 4 টি বাইট সংরক্ষণ করা হয়েছে - অ্যারে লুকোচুরির সাথে যদি-অন্যরকম ধারাটির পরামর্শ দেওয়ার জন্য @math_junkie কে ধন্যবাদ!

কোডটি ভেঙে দেওয়া,

def s(a,b):
 y=100
 r=bin(2741)[2:] #'101010110101'
 x=b/y-a/y #to get the difference between the two years
 i=r*(x-1)
 return((0,0),map((i+r[a%y-1:]+r[:b%y]if i or x else r[a%y-1:b%y]).count,('1','0')))[a<=b]

1
if-elseঅ্যারে লুকআপের সাথে ক্লজগুলি প্রতিস্থাপন করে আপনি বাইটগুলি সংরক্ষণ করতে পারেন । বিশদগুলির জন্য এই পোস্টটি দেখুন
গণিত জাঙ্কি

সত্যিই এটি ছিল দুর্দান্ত উপায়! আগে জানতাম না! ধন্যবাদ!
কীর্তন প্রভাকরণ

3

পিএইচপি, 120 103 97 96 বাইট

for($f=strtotime;$f($argv[2])>=$n=$f($argv[1].+$x++.month);)$k+=date(t,$n)>30;echo+$k,_,$x-1-$k;

এভাবে চালান:

php -nr 'for($f=strtotime;$f($argv[2])>=$n=$f($argv[1].+$x++.month);)$k+=date(t,$n)>30;echo+$k,_,$x-1-$k;' 0001-01 9999-12;echo
> 69993_49995

ব্যাখ্যা

for(
  $f=strtotime;          # Alias strtotime function which is called twice.
  $f($argv[2]) >=        # Create end date timestamp. Iterate until the end
                         # date is reached.
  $n=$f(
    $argv[1].+$x++.month # Create timestamp from start date + X months.
  );
)
  $k+=date(t,$n) > 30;   # If "t" of current date (days in month) is 31
                         # increment $k (knuckles).

echo+$k,_,$x-1-$k;       # Compute grooves (iterations - $k) and output,
                         # implicit cast to int to account for 0 count.

বদলান

  • ডেটটাইম অবজেক্ট স্টাইলের পরিবর্তে টাইমস্ট্যাম্প স্টাইল ব্যবহার করে 17 বাইট সংরক্ষণ করা হয়েছে
  • ভেরিয়েবলের জন্য শেষ তারিখের টাইমস্ট্যাম্প বরাদ্দ না করে 6 বাইট সংরক্ষণ করা হয়েছে $e, সরাসরি সরাসরি তুলনা করুন
  • খাঁজের গণনা না রেখে 1 বাইট সংরক্ষণ করা হয়েছে, তবে কেবল লুপের পরে এটি গণনা করা হচ্ছে

$x++পরিবর্তে +$x++এছাড়াও কাজ করে।
তিতাস

টিটাস, আমার প্রথমে এটি ছিল, তবে বুঝতে পেরেছিলাম যে অজান্তেই $xএই স্ট্রিংটি হবে 2017-12monthযা একটি অচেনা ফর্ম্যাট এবং ফলাফল
1970০

দুষ্ট ... এটি কোথাও কাজ করেছে। দুষ্ট যথেষ্ট যদিও এটি +স্ট্রিংয়ে আক্ষরিক ছাড়া কাজ করে।
তিতাস

2

পাওয়ারশেল , 96 বাইট

for($a,$b=[datetime[]]$args;$a-le$b;$a=$a.AddMonths(1)){$x++;$z+=$a.Month-in2,4,6,9,11};$x-$z;$z

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

ফর্ম হিসাবে ইনপুট লাগে 2017-03। অন্তর্নির্মিত .NET তারিখের গ্রন্থাগারগুলি ব্যবহার করে এবং ইনপুট $aথেকে $bপ্রতিটি পুনরাবৃত্তিকে বৃদ্ধি করে $x++এবং $zবর্তমানটি যদি .Monthহয় -in 2,4,6,9,11(যেমন, একটি 31-দিনের মাস নয়) যোগ করে। তারপরে আমরা আমাদের মোট মাসগুলি বিয়োগ -১১-দিনের মাসগুলি $x-$z, এবং ৩১ দিনের নয় মাসগুলিকে আউটপুট করি$z

0001-01টু 9999-12কেস কেস-এ একটি ত্রুটি দেখায় , কারণ .NET কেবল বছরের পর বছর ধরে সমর্থন করে 9999, তাই চূড়ান্তভাবে .AddMonths(1)একটি ওভারফ্লো হয়ে যায়। তবুও সঠিক মানগুলি আউটপুট করে, কারণ এটি একটি চূড়ান্ত নয় এমন ত্রুটি; এটি কেবল লুপটি প্রস্থান করতে পারে।

পাইথন বা জাভাস্ক্রিপ্ট উত্তরের মতো সম্ভবত এটি গাণিতিকভাবে করা আরও কম হবে তবে আমি নেট বিল্ট-ইনগুলি ব্যবহার করে একটি পন্থা দেখাতে চেয়েছিলাম।


2

বাশ , 113 বাইট

s="$1-1";e="$2-1";sort <(while [ "$s" \< "$e" ];do s=$(date +%F -d"$s+1month");date +%d -d"$s-1day";done)|uniq -c

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

গল্ফিং দরকার ...

হিসাবে ইনপুট লাগে 2016-03 2018-10

আউটপুট:

  1 28
  7 30
 12 31

ungolfed:

s="$1-1"
e="$2-1"                     # adds first day of month to the dates
sort <(                    
while [ "$s" \< "$e" ]; do   #iterates over dates
s=$(date +%F -d"$s+1month")  #adds one month to start date
date +%d -d"$s-1day"         #outputs last day of previous month
done) | uniq -c              #counts ocurrences of day number prevously sorted

1

সুইফ্ট, 151 বাইট

let f={(m:[Int])->[Int] in var k=[0,0]
(m.min()!...m.max()!).map{$0%100}.filter{$0>0&&$0<13}.forEach{m in let n = m>7 ?m-7:m
k[(n%2+1)%2]+=1}
return k}

ইনপুট উদাহরণ হিসাবে বিন্যাসে দুটি পূর্ণসংখ্যার একটি অ্যারে হয়

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