गणना करें कि कितने महीने पूरे हो रहे हैं पोर को गिनकर 31 दिन


12

आप में से कितने हैं जो अभी भी अपने स्वयं के पोर का उपयोग यह निर्धारित करने के लिए करते हैं कि क्या एक महीने पूरे 31 दिन या उससे कम है?

आप काम करते हैं कि कितने महीने, एक महीने की सीमा में, पूरे 31 दिन हो सकते हैं और कितने दिन "अंगुलियों की गिनती" करके 31 दिनों से कम के हैं।

पोर से महीने के दिनों की गिनती

सौजन्य: amsi.org.au


इनपुट

महीनों की एक जोड़ी, जिनमें से पहले को किसी भी उपयुक्त प्रारूप में दिए गए दूसरे से पहले कालानुक्रमिक रूप से नहीं आना पड़ता है। उदाहरण के लिए: 201703 201902- मार्च 2017 से फरवरी 2019 तक। कृपया अपने द्वारा चुने गए इनपुट प्रारूप का वर्णन करें। ध्यान दें कि इनपुट 1 से 9999 तक के सभी वर्षों को शामिल करने में सक्षम होना चाहिए। निर्दिष्ट महीनों की सीमा में शुरुआती और अंतिम दोनों महीने शामिल हैं।

उत्पादन

दो पूर्णांक: दी गई श्रेणी में महीनों की संख्या और 31 दिनों से कम की रेंज में महीनों की संख्या।

उदाहरण: 14 10- १४ पोर, १० खांचे (इसका अर्थ है कि उस महीने की रेंज में हमारे पास १४ महीने हैं, जिसमें पूरे ३१ दिन हैं, और १० महीने जिनके पास ३१ दिन से कम है)।

एक इनपुट के लिए जहां सीमा में दूसरा महीना कालानुक्रमिक रूप से पहले आता है, उदाहरण के लिए 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
तीस दिन सितंबर, अप्रैल, जून और नवंबर। फरवरी के किए जाने के बाद, बाकी के सभी इकतीस हैं। मुझे यह याद है।
AdmBorkBork

@AdmBorkBork उस के साथ एकमात्र समस्या अनंत लूपिंग (अनिवार्य 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

जावास्क्रिप्ट (ईएस 6), 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)

परीक्षण के मामलों

NB : तीसरा परीक्षण मामला इस स्निपेट में शामिल नहीं है, क्योंकि यह तब तक काम नहीं करेगा जब तक आपके ब्राउज़र में टेल कॉल ऑप्टिमाइज़ेशन सक्षम न हो।


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']

इसे ऑनलाइन आज़माएं!

विचार के लिए @math_junkie को धन्यवाद के साथ एक लंबोदर में परिवर्तित करके 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 से छुटकारा पाने में मेरी मदद करने के लिए @ovs के साथ धन्यवाद len(k)। मैंने उपयोग करने के बारे में नहीं सोचा था None

इनपुट प्रारूप में पूर्णांकों की एक सूची है y1,m1,y2,m2

@KeerthanaPrabhakaran के कारण कुछ श्रेय जो bin(2741)[2:]मुझे मिलने से पहले मिला जो बाइनरी स्ट्रिंग को हार्ड कोडिंग पर 1 बाइट बचाता है।


प्रभावशाली ... के = बिन (2741) [2:] * (सी + 1-ए) ने मेरे दिमाग को उड़ा दिया
आधिकारिक

1
यह 2 बाइट्स छोटा है
डिम्ब

प्रतिभाशाली! मैं len(k)आखिरी स्लाइस से छुटकारा पाने के लिए बाहर काम करने की कोशिश कर रहा था । धन्यवाद।
ElPedro

1
आप एक मेमने का उपयोग करके 6 बाइट्स बचा सकते हैं: टीआईओ
गणित नशेड़ी

4

PHP , 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%

यम प्रारूप में दो मापदंडों को स्वीकार करता है (अर्थात 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 के लिए गलत परिणाम, शायद पूर्णांक आकार सीमा के कारण?
आधिकारिक

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 बाइट्स को बचाया: t = 0; k = 0 को t = k = 0 के रूप में घटाया
  • 2 बाइट्स बचाया: कोल के लिए धन्यवाद (मैं इससे पहले चूक गया था)
  • सहेजे गए 2 बाइट्स: कीर्तन के लिए धन्यवाद
  • सहेजे गए 8 बाइट्स: अवांछित चर हटा दिए गए
  • सहेजे गए 3 बाइट्स: math_junkie (स्प्लिट ('') से स्प्लिट ()) के लिए धन्यवाद

1
मुझे लगता है कि आप कुछ बाइट्स कम कर सकते हैं n=intऔर शायद कुछ execटोमफूलरी भी ।
कोल

1
मुझे लगता है कि आप 2773&1<<r%12-1>0इसके बजाय कर सकते हैंint('101010110101'[r%12-1])
Loovjo

@Lovjo मुझे ऐसा करने में त्रुटि हो रही है!
अधिकारिक

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 बाइट्स - सरणी लुकअप के साथ if-else क्लॉज़ का सुझाव देने के लिए @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

PHP, 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.

बदलाव

  • DateTime ऑब्जेक्ट शैली के बजाय टाइमस्टैम्प शैली का उपयोग करके 17 बाइट्स सहेजे गए
  • सहेजे गए 6 बाइट्स को अंतिम तिथि टाइमस्टैम्प को वेरिएबल में न देकर $e, सीधे तुलना करें
  • खांचे की गिनती नहीं रखते हुए 1 बाइट को सहेजा, लेकिन लूप के बाद ही इसे कंप्यूटिंग किया

$x++इसके बजाय +$x++भी काम करता है।
टाइटस

@ टिट्स, मेरे पास पहले ऐसा था, लेकिन एहसास हुआ कि असिंचित के साथ $xस्ट्रिंग होगी 2017-12month, जो कि एक अपरिचित प्रारूप है और 1970 में परिणाम
Aross

दुष्ट ... यह कहीं काम किया। हालांकि यह +स्ट्रिंग में एक शाब्दिक के बिना काम करता है कि काफी दुष्ट है ।
टाइटस

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। उपयोग में निर्मित नेट तारीख पुस्तकालयों और के माध्यम से इनपुट से छोरों $aको $b, प्रत्येक यात्रा incrementing $x++और को जोड़ने $zअगर वर्तमान .Monthहै -in 2,4,6,9,11(यानी, एक गैर 31 दिन के महीने)। फिर हम अपने कुल महीनों को गैर-31-महीने के महीनों $x-$z, और गैर-31-महीने के महीनों में उत्पादन करते हैं $z

पर एक त्रुटि tosses 0001-01के लिए 9999-12, परीक्षण का मामला है क्योंकि नेट केवल साल तक का समर्थन करता है 9999तो अंतिम, .AddMonths(1)का कारण बनता है एक अतिप्रवाह। फिर भी, सही मानों को आउटपुट करता है, हालांकि, यह एक गैर-समाप्ति त्रुटि है; यह सिर्फ लूप को बाहर निकलने का कारण बनता है।

संभवत: यह अंकगणित करने के लिए छोटा होगा, जैसे कि पायथन या जावास्क्रिप्ट उत्तर देता है, लेकिन मैं .NET निर्मित आईएनएस का उपयोग करके एक दृष्टिकोण दिखाना चाहता था।


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}

इनपुट उदाहरण के अनुसार प्रारूप में दो पूर्णांकों की एक सरणी है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.