अगली सार्वजनिक छुट्टी


18

ऑस्ट्रेलियाई लोगों को सार्वजनिक अवकाश और शराब पीना बहुत पसंद है। कल, 26 जनवरी, ऑस्ट्रेलिया का दिन था, जो एक सार्वजनिक अवकाश है। मुझे कल काम पर नहीं होने की खुशी थी, और अगली बार सार्वजनिक अवकाश प्राप्त करने के लिए उत्सुक था! दुर्भाग्य से, मेरे पास पीने के लिए थोड़ा बहुत था, और मैं इसे अपने लिए काम करने में सक्षम नहीं हूं।

एक प्रोग्राम लिखें जो इनपुट के रूप में ऑस्ट्रेलियाई तिथि / समय संकेतन (dd / मिमी) में ले जाएगा, और अगले सार्वजनिक अवकाश तक दिनों की मात्रा का उत्पादन करेगा। क्योंकि मैं एक क्वींसलैंड (QLD) निवासी हूं, मुझे केवल सार्वजनिक छुट्टियों में दिलचस्पी है जो क्वींसलैंडर्स को प्रभावित करती है :

25/03 | गुड फ्राइडे
26/03 | ईस्टर शनिवार
28/03 | ईस्टर सोमवार
25/04 | अंजेक दिवस
02/05 | मजदूर दिवस
03/10 | रानी का जन्मदिन
25/12 | क्रिसमस दिवस
26/12 | बॉक्सिंग डे
27/12 | क्रिसमस दिवस की छुट्टी

साइट से निम्नलिखित पर ध्यान दें:

क्रिसमस दिवस की छुट्टी

नए साल के दिन, क्रिसमस दिवस या बॉक्सिंग डे के सप्ताहांत पर पड़ने पर एक अतिरिक्त सार्वजनिक अवकाश जोड़ा जाता है।

क्योंकि रविवार को क्रिसमस का दिन होता है, इसलिए एक अतिरिक्त सार्वजनिक अवकाश होता है। क्रिसमस का दिन अभी भी सार्वजनिक अवकाश है।

क्योंकि मैं एक सुबह का व्यक्ति हूं, आपको एक दिन के रूप में वर्तमान तिथि को शामिल करना चाहिए (जैसा कि सबसे अधिक संभावना है कि मैं अगले कार्यक्रम की छुट्टी के लिए आपके कार्यक्रम की जांच करूंगा)। अर्थात्, यदि सार्वजनिक अवकाश की तारीख दर्ज की जाती है, तो आपका आउटपुट होना चाहिए 0; यदि सार्वजनिक अवकाश में प्रवेश करने से एक दिन पहले, आपका आउटपुट होगा 1

मैं केवल के बीच तारीखों में दिलचस्पी रखता हूँ अब वर्ष के अंत तक (27/01)। अंतिम तिथि आपको 31/12 के लिए खाते की आवश्यकता होगी जहां आपका आउटपुट होगा 1(नए साल के दिन के लिए)।

मानक खामियों को मना किया जाता है।

इनपुट

  • इनपुट में हमेशा 5 अक्षर होंगे: 4 अक्षर, एक हाइफ़न -या स्लैश के साथ अलग/
  • इनपुट केवल 27/01 और 31/12 के बीच की तारीख होगी

उत्पादन

  • क्वींसलैंड ऑस्ट्रेलिया में अगली सार्वजनिक छुट्टी के दिनों तक की संख्या, इनपुट तिथि को मिलाकर: के बीच एक संख्या होनी चाहिए 0और153 (सबसे लंबे समय तक अंतराल)
  • कोई नई रेखा या त्रुटि नहीं

उदाहरण

01-05 = 1  
02-05 = 0  
03-05 = 153  
25/12 = 0
26-12 = 0
27/12 = 0
30/12 = 2
31-12 = 1

उम्मीद है कि यह स्पष्ट है और कुछ भी याद नहीं है; हालाँकि, यह मेरा दूसरा प्रश्न है इसलिए मैं किसी भी प्रतिक्रिया की सराहना करूँगा और ASAP की समस्याओं को ठीक करने की पूरी कोशिश करूँगा।


@insertusernamehere बढ़िया सुझाव के लिए धन्यवाद! मैंने दिनांक को प्रश्न में जोड़ा है
तस

@ क्या आप सुनिश्चित हैं कि वे तिथियां सही हैं? उदाहरणों में से कोई भी बोली से मेल नहीं खाता है और दोनों वेबसाइट से मेल नहीं खाते हैं।
एडम मार्टिन

@AdamMartin कि बाहर इशारा करने के लिए धन्यवाद। मैंने दिसंबर की तारीखों में गलत तरीके से रखा था। उदाहरण में से कोई भी सार्वजनिक तिथियों के लिए विशिष्ट नहीं हैं। वे सिर्फ तारीखों के उदाहरण हैं जिन्हें दर्ज किया जा सकता है, और आउटपुट क्या होना चाहिए। उद्धृत लोगों को (और उम्मीद है कि) वेबसाइट से मेल खाना चाहिए
तस

आप क्वींसलैंड में अक्टूबर में रानी का जन्मदिन मनाते हैं? यह बहुत अजीब है, लेकिन लिंक से सही लगता है।
लेवल रिवर सेंट

वाह, तुम लोग सितंबर से सीधे जून से कोई अवकाश नहीं है? वह खुरदरा है।
जो जे।

जवाबों:


2

पायथ , 98 84 62 67 बाइट्स

अद्यतन: दिन संख्या की गणना के लिए सभी 12 महीनों के लिए दिन की सूची को छोटा करके 14 बाइट्स सहेजे गए। अन्य सूची को संक्षिप्त करने के लिए एक अच्छा तरीका नहीं मिला, अभी भी कोशिश कर रहा है!

Update2: आधार -256 स्ट्रिंग के रूप में दिन-संख्या की सूची को एन्कोड करके एक और 22 बाइट्स सहेजा गया।

J30KhJ=Yc:z"\W"dd=N+s<[KtJKJKJKKJKJK)tseYshY-hfgTNCMc"UVXt{ĕŨũŪů"1N

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

मेरे पाइथन उत्तर में समान एल्गोरिथ्म। और वर्ष के दिन प्राप्त करने के लिए कोई बिल्टिन नहीं, इसलिए मुझे इसे स्वयं करना पड़ा। साल की गणना के लिए और छुट्टियों के दिनों के लिए उन 2 सूचियों का निर्माण करना काफी महंगा है ... फिर से इस पर एक नज़र डालते हैं और कम बाइट में उन्हें उत्पन्न करने का प्रयास करते हैं।


यह करने के लिए इनपुट की तरह हाइफ़न से अलग प्रतीत नहीं होता है, लेकिन अन्यथा महान है
Tas

@ टिंट संकेत के लिए, पूरी तरह से उस हिस्से को फैलाया ... इसे 5 और बाइट्स की कीमत पर तय किया। हो सकता है कि आप वृषण में कुछ हाइफ़न जोड़ दें, क्योंकि आप चाहते हैं कि वे हर संभव इनपुट भिन्नता को कवर करें।
डेन्कर

5

अनुप्रयोगों के लिए विज़ुअल बेसिक, 155 या 118 बाइट्स

संस्करण 1 - स्थानीय-स्वतंत्र, 155 बाइट्स

Function h(d)
For i=0To 9
h=Array(0,1,3,31,38,192,275,276,277,282)(i)+42454-DateSerial(16,Val(Right(d,2)),Val(Left(d,2)))
If h>=0Goto 9
Next
9 End Function

संस्करण 2 - स्थानीय-निर्भर, 118 बाइट्स

Function h(d)
For i=0To 9
h=Array(0,1,3,31,38,192,275,276,277,282)(i)+42454-CDate(d)
If h>=0Goto 9
Next
9 End Function

बाइट की गिनती अंतिम .BAS फ़ाइल के लिए होती है, जिसमें लाइनफ़ीड वर्ण शामिल होते हैं। मानक VBA संपादक के बाहर संपादित (क्योंकि यह अतिरिक्त स्थान और कुछ कीवर्ड के क्रिया रूपों को लगाता है) - लेकिन आयात करता है और किसी भी कार्यालय अनुप्रयोग पर सुचारू रूप से चलता है (जैसे ? h("10/08")कि तत्काल विंडो में प्रकार का परीक्षण करने के लिए , या Excel में सीधे सेल सूत्र में उपयोग करें)।

(EDITED) शुरू में मैंने DateSerialफंक्शन को लोकेल-सेफ (संस्करण 1) बनाने के लिए उपयोग करने के लिए चुना । जब मैं ब्राज़ील में रहता हूं और इस प्रकार मेरा सिस्टम तारीखों (ऑस्ट्रेलिया की तरह) के लिए "dd / mm / yy" प्रारूप का उपयोग करने के लिए कॉन्फ़िगर किया गया है, तो मैं CDateइसके बजाय (संस्करण 2) का उपयोग करके एक छोटा संस्करण भी लिख सकता हूं । CDateपाठ में तिथि बदलने के लिए सिस्टम लोकल जानकारी का उपयोग करता है। मैंने इस संस्करण में यह भी माना कि कोड केवल 2016 के दौरान चलाया जाएगा (यदि वर्ष छोड़ा गया है (-6 बाइट्स) CDateसिस्टम वर्ष के अनुसार चालू वर्ष मानता है)।

तीसरी पंक्ति पर 42454 की संख्या 42450 का योग है जो VBA पर 01/01/2016 का संख्यात्मक प्रतिनिधित्व है, और 84 जो कि पहली छुट्टी के लिए वर्ष का दिन है। ऐरे में प्रत्येक अवकाश के लिए दिन-प्रति-वर्ष (01/01/2017 सहित) -84 की भरपाई होती है क्योंकि यह कुछ अंकों को दूर ले जाता है। 2016 के बजाय 16 का उपयोग करने से DateSerialदो और बाइट्स दूर हो जाते हैं।

पुनरावृति के अंदर नौ बार एक समान सरणी बनाना "खराब" कोड है, लेकिन काम करता है और 3 और बाइट्स बचाता है (सरणी नाम के लिए एक और लूप के बाहर समान चिह्न के लिए एक, और लूप के अंदर सरणी को संदर्भित करने के लिए एक और)।

दूसरी और चौथी पंक्तियों पर 0 और निम्न कीवर्ड के बीच "लापता" रिक्त स्थान आवश्यक नहीं हैं क्योंकि वे मॉड्यूल आयात होने पर VBE द्वारा स्वचालित रूप से पुन: प्रस्तुत किए जाते हैं। If <...> Goto <linenumber>लूप से टूटने के लिए पुराने (लेकिन बाइट-सस्ते ) का उपयोग किया जाता है (दोनों If <...> Then Exit Forऔर If <...> Then Exit Functionअधिक वर्णों का उपयोग करें)।

इस तथ्य का भी लाभ उठाया कि VBA में फ़ंक्शन नाम एक स्थानीय चर के रूप में व्यवहार करता है, और इसका मूल्य निष्पादन के अंत में फ़ंक्शन द्वारा स्वचालित रूप से लौटाया जाता है।


PPCG में आपका स्वागत है! यहाँ हम दुभाषिया द्वारा एक प्रोग्रामिंग भाषा को परिभाषित करते हैं, इसलिए एक निश्चित स्थान की आवश्यकता के लिए यह पूरी तरह से स्वीकार्य है।
lirtosiast

धन्यवाद! एक छोटे स्थान पर निर्भर संस्करण को जोड़ने का संपादन किया।
18

4

जावास्क्रिप्ट (ईएस 6), 131 128 बाइट्स

d=>[56,57,59,87,94,248,331,332,333,338].map(n=>r=r||(q=1454e9+n*864e5-new Date(d[3]+d[4]+`/${d[0]+d[1]}/16`))>=0&&q/864e5,r=0)|r

व्याख्या

Dateयुग के बाद से इनपुट स्ट्रिंग को कई मिलीसेकंड में बदलने के लिए जावास्क्रिप्ट बिल्ट-इन कंस्ट्रक्टर का उपयोग करता है , फिर प्रत्येक सार्वजनिक अवकाश के लिए मिलीसेकंड की संख्या के साथ इसकी तुलना करता है।

यह एक संदर्भ तिथि के बाद से दिनों की संख्या के रूप में सार्वजनिक छुट्टियों को एक सरणी में संग्रहीत करके करता है। मैंने 2016-01-29संदर्भ तिथि के लिए चुना क्योंकि युग के बाद से मिलीसेकंड की संख्या को इस तिथि के लिए सबसे छोटा माना जा सकता है। इस दिन और अगले कार्यों के बीच कोई भी मिलीसेकंड क्योंकि परिणाम नीचे गोल है, और बीच में नंबर रखने से दिन के उजाले के प्रभाव से बचा जाता है (हालांकि ओपी के समयक्षेत्र में दिन की बचत नहीं होती है)। इस दिन की संख्या है 1453986000000और इसे 1454000000000कुछ घंटों तक जोड़ना (इसका मतलब है कि यह कुछ घंटों के लिए लिखा जा सकता है) 1454e9

d=>
  [56,57,59,87,94,248,331,332,333,338]             // list of day offsets from 01/29
  .map(n=>                                         // for each public holiday offset n
    r=r||                                          // if r is already set, do nothing
      (q=                                          // q = approximate difference in ms
        1454e9+n*864e5                             // time of public holiday
        -new Date(d[3]+d[4]+`/${d[0]+d[1]}/16`)    // time of input date
      )
      >=0&&                                        // if q >= 0
        q/864e5,                                   // r = q in days
    r=0                                            // r = result
  )
  |r                                               // floor and return r

परीक्षा

यह समाधान उपयोगकर्ता के टाइमज़ोन पर निर्भर है। यह ओपी (और मेरे) टाइम ज़ोन (GMT +1000) में काम करता है। यदि आप इसे एक अलग समय क्षेत्र में परीक्षण करना चाहते हैं, numberOfHoursDifferentFromGMT1000 * 60 * 60 * 1000तो संदर्भ तिथि संख्या को जोड़कर काम करना चाहिए । (उदा। GMT +0430 होगा -5.5 * 60 * 60 * 1000 + 1454e9+n*864e5)


यह हमेशा 0 देता है जब तारीख एक हाइफ़न द्वारा अलग हो जाती है। मैंने पहले ही ओपी को अपने टेस्टस्कैप्स को समायोजित करने के लिए कहा, क्योंकि वे सभी सेपरेटर के रूप में स्लैश के साथ हैं।
डेन्कर

@DenkerAffe ओह, मुझे लगा कि उनका मतलब है कि हम एक विभाजक चुनने के लिए स्वतंत्र थे। संयोग से, इसे अलग-थलग करने के कारण मुझे 3 बाइट्स बच गए, इसलिए धन्यवाद!
user81655

1
नियम separated with a hyphen - or slash /जैसा लगता है थोड़ा अस्पष्ट है। मेरे लिए इसका मतलब है कि हमें दोनों से निपटना है, लेकिन मैं निश्चित रूप से आपका पक्ष देख सकता हूं। अनुमान है कि ओपी को यह स्पष्ट करना चाहिए।
डेन्कर

3

टी-एसक्यूएल, 210 , 206 , 194 बाइट्स

(पहली पोस्ट यहाँ, आशा है कि यह ठीक है, लेकिन कृपया अच्छे हों :)

इनपुट जाता है @i, दोनों के लिए /और -विभाजक के रूप में पूरा करता है । मैं ऑस्ट्रेलिया में हूं, इसलिए मेरी तिथि प्रारूप @ टास के समान है

DECLARE @i CHAR(5)='23-09';DECLARE @c INT=DATEPART(dy,CAST(REPLACE(@i,'-','/')+'/2016' AS DATE))-1;SELECT MIN(b)-@c FROM(VALUES(84),(85),(87),(115),(122),(276),(359),(360),(361))a(b)WHERE b>=@c;

3 बाइट्स बचाने के varcharलिए अपडेटchar प्लस एक स्थान हटा दिया :)

अपडेट २ घोषित करें @cऔर बिना चयन के असाइन करें


2

टी-एसक्यूएल, 296 बाइट्स

एक टेबल वैल्यू फंक्शन के रूप में बनाया गया

create function d(@ char(5))returns table return select min(o)o from(select datediff(day,cast('2016'+right(@,2)+left(@,2)as date),cast(right('2016'+right('0'+cast(d as varchar(4)),4),8)as datetime)+1)o from(values(324),(325),(327),(424),(501),(1002),(1224),(1225),(1226),(1231))d(d))d where 0<=o

निम्नलिखित तरीके से उपयोग किया जाता है

SELECT *
FROM (
    VALUES
        ('01/05') --= 1  
        ,('02/05') --= 0  
        ,('03/05') --= 153  
        ,('25/12') --= 0
        ,('26/12') --= 0
        ,('27/12') --= 0
        ,('30/12') --= 2
        ,('31/12') --= 1
    )testData(i)
    CROSS APPLY (
        SELECT * FROM d(t)
    ) out

i     o
----- -----------
01/05 1
02/05 0
03/05 153
25/12 0
26/12 0
27/12 0
30/12 2
31/12 1

(8 row(s) affected)

एक संक्षिप्त विवरण

create function d(@ char(5)) returns table  -- function definition
return 
select min(o)o -- minimum set value
from(
    select datediff( -- date difference
        day, -- day units
        cast('2016'+right(@,2)+left(@,2)as date), -- convert input parameter to date
        cast(right('2016'+right('0'+cast(d as varchar(4)),4),8)as datetime)+1 -- convert int values into datetimes and add a day
        )o 
    from(
        values(324),(325),(327),(424),(501),(1002),(1224),(1225),(1226),(1231) -- integers representing the day before public holidays
        )d(d)
    )d 
where 0<=o -- only for values >= 0

2

जावास्क्रिप्ट (ईएस 6), 134 बाइट्स

x=>[0,1,3,31,38,192,275,276,277,282].find(z=>z>=(q=x[0]+x[1]- -[...'20212122121'].slice(0,x[3]+x[4]-1).reduce((a,b)=>+b+a+29,0)-85))-q

user81655 ने अभी भी मुझे 3 बाइट्स से हराया है, लेकिन मैं यहाँ से बाहर कुछ भी निचोड़ने के लिए कहीं और नहीं मिल सकता। दिनांक का उपयोग करने के बजाय गए दिनों की संख्या की गणना करके काम करता है, फिर इसकी तुलना अवकाश के एक सरणी से करते हैं।


2

अजगर 2, 204 185 165 166 बाइट्स

अपडेट: वर्ष के दिन की गणना करके ~ 20 बाइट्स द्वारा इसे अपने आप से नीचे ले जाएं। अब लंबे आयात की कोई आवश्यकता नहीं है :)

अपडेट 2: एक और 20 बाइट्स यह महसूस करके कि मैं नए साल का इलाज कर सकता हूं जैसे कि दिन 367 और कुछ अन्य छोटे समायोजन।

def f(d):d=[d[:2],d[3:]];y=sum([31,29,31,30,31,30,31,31,30,31,30,31][:int(d[1])-1])+int(d[0]);return filter(lambda n:n>=y,[85,86,88,116,123,277,360,361,362,367])[0]-y

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

Ungolfed:

def f(d):
    l=[85,86,88,116,123,277,360,361,362,367]
    d=[d[:2],d[3:]]
    y=sum([31,29,31,30,31,30,31,31,30,31,30,31][:int(d[1])-1])+int(d[0])
    f=filter(lambda n:n>=y,l)
    return f[0]-y

एक सूची में छुट्टियों के दिन-दर-साल की संख्या को संचय करके काम करता है, जो दिए गए तारीख से पहले हैं, उस फ़िल्टर किए गए सूची में पहला तत्व लेते हैं और दिन के वर्ष को घटाते हैं, जो इनपुट से गणना की गई।


1

PHP, 116 बाइट्स

बहुत सीधे आगे दृष्टिकोण। यह छुट्टियों के लिए वर्ष के दिनों को संग्रहीत करता है और उन्हें तब तक पॉप करता है जब तक वे अतीत में होते हैं। अंत में वर्ष का अनुरोधित दिन घटाया जाता है।

for($x=[366,361,360,359,276,122,115,87,85,84];($a=date(z,strtotime($argv[1].'-2016')))>$t=array_pop($x););echo$t-$a;

सभी परीक्षण मामलों को विगत। कमांड लाइन से चलता है और एक हाइफ़न का उपयोग करके इनपुट स्वीकार करता है, जैसे:

$ php holidays.php "12-05"

1

रूबी 1.9.3, 155 153 बाइट्स

क्रिसमस दिवस की छुट्टी के बाद, हमें अपने सुपर-स्पेशल-दिन 366 की आवश्यकता है! @DenkerAffe जैसा ही मामला।

require'date'
c=(Date.strptime(ARGV[0],'%d/%m')-Date.parse('01/01')).to_i
print [84,85,87,115,122,276,359,360,361,366].map{|i|(i-c)}.select{|i|i>=0}.min

उपयोग:

$ ruby i_want_to_break_free.rb "03/05"

मुझे रूबी के बारे में ज्यादा जानकारी नहीं है, लेकिन मुझे लगता है कि आप पंक्ति 1 में व्हाट्सएप को हटाकर 3 बाइट्स बचा सकते हैं और 3. इसके अलावा आपको यह निर्दिष्ट करना चाहिए कि आप किस इनपुट विधि का उपयोग कर रहे हैं, क्योंकि यह आपके कोड में स्पष्ट नहीं है। आप फ़ंक्शन को परिभाषित करके कुछ बाइट्स बचा सकते हैं, इसलिए आप इनपुट को आर्गुमेन के रूप में ले सकते हैं और आउटपुट के रूप में रिटर्न मान का उपयोग कर सकते हैं।
Denker

@DenkerAffe बहुत बहुत धन्यवाद! मैंने 2 बाइट्स बचाए हैं, लेकिन मुझे लगता है कि एक फ़ंक्शन संख्या बढ़ाएगा। मैंने उत्तर का उपयोग उदाहरण के साथ अद्यतन किया है।
तारोड

0

05AB1E , 45 बाइट्स

•9JRt€ª´Q®Ië•368вDI„-/S¡`•Σ₁t•ºS₂+s<£O+©@Ïн®-

यह अब 2016 नहीं हो सकता है, लेकिन जो भी हो ..) अभी भी मानता है कि वर्ष 2016 29फरवरी के लिए एक लीप वर्ष होने के लिए है।

इसे ऑनलाइन आज़माएं या सभी परीक्षण मामलों को सत्यापित करें

स्पष्टीकरण:

9JRt€ª´Q®Ië•  # Push compressed integer 10549819042671399072072399
  368в         # Converted to base-368 as list: [85,86,88,116,123,277,360,361,362,367]
      D        # Duplicate this list
I              # Take the input
 „-/S¡         # Split it on ["-","/"]
      `        # Push both integer separated to the stack
•Σ₁t          # Push compressed integer 5354545
     º         # Mirror it without overlap: 53545455454535
      S        # Converted to a list of digits: [5,3,5,4,5,4,5,5,4,5,4,5,3,5]
       ₂+      # Add 26 to each: [31,29,31,30,31,30,31,31,30,31,30,31,29,31]
         s     # Swap to get the month-integer
          <    # Decrease it by 1
           £   # Only leave the first month-1 values from the integer-list
            O  # Sum that sublist
             + # And add it to the day-integer (so we now have the N'th day of the year)
©              # Save this in the register (without popping)
 @             # Do a >= check with each integer in the first (duplicated) list we created
  Ï            # Only leave the truthy values from the list
   н           # Then pop this sublist and only leave its first value
    ®-         # And subtract the integer we saved in the register (N'th day of the year)
               # (after which the result is output implicitly)

मेरा 05AB1E टिप देखें (यह समझने के लिए कि बड़े पूर्णांकों को कैसे संपीड़ित करें ? और पूर्णांक सूचियों को कैसे संपीड़ित करें? ) क्यों •9JRt€ª´Q®Ië•है 10549819042671399072072399? •9JRt€ª´Q®Ië•368вहै [85,86,88,116,123,277,360,361,362,367]; और •Σ₁t•है 5354545

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