अगले फरवरी 29 के सप्ताह का दिन


14

एक समारोह लिखें जो एक तारीख लेता है और उस तारीख के बाद अगले 29 फरवरी के सप्ताह का दिन लौटाता है।

  • इनपुट आईएसओ विस्तारित प्रारूप में एक स्ट्रिंग है: YYYY-MM-DD (उदाहरण के लिए 27 मई, 2010 "2010-05-27") होगा।

  • आउटपुट एक स्ट्रिंग है जो सप्ताह के दिन का नाम है (उदाहरण के लिए "सोमवार")। कैपिटलाइज़ेशन मायने नहीं रखता है, लेकिन पूरा नाम अंग्रेजी में दें।

  • यदि दी गई तारीख 29 फरवरी है, तो अगले फरवरी 29 के सप्ताह का दिन वापस करें ।

  • प्रोलेप्टिक ग्रेगोरियन कैलेंडर के लिए गणना का उपयोग करें (इसलिए, यह पूरी लंबाई के लिए ग्रेगोरियन लीप वर्ष गणना का उपयोग करता है)। जूलियन कैलेंडर के बारे में चिंता मत करो या जब जूलियन से ग्रेगोरियन में स्विच हुआ। बस सब कुछ के लिए ग्रेगोरियन मान लें।

  • फ़ंक्शन को कम से कम "0001-01-01" की श्रेणी के लिए काम करना चाहिए - "2100-01-01"।

  • अपनी पसंद की भाषा प्रदान करने वाले मानक पुस्तकालयों का उपयोग करने के लिए स्वतंत्र महसूस करें, लेकिन जब तक आप उस कोड को अपने समाधान के हिस्से के रूप में शामिल नहीं करना चाहते तब तक 3 पार्टी पुस्तकालयों का उपयोग न करें।

  • सबसे छोटा कोड (सबसे कम वर्ण) जीतता है।

उदाहरण:

  • func("0001-01-01") -> "Sunday"
  • func("1899-12-03") -> "Monday"
  • func("1970-01-01") -> "Tuesday"
  • func("1999-07-06") -> "Tuesday"
  • func("2003-05-22") -> "Sunday"
  • func("2011-02-17") -> "Wednesday"
  • func("2100-01-01") -> "Friday"

(और नहीं, आपको फ़ंक्शन का नाम नहीं देना है func)

संकेत:

  • याद रखें कि 00 में समाप्त होने वाले वर्ष 400 से विभाजन योग्य नहीं हैं।
  • पहली जनवरी, 0001 सोमवार है।

जवाबों:


7

विंडोज पॉवरशेल, 65

काफी सरल।

filter f{for($d=date $_;($d+='1').day*$d.month-58){}$d.dayofweek}

हमेशा की तरह, हम दो बाइट्स काट सकते हैं यदि हम पूरा होने तक लंबे समय तक इंतजार करने को तैयार हैं:

filter f{for($d=date $_;($d+=9).day*$d.month-58){}$d.dayofweek}

परीक्षा:

> '0001-01-01','1899-12-03','1970-01-01','1999-07-06','2003-05-22','2011-02-17','2100-01-01'|f
Sunday
Monday
Tuesday
Tuesday
Sunday
Wednesday
Friday

इतिहास:

  • 2011-02-18 00:06 (65) पहला प्रयास।

इसके लिए कौन सा रास्ता आवश्यक है? मेरे पास मेरे रास्ते में GnuWin तारीख है, जो इसे तोड़ रही है।
पीटर टेलर

@Peter: इसके साथ टकराव हो सकता है date। बस पेटू से GNUWin32 को हटा दें और इसे काम करना चाहिए। या परिवर्तन dateकरने के लिए Get-Date(- जाँच करने के लिए, बस उपयोग fallback व्यवहार उस तरह ही जब कोई आदेश पाया जाता है काम करता है gcm date)। वैसे भी, मैं यह नहीं मानता कि इस स्क्रिप्ट के साथ एक विशेष समस्या GNUWin32 किसी भी मानक विंडोज इंस्टॉलेशन का हिस्सा नहीं है।
जॉय

मेरे द्वारा पूछे जाने का कारण यह था क्योंकि मैंने पहले से ही उपयोग करने की कोशिश की get-dateऔर त्रुटि संदेश मिला Method invocation failed because [System.Management.Automation.PSObject] doesn't contain a method named 'op_Addition'.क्या इसे PS2 या .net 4 या कुछ और की आवश्यकता है?
पीटर टेलर

@Peter: मैंने PowerShell v2 की कोशिश की। .NET 4 इसमें नहीं चलता है क्योंकि PowerShell 2.0 रनटाइम से जुड़ा हुआ है। किसी भी मामले में, वहाँ से एक PSObject आ वापस नहीं होना चाहिए Get-Date, लेकिन एक System.DateTime
जॉय

यह बहुत अजीब है। DateTime पर परिभाषित नहीं होने के $d=Get-Date "0400-01-01"; $d++बारे में एक त्रुटि संदेश देता है ++। एक ही जगह ++के साथ +=1या +="1"या +='1'PSObject के बारे में त्रुटि संदेश देता है। और बस +"1"काम करता है।
पीटर टेलर

5

रूबी 1.9, 85 वर्ण

f=->a{require"date";d=Date.parse(a,0,0)+1;d+=1until d.day*d.month==58;d.strftime"%A"}

सीधा समाधान। के साथ फ़ंक्शन को कॉल करें f[args]

  • संपादित करें: (87 -> 97) 0001-01-01टेस्टकेस को निर्धारित किया ।
  • 2 संपादित करें: (97 -> 91) Date.parse कैलेंडर सुधार की तिथि को भी निर्दिष्ट करने की अनुमति देता है।
  • 3 संपादित करें: (91 -> 87) एक फ़ंक्शन के बजाय एक लैम्ब्डा का उपयोग करें। धन्यवाद डॉगबर्ट !
  • 4 संपादित करें: (87 -> 85) अनावश्यक रिक्त स्थान निकालें। फिर से धन्यवाद, डॉगबर्ट !

4
"0001-01-01" के लिए टेस्टकेस को विफल करता है। रूबी की तारीख बहुत शक्तिशाली है, यह जूलियन तारीखों को ध्यान में रखती है।
स्टीवंसलाग

@Ventero क्या करता है * क्या करना है? इसे पहले कभी नहीं देखा।
स्टीवंसलाग

@steenslag: धन्यवाद, तय किया गया कि टेस्टकेस। def*सिर्फ एक फ़ंक्शन को परिभाषित करता है *। इस तरह मुझे defऔर फंक्शन के नाम के बीच स्पेस की जरूरत नहीं है ।
वेंचरो

1
क्या आप इसके बजाय सिर्फ एक लंबोदर को परिभाषित नहीं कर सकते थे? a = -> {...}
विले ई। कोयोट

1
इसके अलावा, स्ट्रैफ़ाइम के बाद किसी भी स्थान की कोई आवश्यकता नहीं है।
विले ई। कोयोट

3

T-SQL 166 185 अक्षर

CREATE PROCEDURE f29 (@d DATETIME) AS
DECLARE @i int
SET @i=YEAR(DATEADD(M,-2,@d)+3)
SET @i=@i+(4-@i%4)
IF @i%100=0 AND @i%400<>0 SET @i=@i+4
SELECT DATENAME(W,CAST(@i AS CHAR)+'-2-29')

मैं पहले से ही टी-एसक्यूएल तारीख कार्यों के साथ खिलवाड़ कर रहा था, इसलिए मुझे लगा कि क्यों नहीं ...

मूल समाधान गलत था ...

यहाँ है कि वास्तव में मुझे उस रणनीति को काम करने के लिए क्या करना है:

CREATE PROCEDURE f29 (@d DATE) AS
DECLARE @i int
SET @i = YEAR(@d)
BEGIN TRY 
SET @i=YEAR(DATEADD(D, 3, DATEADD(M,-2,@d)))
END TRY
BEGIN CATCH
END CATCH
SET @i=@i+(4-@i%4)
IF @i%100=0 AND @i%400<>0 SET @i=@i+4
SELECT DATENAME(W,CAST(@i AS CHAR)+'-2-29')

यह देखते हुए कि मैं 0001-01-01 से 2 महीने घटाकर एक अतिप्रवाह पैदा करता हूं, भले ही मैं सही डेटाटाइप का उपयोग करता हूं मैं इस प्रश्न के लिए कुछ छोटा और वैध बनाने पर छोड़ देता हूं । O_O। ट्रिक्स ने सवाल किया।
मूटिनेटर

मुझे ये T-SQL समाधान देखकर बहुत अच्छा लगा। :)
स्टीव

3

सी #, 176

Func<String,String>f=(d)=>{DateTime n;for(n=DateTime.Parse(d).AddDays(307);!(DateTime.IsLeapYear(n.Year));n=n.AddYears(1)){}return new DateTime(n.Year,2,29).ToString("dddd");};

आप एक सामान्य फ़ंक्शन परिभाषा का उपयोग करके 8 बाइट्स बचा सकते हैं:string f(string d){...}
जॉय

.ToString("dddd")वर्तमान लोकल में तारीख को प्रिंट करता है, हालांकि, अंग्रेजी में नहीं।
जॉय

165 वर्ण => स्ट्रिंग f (string d) {var n = DateTime.Parse (d) .AddDays (307); - ((DateTime.IsLeapYear (n.Year)) n = nddddears (1); (नया डेटटाइम (n.Year, 2,29))। DayOfWeek.ToString ();}
स्टीफन

127 पात्रों में और सुधार हुआ:string f(string d){var n=DateTime.Parse(d).AddDays(1);return DateTime.IsLeapYear(n.Year)&&n.DayOfYear==60?n.DayOfWeek+"":f(n+"");}
पैट्रिक वेस्टरलंड

3

बैश, 96 बाइट्स

धन्यवाद पीटर ... अत्यधिक गोल्फ संस्करण, 96 बाइट्स:

i=1;until [ `date -d"$1 $i days" +%m-%d` = "02-29" ];do((i++));done
date -d "${1} ${i} days" +%A

पुराना संस्करण, 229 बाइट्स

#!/bin/bash
from=$1
i=1
while [ "$isFeb" = "" ] || [ "$is29" = "" ]
do
isFeb=`date -d "${from} ${i} days" | grep Feb`
is29=`date -d "${from} ${i} days" +%Y-%m-%d | grep "\-29"`
((i++))
done
((i--))
date -d "${from} ${i} days" +%A

नमूना मैं / हे

:~/aman>./29Feb.sh 0001-01-01
Sunday
:~/aman>./29Feb.sh 1899-12-03
Monday
:~/aman>./29Feb.sh 1970-01-01
Tuesday

अगर कोई डिफॉल्ट
टाइमज़ोन

1
क्या आप इसे गोल्फ जा रहे हैं? ; पी आप अंतिम पंक्ति से पहले सब कुछ बदल सकते हैंi=0;d=;until [ `date -d"$1 $i days" +%m-%d` = "02-29" ];do((i++));done
पीटर टेलर

:-) जैसा कि हमने पहले ही bash पर अपने कच्चे-नेस पर मुक्केबाज़ी पर चर्चा की है! ... किसी कारण से, मैं bash के साथ ज़्यादा फ़िदा नहीं हूं .. वे इतनी त्रुटि प्रवण हैं! .. उर सुझाव के लिए धन्यवाद .. अपडेट किया गया!
अमन ज़ीके वर्मा

1
चार अक्षरों वाले चर नामों का उपयोग करने के लिए बैश के साथ वर्षा कोई बहाना नहीं है: पी
पीटर टेलर

हाँ साहब, मुझे आपकी बात सही लगी।
अमन ज़ीके वर्मा

2

पर्ल, नो डेट लाइब्रेरी: 160 159 155

उप f {($ y, $ m) = विभाजित / - /, @ _ ​​[0], 2; $ y ++ अगर ($ m> '02 -28 '); $ y = ($ y + 3)%; 400 >> 2; $ y + = $ y && ($ y% 25); @ r = (मंगल, बुध, गुरु, शुक्र, सेचुरेशन, रवि, सोम);! @ r [(5 * $ y - ($ y / 25 और 3))% 7] "दिन";।}

इन तारीख पुस्तकालयों का वास्तविक लाभ किसी और को दिनों के नाम की लंबाई से दूर कर रहा है।

दूसरी ओर, मुझे लगता है कि यह अब तक का एकमात्र समाधान है जो स्थानीय की परवाह किए बिना काम करता है।


2

DATE और कुछ BASHy गोंद (90)

कार्यक्रम:

f(){ while :;do $(date -d$1+1day +'set - %F %A 1%m%d');(($3==10229))&&break;done;echo $2;}

परिक्षण:

$ for x in 0001-01-01 1899-12-03 1970-01-01 1999-07-06 2003-05-22 2011-02-17 2100-01-01 ; do f $x ; done
Sunday
Monday
Tuesday
Tuesday
Sunday
Wednesday
Friday

1

D: 175 वर्ण

S f(S)(S s){auto d=Date.fromISOExtString(s)+days(1);while(d.month!=Month.feb||d.day!=29)d+=days(1);return["Sun","Mon","Tues","Wednes","Thurs","Fri","Sat"][d.dayOfWeek]~"day";}

अधिक कानूनी रूप से:

S f(S)(S s)
{
    auto d = Date.fromISOExtString(s) + days(1);

    while(d.month != Month.feb || d.day != 29)
        d += days(1);

    return ["Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Sat"][d.dayOfWeek] ~ "day";
}

डी में लिखना बहुत आसान है, लेकिन यह निश्चित रूप से किसी भी कोड गोल्फ प्रतियोगिता को जीतने वाला नहीं है। फिर भी, कोड गोल्फिंग के बाहर, मेरे पास लिखने और समझने के लिए बहुत आसान है, लेकिन लंबे समय से यह कठिन है लेकिन लिखने और समझने में कठिन है।


1

जावा 8 - 252 वर्ण

golfed:

import java.time.*;
import java.time.format.*;
public class S{public static void main(String[] a){LocalDate d=LocalDate.parse(a[0]).plusDays(1);while(d.getMonthValue()!=2||d.getDayOfMonth()!=29){d=d.plusDays(1);}System.out.println(d.getDayOfWeek());}}

Ungolfed:

import java.time.*;
import java.time.format.*;
public class S {
    public static void main(String[] a) {
        LocalDate d = LocalDate.parse(a[0]).plusDays(1);

        while(d.getMonthValue()!=2 || d.getDayOfMonth()!=29) {
            d = d.plusDays(1);
        }
        System.out.println(d.getDayOfWeek());
    }
}

मैं डाउनवोट्स को स्वीकार करता हूं लेकिन क्या आप कृपया "नेक्रो असली है" और एक एफएक्यू से लिंक कर सकते हैं जो आपकी बात समझाता है? मुझे नहीं लगा कि मैं जीत पाऊंगा, लेकिन यह देखना दिलचस्प होगा कि जावा कैसे जासूसी कर सकता है। दिए गए जावा 8. मैं एक सटीक प्रतियोगिता के रूप में "भार वर्ग" होने के रूप में कोड गोल्फ देखता हूं। जावा शायद ही रूबी या पायथन को एकमुश्त हरा देगा।
माइकल ईस्टर

ओपी 3 पार्टी पुस्तकालयों को प्रतिबंधित करता है, इसलिए 2011 में, एक जावा समाधान अप्रिय होगा, क्योंकि कोई लोकप्रिय जोडा टाइम लाइब्रेरी का उपयोग नहीं कर सकता है। हालाँकि, Java 8 (मार्च 2014 में रिलीज़) में JSR-310 डेटटाइम लाइब्रेरी शामिल है - en.wikipedia.org/wiki/… । मेरा कारण यह है कि मुझे लगा कि जावा 8 मजेदार होगा, और संभवतः कुछ पाठकों के लिए दिलचस्प होगा। (यदि आप उनमें से एक नहीं हैं, तो ठीक है: पोस्ट के लिए अभी भी एक कारण है।)
माइकल ईस्टर

1

प्रतिबल - 78

f: func[d][system/locale/days/(until[d: d + 1 d/day * d/month = 58]d/weekday)]

Ungolfed:

f: func [d] [
    system/locale/days/(
        until [
            d: d + 1
            d/day * d/month = 58
        ]
        d/weekday
    )
]

उदाहरण का उपयोग (रिबोल कंसोल में):

>> f 0001-01-01
== "Sunday"

>> f 2100-01-01
== "Friday"

1

PHP, 104 बाइट्स

function f($s){for($y=$s-(substr($s,5)<"02-29");!date(L,$t=strtotime(++$y."-2-1")););return date(l,$t);}

टूट - फूट

for($y=$s-;                 // "-" casts the string to int; decrement year if ...
    (substr($s,5)<"02-29")  // ... date is before feb 29
    !date(L,                        // loop while incremented $y is no leap year
        $t=strtotime(++$y."-2-1")   // $t=feb 01 in that year (same weekday, but shorter)
    );
);
return date(l,$t);          // return weekday name of that timestamp

date(L): 1लीप वर्ष के लिए, 0और
date(l): सप्ताह के दिन का पूरा पाठ प्रतिनिधित्व


0

जीएनयू कोरुटिल्स, 71 बाइट्स

f(){
seq -f "$1 %gday" 2921|date -f- +'%m%d%A'|sed 's/0229//;t;d;:;q'
}

अगले 8 वर्षों की रैखिक खोज (सबसे खराब स्थिति, दी गई 2096-02-29)। एसईडी 29 फरवरी से मेल खाने वाली पहली लाइन को ढूंढता और आउटपुट करता है।

मुझे यह देखकर आश्चर्य हुआ कि t;d;:;qयह देखने के लिए परीक्षण से कम था कि क्या अंक /[01]/d;qकई गुना होने के बावजूद अंक ( ) बने हुए हैं ।

टेस्ट

मैंने मुश्किल कोने के मामलों के लिए परीक्षणों की एक अतिरिक्त पंक्ति जोड़ी:

for i in 0001-01-01.Sunday 1899-12-03.Monday \
    1970-01-01.Tuesday     1999-07-06.Tuesday \
    2003-05-22.Sunday      2011-02-17.Wednesday 2100-01-01.Friday \
    2000-02-28.Tuesday     2000-02-29.Sunday    2000-03-01.Sunday   2096-02-29.Friday
do
    printf "%s => %s (expected %s)\n" ${i%.*} $(f ${i%.*}) ${i#*.}
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.