रोलओवर कैलेंडर


17

यह सैंडबॉक्स में डाउगाट के सवालों में से एक से प्रेरित है, जहां मैंने सुझाव दिया था कि वह 31 अप्रैल को उन लोगों के लिए Pi दिन के रूप में शामिल करता है जो दिन / महीने प्रारूप का उपयोग करते हैं, केवल उनके लिए मुझे सूचित करना है कि 31 अप्रैल नहीं है!

महीने / दिन प्रारूप में एक तारीख स्ट्रिंग को देखते हुए, जो अमान्य हो सकता है, रोलओवर का उपयोग करके सही तिथि को आउटपुट करता है। (पहले रोलओवर महीने, उसके बाद दिन रोलओवर)।

उदाहरण:

"15/43" - यह 15 वें महीने के 43 वें दिन के रूप में पढ़ता है। पहले, हम महीने से अगले वर्ष तक रोल करते हैं, इसलिए हम 3 (मार्च) तक समाप्त हो जाते हैं। अब, चूंकि मार्च में केवल 31 दिन होते हैं, इसलिए हम अप्रैल के अतिरिक्त दिनों को रोलओवर करते हैं, इसलिए हम वास्तविक तारीख को "4/12" (12 अप्रैल) के रूप में आउटपुट करते हैं ।

"3/16" - यह एक वैध तारीख (16 मार्च) है। जैसा है वैसा लौटा दो।

"12/64" - आह, 64 दिसंबर से बहुत सारी शौकीन यादें ... दिसंबर में 31 दिन हैं, जनवरी में 31 दिन हैं, इसलिए मेरा वास्तव में मतलब है "2/2" (2 फरवरी)।

"19/99" - सबसे पहले, 19 एक 7 (जुलाई) बन जाता है। जुलाई में 31 दिन हैं, अगस्त में 31 दिन हैं, सितंबर में 30 दिन हैं, इसलिए आउटपुट "10/7" (7 अक्टूबर) है।

"1/99999" - एक वर्ष में 365 दिन होते हैं। 99999 (mod 365) = 354. वर्ष का 354 दिन "12/20" है

"9999999/10" - जाहिर तौर पर, 9999999 (मॉड 12) = 3, इसलिए यह "3/10" (10 मार्च) है।

मानदंड:

इनपुट महीना एक पूर्णांक है। 0. इनपुट दिवस एक पूर्णांक है। 0. वर्ष को कभी भी निर्दिष्ट करने की आवश्यकता नहीं है, क्योंकि इससे निपटने के लिए कोई लीप वर्ष नहीं हैं।

अपडेट करें:

जैसा कि मुझे लगता है कि यह चुनौती को सरल करेगा, कैलेंडर फ़ंक्शन, जैसे कि जावा कैलेंडर क्लास में प्रतिबंधित हैं। दिनांक पार्सिंग / प्रारूपण कार्य अभी भी हालांकि अनुमत हैं।



1
एक और महत्वपूर्ण परीक्षण मामला 8 दिनों से अधिक के लिए रोल करने के लिए पर्याप्त दिनों के साथ एक होगा, जैसे कि उत्तर-निर्मित का उपयोग करने वाले उत्तर में लीप वर्षों का उपयोग करके उन अंतर्निहित इन पर ध्यान देना होगा।
मार्टिन एंडर

ओह, वह जवाब देता है कि ... मैं केवल एक गणितज्ञ उत्तर पोस्ट करने वाला था जो एक अंतर्निर्मित का उपयोग करता है। : /
मार्टिन एंडर

@Martin इस बारे में क्षमा करें;)।
जियोकॉवेल

संदर्भ के लिए, गणितज्ञ समाधान अभी भी 90 बाइट्स लंबा था (हालांकि यह स्ट्रिंग प्रसंस्करण द्वारा बड़े पैमाने पर हावी था)। यदि आप इस तरह के एक परीक्षण के मामले को जोड़ना चाहते हैं, लेकिन मुझे लगता है कि 1/99999उपज चाहिए 12/19
मार्टिन एंडर

जवाबों:


11

लैबव्यू, 32 लैब व्यू आदिम


यह जल्दी था।
Addison Crump

क्या आप मुझे आश्वस्त कर सकते हैं कि यहां कोई कैलेंडर फ़ंक्शन उपयोग नहीं किए गए हैं?
जियोकॉवेल

LabVIEW के बारे में अच्छी बात यह है कि मूल रूप से यह क्या दिखता है। पहली बात एक स्ट्रिंग 2 मोडुलोस से संख्याओं को स्कैन करती है, बॉक्स एक स्विच केस संरचना है जो 28,30 या 31 को बाहर निकालती है और फिर इसे फिर से एक स्ट्रिंग के रूप में एक साथ रखा जाता है।
यूमेल

4

सी #, 269 223

string v(string n){var x=new[]{31,28,31,30,31,30,31,31,30,31,30,31};var s=n.Split('/');Func<string,int> p=int.Parse;var m=p(s[0]);var d=p(s[1]);m=m>=12?m%12:m;while(d>x[m]){d-=x[m];m=++m>=12?m%12:m;}return(m==0?1:m)+"/"+d;}

संपादित करें : 24/1, 36/1, इत्यादि जैसे मामलों के लिए काम करने के लिए निश्चित और थोड़ा-थोड़ा गोल्फ। टिप्पणियों के लिए धन्यवाद, कई जगह हैं जिन्हें मैंने थोड़ा सहेजा है!

Ungolfed:

string v(string n)
{
    var x = new [] { 31 ,28, 31, 30, 31, 30,31, 31, 30, 31, 30, 31 };

    var s = n.Split('/');
    Func<string,int> p = int.Parse;
    var m = p(s[0]);
    var d = p(s[1]);
    m = m >= 12 ? m % 12 : m;
    while (d > x[m])
    {
        d -= x[m];
        m = ++m >= 12 ? m % 12 : m;
    }
    return (m==0?1:m) + "/" + d;
}

सबसे पहले: समुदाय में आपका स्वागत है! मुझे लगता है कि आप कुछ बाइट्स को लूप में डिक्शनरी देकर या स्विच फंक्शन (हालांकि यहाँ पर कोई C # pro नहीं) का उपयोग करके बचा सकते हैं। इसके अलावा सीधे मुद्रण directlym + "/" + d help थोड़ी मदद कर सकता है। और अंतिम (यह काम कर सकता है या नहीं हो सकता है) तर्कों में स्ट्रिंग के बजाय * का उपयोग कर।
यूमेल

यह कुछ परीक्षण मामलों पर विफल रहता है, उदाहरण के लिए 24/1
लीजियनममाल 978

@Eumel धन्यवाद! सीधे मुद्रण का उपयोग करता है, Console.Writeजो की तुलना में अधिक है return, और सी # में मैं char[]एक प्रतिस्थापन के रूप में उपयोग करूंगा string, लेकिन यह समान मात्रा में वर्ण है, और /अधिक समस्याग्रस्त पर विभाजन करता है। लेकिन, शब्दकोश में आपके नोट ने मुझे एक बेहतर संस्करण में ले लिया!
ड्रूजॉर्डन

4

आर, 208 182 बाइट्स

m=c(31,28,31,30,31,30,31,31,30,31,30,31)
e=scan(sep="/");n=(e[1]/12-1)*12;if(!n%%12)n=12;if(n<0)n=e[1];j=e[2];while((j<-j-m[n])>0){n=n+1;if(n>12)n=1};j=m[n]+j;cat(n,j,sep="/")

महीने को 12 से विभाजित करके प्राप्त करें, फिर लूप करें, चालू महीने के दिनों की संख्या को हटा दें जब तक कि आप एक नकारात्मक संख्या प्राप्त न करें, अंतिम चरण और प्रिंट को उलटा दें।

कई लाइनों पर (एक फ़ाइल और स्रोत का उपयोग करने की आवश्यकता है):

m=c(31,28,31,30,31,30,31,31,30,31,30,31)
e=scan(sep="/")
n=(e[1]/12-1)*12
if(!n%%12)n=12
if(n<0)n=e[1]
j=e[2]
while((j<-j-m[n])>0){n=n+1;if(n>12)n=1}
j=m[n]+j;cat(n,j,sep="/")

यह वह संदेश है जो मुझे R: pastebin.com/dPh1n64a
geokavel

अजीब बात है कि मैं बाद में फिर से
बताऊँगा

मुझे भी यह संदेश मिला। आपके कार्यक्रम में कुछ महीनों से समस्या है। नहीं तो चल रहा है। pastebin.com/g3BCUDi8
geokavel

प्रतिक्रिया के लिए धन्यवाद। मैं वास्तव में सड़क पर हूं, मैं इसे ठीक कर
दूंगा

1
@ तेंसिबाई हां आप सही कह रहे हैं, मेरा बुरा (मुझे याद रखना चाहिए कि त्रुटि संदेश कहता है कि यह "एक वास्तविक") की उम्मीद करता है।
प्लेनैपस

3

PHP> = 5.5, 181 बाइट्स

list($m,$d)=explode("/",$argv[1]);$m%=12;$d%=365;$i=0;while($d>100)$d-=[31,28,31,30,31,30,31,31,30,31,30,31][$i++];$m+=$i;echo date_create_from_format("m/d","$m/$d")->format("n/j");

पीएचपी लगभग तारीख को पार्स और अकेले प्रारूपण निर्देशों के साथ रोल ओवर का समर्थन करता है। उदाहरण के लिए:

echo date_create_from_format("m/d","12/64")->format("n/j"); // Output: 2/2

हालाँकि, एक बार या तो संख्या 100 से अधिक हो जाती है, PHP इसे पार्स करता है और एक त्रुटि देता है (शायद कुछ मनमाने कारण के लिए)। तो, इस जवाब के साथ सिद्धांत यह है कि इसे वापस नीचे लाने के लिए जहां PHP इसे पार्स करेगा, फिर इसे सबमिट करें date_create_from_format()

Ungolfed:

list($month, $day) = explode("/", $argv[1]);
$month = $month % 12;
$day = $day % 365;
$i = 0;
$days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
while($day > 31) $day -= $days[$i++];
$month += $i;
echo DateTime::createFromFormat("m/d", $month . "/" . $day)->format("n/j");

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


1
आपको मुझे तारीख स्ट्रिंग इनपुट करने का एक तरीका देने की आवश्यकता है, या इसे एक फ़ंक्शन बनाने की आवश्यकता है।
जियोकावेल

PHP में इनपुट विधि के रूप में GET पैरामीटर स्वीकार्य नहीं हैं । आपको इसे एक फ़ंक्शन बनाने और इनपुट को फ़ंक्शन पैरामीटर के रूप में पास करने की आवश्यकता होगी, $argvया एसटीडीआईएन से इनपुट प्राप्त करना होगा ।
मेगो

@ मीगो जीज़े, मुझे अपना जवाब अपडेट करने के लिए कुछ समय दें क्योंकि ओपी ने इनपुट के लिए कोई आवश्यकता नहीं बताई है - यह बदलने के $tलिए काफी सरल है $argv[1]और अब यह कमांड लाइन इनपुट से पढ़ता है।
निकब

इनपुट के लिए ओपी बताते हुए आवश्यकताएं अप्रासंगिक हैं; हमारे पास डिफ़ॉल्ट स्वीकार्य I / O विधियों (जो मैंने लिंक किया है) की एक सूची है ताकि चुनौती देने वाले लेखकों को उन्हें हर चुनौती पर निर्दिष्ट न करना पड़े।
मेगो

2

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

s=>eval('q="030101001010";p=s.split`/`;for(d=i=p[1],m=p[0]-1;i--;d>n&&(m++,d-=n))n=31-q[m%=12];m+1+"/"+d')

व्याख्या

s=>
  eval(`              // use eval to enable for loop without needing to write {} or return
    q="030101001010"; // q = array of 31 - days in each month
    p=s.split\`/\`;   // p = array of [ month, day ]
    for(
      d=i=p[1],       // d = day
        m=p[0]-1;     // m = month - 1
      i--;            // loop for each day, this is more iterations than needed but extra
                      //     iterations do not affect the result and it's the shortest way
                      //     to guarantee all months have been subtracted from d, it also
                      //     ensures the loop runs at least once to get m % 12
      d>n&&(m++,d-=n) // if too many days, subtract the month's days and increment month
    )
      n=31-q[m%=12];  // n = number of days in month, get m % 12
    m+1+"/"+d         // return the result
  `)

परीक्षा


1

गैर-प्रतिस्पर्धात्मक उत्तर - बाश + कोरुटिल्स, 55

date -d1-$[(${1%/*}-1)%12+1]-1+$[${1#*/}-1]day +%-m/%-d

"तिथि पार्सिंग / प्रारूपण कार्य अभी भी हालांकि अनुमत हैं" - मेरा मानना ​​है कि इसका मतलब है कि dateउपयोगिता की अनुमति है।

इनपुट को कमांड लाइन से पढ़ा जाता है, जैसे:

$ ./rollovercal.sh 15/43
4/12
$ 

यह गैर-प्रतिस्पर्धात्मक है क्योंकि तिथि आदेश कुछ इस तरह से विस्तारित होता है जो कई दिनों को जोड़ रहा है:

date -d1-3-1+42day +%-m/%-d

यह तब तक की अनुमति है जब तक कि यह date.add(875)875 दिनों की तिथि बढ़ाने के लिए कुछ भी नहीं कर रहा है । ज्यादातर यही कि मैं उसके बाद जा रहा था।
जियोकॉवेल

@geokavel ओह, मैं देख रहा हूँ। यहां पूरी तरह से विस्तारित dateकमांड है date -d1-3-1+42day +%-m/%-d, इसलिए इसका ठीक यही करना है। मुझे लगता है कि यह एक गैर-प्रतिस्पर्धात्मक उत्तर है :(
डिजिटल ट्रॉमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.