मेरी फ्री-फॉर्म की तारीख पढ़ें


10

निम्नलिखित स्वरूपों में से किसी में लिखी गई तारीख (एक ही कार्यक्रम में सभी को संभालना चाहिए) को देखते हुए, इसे एक मान्य में पार्स करें yyyy/mm/dd date

17th May 2012
March 14th, 2016
20 February 2014
September 14, 2017
Sunday, June 8, 2015

नियम

  • तिथियाँ कभी-कभी अमान्य होंगी, अर्थात। महीने के गलत दिन या साल में कई महीने, आपको दोनों मामलों को संभालना होगा। या तो गलती से या एक निरंतर गलत मूल्य वापस करके, आप चुनते हैं। (वे हालांकि ऊपर के टेम्प्लेट प्रारूप में चिपके रहेंगे)
  • दो अंकों का आउटपुट बनाने के लिए दिनों और महीनों के लिए पैडिंग का उपयोग 10 से कम होना चाहिए।
  • महीने के नाम हमेशा पूर्ण नाम होंगे, न कि उनके तीन चरित्र समकक्षों के लिए संक्षिप्त।
  • आप मान सकते हैं कि वर्ष हमेशा 0000-9999 सीमा के भीतर होगा।
  • ऋणात्मक संख्याओं को संभालने की आवश्यकता नहीं है।
  • आप एक पूर्ण कार्यक्रम या फ़ंक्शन बना सकते हैं इसलिए आउटपुट किसी भी प्रारूप में हो सकता है, कंसोल पर मुद्रित किया जा सकता है या फ़ंक्शन से वापस आ सकता है।
  • इनपुट हमेशा एक स्ट्रिंग होगा, आउटपुट हमेशा एक स्ट्रिंग होना चाहिए, अगर यह इसे सरणी में एकल तर्क के रूप में लेने के लिए छोटा बनाता है। ["17th May 2012"]आप ऐसा कर सकते हैं और आउटपुट समान हो सकता है["2012/05/17"]
  • आप मान सकते हैं कि इनपुट में वर्तनी सही होगी।

बोनस: यहाँ जो एक चुनौती की तरह नहीं है;)

यदि आप इनपुट स्वरूपों की अनुमति देने का प्रबंधन कर सकते हैं The Fourteenth of March, 2016या March the Fourteenth, 2016आप किसी भी अंतिम बाइट की संख्या को 1 से कम 1 के परिणामस्वरूप 20 अतिरिक्त बाइट ले सकते हैं ।

वर्तनी पर किसी भी भ्रम से बचने के लिए प्रत्येक दिन के लिए पूर्ण लिखित संख्याएँ हैं।

First, Second, Third, Fourth, Fifth, Sixth, Seventh, Eighth, Nineth, Tenth, Eleventh, Twelfth, Thirteenth, Fourteenth, Fifteenth, Sixteenth, Seventeenth, Eighteenth, Nineteenth, Twentieth, Twenty First, Twenty Second, Twenty Third, Twenty Fourth, Twenty Fifth, Twenty Sixth, Twenty Seventh, Twenty Eighth, Twenty Nineth, Thirtieth, Thirty First

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

INPUT                           | Output
17th May 2012                   | 2012/05/17
March 14th, 2016                | 2016/03/14
20 February 2014                | 2014/02/20
September 14, 2017              | 2017/09/14
Sunday, June 8, 2015            | 2015/06/08
1st January 1918                | 1918/01/01

The Fourteenth of March, 2016   | 2016/03/14
March the Fourteenth, 2016      | 2016/03/14
November the Seventeenth, 2019  | 2019/11/17
The Thirtieth of April, 2016    | 2016/04/30

30 February 2014                | Invalid
September 99, 2017              | Invalid
Sunday, June8, 2015             | Invalid

The Thirty First of April, 2016 | Invalid


10
" यहाँ जो एक चुनौती की तरह नहीं है " - जब वे एक बोनस के रूप में आते हैं, तो ज्यादातर हम सभी नहीं करते हैं! और इनपुट सत्यापन के लिए बू-urns।
झबरा

3
@ Mr.Xcoder मुझे लगता है कि पूरे चुनौती एकाधिक इनपुट स्वरूपों का समर्थन करने के लिए है .. चीजों की तरह 20 February 2014डिफ़ॉल्ट दिनांक-पारसर्स का एक बहुत में समर्थित हैं, लेकिन 17thऔर Sunday, June 8, 2015थोड़ा अधिक (भाषा के आधार पर) पार्स करने के लिए मुश्किल हो जाता है।
केविन क्रूज़सेन

1
@ Mr.Xcoder मैंने कभी नहीं कहा कि यह एक मजेदार / उबाऊ, आसान / कठिन, अच्छा / बुरा कोड-गोल्फ चुनौती थी। मैं केवल यह कह रहा हूं कि मैंने चुनौती में जो पढ़ा है, उसके आधार पर, एकाधिक इनपुट-प्रारूप का समर्थन करना चुनौती का मुख्य लक्ष्य प्रतीत होता है। मैं मानता हूं कि यह संभवतया वर्ष, माह और दिन (जो वर्तमान में मेरा दृष्टिकोण है) को निकालने के लिए पांच इनपुट-प्रारूपों, या किसी प्रकार के रेगेक्स के लिए एक और होगा।
केविन क्रूज़सेन

3
क्या सप्ताह का दिन हमेशा सही होता है? Thursday, August 25, 2017मान्य होगा ? मुझे DOW की अनदेखी करने वाली प्रस्तुतियाँ दिखाई देती हैं।
बेंजामिन क्यूनिंघम

जवाबों:


4

रेल्स, 41 , 37 35 बाइट्स

->x{x.to_date.strftime('%Y/%m/%d')}

मैं रेल के लिए एक ऑनलाइन दुभाषिया का पता नहीं है, लेकिन यहाँ एक स्क्रीनशॉट इस खरीद का प्रदर्शन है

यहाँ छवि विवरण दर्ज करें


ऑनलाइन दुभाषिया लिंक?
जोनाथन एलन

1
क्या यह वास्तव में प्रश्न के सभी प्रारूपों के लिए काम करता है? : ओ
बिलकुल अमानवीय २५'१uman

@totallyhuman ने परिणाम दिखाते हुए एक स्क्रीनशॉट जोड़ा। दुर्भाग्य से मैं एक ऑनलाइन दुभाषिया के बारे में नहीं जानता :(
Suever

8

पॉवरशेल , 91 89 91 56 बाइट्स

date("$args"-replace'th|rd|st|(\b.*)day|,')-f yyyy/MM/dd

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

एक स्ट्रिंग के रूप में इनपुट लेता है। -replaceकबाड़ से छुटकारा पाने के लिए एक का उपयोग करता है , फिर आवश्यक प्रारूप को निर्दिष्ट करने के Get-Dateलिए -fऑर्माट फ्लैग के साथ अंतर्निहित कमांड का उपयोग करता है yyyy/MM/dd। उस तार को पाइप लाइन पर छोड़ दिया गया है और आउटपुट निहित है।

श्री Xcoder के लिए दो बाइट्स बचाए। TessellatingHeckler's regex golfing की बदौलत एक बहुत बड़ा हिस्सा बचा।


1
हे प्रतिस्पर्धी PowerShell प्रस्तुत देखो!
को आउटगोल्फर

@EriktheOutgolfer दिनांक हेरफेर PowerShell की ताकत में से एक है।
AdmBorkBork


@ Mr.Xcoder "उन सभी" = 2. योग्य। धन्यवाद!
AdmBorkBork

आप ''दिनांक प्रारूप से, -2 के लिए निकाल सकते हैं । यदि आप अपने दृष्टिकोण से चिपके रहना चाहते हैं, तो "स्पेलिंग सही है" को देखते हुए आप प्रतिस्थापित कर सकते हैं 'th|rd|st|(\b.*)day|,'और यह 56 बाइट्स पर गिर जाता है और समान मामलों को संभालता है। हालांकि मुझे लगता है कि यह गलत है क्योंकि अगर आप दिन छोड़ते हैं, तो आप Sunday, June8, 2015 | Invalidमामला नहीं उठा सकते क्योंकि यह सोमवार था। यह त्रुटि होना चाहिए, लेकिन यह वैध के रूप में पार्स करता है। यह निश्चित नहीं है कि उस पर शासन क्या होगा, या यदि अन्य इसकी जाँच कर रहे हैं।
TessellatingHeckler

4

PHP, 73 164 + 1 बाइट्स

for(preg_match("#(\d+)[^\d]+(\d+)#",$d=$argn,$r);$m++<12;)strpos(_.$d,date(F,strtotime($r[2].-$m)))&&printf(checkdate($m,$r[1],$r[2])?"$r[2]/%02d/%02d":E,$m,$r[1]);

के साथ पाइप के रूप में चलाएं -nRयाऑनलाइन के इसे आज़माएं

तारीख की जाँच वास्तव में महंगी थी: मुझे एक बिलिन का उपयोग करने से पहले तारीख को अलग करना पड़ा, फिर महीने के नाम पर प्रयास करें और त्रुटि करें।


मुझे लगता है कि आपको सभी प्रारूपों का समर्थन करना होगा न कि उनमें से केवल एक?
एरिक आउटगॉल्फ

1
@EriktheOutgolfer यह करता है। लेकिन बोनस प्रारूप नहीं।
टाइटस

@EriktheOutgolfer यह सभी स्वरूपों को संभालता है।
श्री Xcoder

1
यह अमान्य तिथियों के लिए विफल है। 30 February 2014लौटता है 2014/03/02या तो गलती से या एक निरंतर गलत मूल्य वापस करके, आप चुनते हैं। (वे हालांकि ऊपर के टेम्प्लेट प्रारूपों से चिपके रहेंगे)
श्री एक्सकोडर

@ Mr.Xcoder जो इसे काफी बर्बाद करता है ...
टाइटस

3

पायथन 3 + पार्सडाइमटाइम लाइब्रेरी, 152 139 155 153 बाइट्स

जोनाथन एलन के लिए धन्यवाद, 13 बाइट्स बचाए

अमान्य लंबाई दिनों के साथ तारीखों को संभालने के लिए 16 बाइट्स जोड़े गए

लैम्ब्डा असाइनमेंट को हटाकर 2 बाइट्स बचाए

lambda s:re.search(f'(^| ){str(h(s)[0].tm_mday)[:2]}[^\d]',s)and time.strftime('%Y/%m/%d',h(s)[0])
import parsedatetime as p,time,re
h=p.Calendar().parse

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

बोनस की तारीखों का समर्थन नहीं करता है


PPCG में आपका स्वागत है! अच्छी पहली पोस्ट। का उपयोग करके 13 बाइट्स बचाएं : का गलत रिटर्न मान None; import ...as; और एक lambdaपुन: उपयोग द्वारा parseके रूप में h
जोनाथन एलन

1

पायथन 2 , 193 बाइट्स

lambda s:time.strftime('%Y/%m/%d',time.strptime(re.sub(r'^(\w+) (\d+)',r'\2 \1',re.sub('^ ','',re.sub('(th|rd|st)|(Sun|Mon|Tues|Wednes|Thurs|Fri|Satur)day|,','',s))),'%d %B %Y'))
import re,time

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

; -; pls पड़ाव


; -; pls पड़ाव - 192 बाइट्स घोषित करके time
श्री Xcoder


1

जावा (ओपनजेडके 8) , 190 + 26 = 216 बाइट्स

import java.time.format.*;

s->DateTimeFormatter.ofPattern("uuuu/MM/dd").format(DateTimeFormatter.ofPattern("[EEEE, ][d ]MMMM [d, ]uuuu").withResolverStyle(ResolverStyle.STRICT).parse(s.replaceAll("(\\d)[a-z].","$1")))

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

महत्वपूर्ण नोट: इसे खोदने के बजाय सप्ताह के दिन को मान्य करना भी कम था , ताकि सत्यापन शामिल हो!

मैंने SimpleDateFormatउन स्पष्ट मामलों से परे की कोशिश नहीं की है, जो सभी ने 30 फरवरी की तरह स्वीकार किए हैं। इसलिए मुझे इसे खोदना पड़ा और मैंने जावा 8 का इस्तेमाल किया DateTimeFormatter

व्याख्या

"[EEEE, ][d ]MMMM [d, ]uuuu"

इस प्रारूप का अर्थ है:

  • अल्पविराम और स्थान के बाद सप्ताह के वैकल्पिक दिन [EEEE, ](में होता है Sunday, ...),
  • अंतरिक्ष के साथ वैकल्पिक दिन के बाद [d ] ,
  • पूरे पत्र MMMMऔर स्थान में महीने के बाद ,
  • अल्पविराम और स्थान के साथ वैकल्पिक दिन के बाद [d, ],
  • युग के वर्ष के बाद uuuuपार्सर जानते हैं कि हम ग्रेगोरियन युग में हों, तो कृपया।

कोड:

import java.time.format.*;                                     // Required for DateTimeFormatter, *and* ResolverStyle

s->DateTimeFormatter.ofPattern("uuuu/MM/dd")                   // Output format
  .format(
    DateTimeFormatter.ofPattern("[EEEE, ][d ]MMMM [d, ]uuuu")  // Input format
      .withResolverStyle(ResolverStyle.STRICT)                 // Invalidates xxxx-02-30 instead of transforming it into xxxx-02-28
      .parse(
        s.replaceAll("(\\d)[a-z].","$1")                       // remove st, nd, rd, th
       )
    )

क्रेडिट

  • नील की बदौलत रेगेक्स में 2 बाइट्स।

1
क्या आपको replaceAllपैटर्न में कोष्ठक की आवश्यकता है ?
नील

लगता है जैसे मैं नहीं। धन्यवाद, @ नील!
ओलिवियर ग्रेगोइरे

1

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

f=
s=>(d=new Date(s.replace(/.[dht]\b/,'')+' +0')).getDate()==s.match(/\d\d?/)&&d.toISOString().replace(/-(..)(T.*)?/g,'/$1')
<input oninput=o.textContent=f(this.value)><pre id=o>


(UTC समस्या के 2015/06/07लिए रिटर्न June 8, 2015? मैं UTC + 2 में हूँ) और या falseतो । Sunday, June 8, 2015Monday, June 8, 2015
ओलिवियर ग्रेगोइरे

1
@ OlivierGrégoire उन लोगों को इंगित करने के लिए धन्यवाद। मैं केवल समर टाइम के बाहर यूके में तारीखों की कोशिश करता था, इसलिए वे पहले से ही यूटीसी का उपयोग कर रहे थे, और मैंने सप्ताह के अंत की कोशिश नहीं की nday
नील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.