एक तारीख को सरल बनाएं


9

यह भिन्नों को सरल बनाने के समान है, लेकिन डेट्स के साथ!

आपके प्रोग्राम का इनपुट mm/dd उदाहरण के लिए फॉर्म का होना चाहिए

3/4 //March 4
12/15 //December 15
1/1 // January 1

हम मानते हैं कि इनपुट मान्य होगा जैसे कि महीनों की संख्या इन दिनों में है:

January 31
February 28
March 31
April 30
May 31
June 30
July 31
August 31
September 30
October 31
November 30
December 31

आपके कार्यक्रम का काम मान्य वैध इनपुट लेना है, और पुनरावृति (या पुनरावर्ती) तिथि को सरल करना है, और प्रत्येक पुनरावृत्ति (0th सहित), ऊपर लिखे गए महीने के पूर्ण नाम के साथ तारीख को आउटपुट करें।

उदाहरण के लिए:

के इनपुट को देखते हुए:

12/18

उत्पादन होगा

December 18
June 9
February 3

एक इनपुट जो पहले से ही सरलीकृत है केवल स्वयं आउटपुट:

11/17

आउटपुट:

November 17

महीने के नाम आपकी भाषा में एक फ़ंक्शन से नहीं आ सकते हैं। स्ट्रिंग्स को आप पसंद कर सकते हैं, परिकलित किया जा सकता है, लेकिन आप GetMonthString (4) या कुछ और जैसे मानक फ़ंक्शन का उपयोग नहीं कर सकते, आपको या तो उस फ़ंक्शन को लिखना होगा, या वर्णित महीनों के आउटपुट का तरीका खोजना होगा।

मैं ऐसे किसी भी मामले के बारे में नहीं सोच सकता जहाँ सरलीकृत तारीख एक अवैध तारीख का उत्पादन करती है, लेकिन यदि आप कभी भी अवैध तरीके से उत्पादन करते हैं, तो उत्पादन:

Illegal Date

लेकिन अगर आपको यकीन है कि ऐसा नहीं हो सकता है, तो आपको इस मामले को कवर करने की आवश्यकता नहीं है। आउटपुट की गई तारीखों को हमेशा ऊपर वर्णित के अनुसार मान्य होने की आवश्यकता होती है (यह बिना कहे कि महीने और दिन 1 से शुरू होते हैं)।

एल्गोरिथ्म:

प्रत्येक पुनरावृत्ति पर आप अंश और हर को विभाजित करने वाली सबसे छोटी संख्या से विभाजित करते हैं।

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

मुझे लगता है, यह स्पष्ट है।

किसी भी भाषा की अनुमति है। यह कोड गोल्फ है, सबसे छोटा कोड जीतता है!


प्रश्न बंद कर दिया गया था जब मैं एक उत्तर पोस्ट कर रहा था। दोहे!
t-clausen.dk

@ t-clausen.dk चुनौती को फिर से खोल दिया गया है।
AdmBorkBork

क्यों से 12/18करने के लिए 6/9और नहीं 4/6(मैं सभी यात्रा गड़बड़ नहीं मिलता है ... जब मैं एक अंश मैं immedialtely मिला जिसके परिणामस्वरूप सरलीकृत मूल्य को आसान बनाने में)?
edc65

जवाबों:


2

जेली , 59 बाइट्स

ṣ”/VµÆDf/2ị:@µÐĿị1¦€“£ṢtẒ⁽ẹ½MḊxɲȧėAṅ ɓaṾ¥D¹ṀẏD8÷ṬØ»ṣ⁶¤j€⁶j⁷

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

यह काम किस प्रकार करता है

ṣ”/VµÆDf/2ị:@µÐĿị1¦€“...»ṣ⁶¤j€⁶j⁷  Main link. Argument: mm/dd

ṣ”/                                Split at slashes.
   V                               Eval each chunk, yielding [m, d] (integers).
    µ                              Begin a new, monadic chain. Argument: [m, d]
             µÐĿ                   Execute the chain to the left until the results
                                   are no longer unique. Yield the list of all
                                   intermediate results.
     ÆD                              Compute the divisors of each number.
       f/                            Intersect them.
         2ị                          Select the one at index 2. If there is only
                                     one divisor, ị wraps around and selects 1.
           :@                        Divide [m, d] by this common divisor.
                        ¤            Combine the links to the left into a chain.
                 “...»                 Yield the month's name, space-separated.
                      ṣ⁶               Split at spaces.
                €                    For each pair...
             ị                          index into the month's names...
              1¦                        for the first element.
                         j⁶€         Join each pair, separating by spaces.
                            j⁷       Join, separating by linefeeds.


0

TSQL 296 बाइट्स

मानक बत्तख का उपयोग करने की अनुमति नहीं दी जा रही है, हालांकि मुझे बाइट्स की एक बहुत कुछ चुकाने के लिए बचा है, मैंने डिफ़ॉल्ट तिथि विवरण के पहले 3 वर्णों का उपयोग किया (प्रारूप सोम dd yyyy hh: miAM (या PM) के साथ) और जोड़ा महीने के बाकी नाम।

golfed:

use master
DECLARE @ varchar(5) = '12/2'

DECLARE @m int=month('2000/'+@),@d INT=day('2000/'+@)WHILE @m>0BEGIN PRINT left(dateadd(d,@m*29,0),3)+choose(@m,'uary','uary','ch','il','','e','y','ust','tember','ober','ember','ember')+' '+LEFT(@d,2)SELECT @m/=min(n),@d/=min(n)FROM(SELECT number FROM spt_values)x(n)WHERE @m%n+@d%n=0 and n>1 END

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

Ungolfed:

use master
DECLARE @ varchar(5) = '12/2'

DECLARE @m int=month('2000/'+@),@d INT=day('2000/'+@)
WHILE @m>0
BEGIN
PRINT
 left(dateadd(d,@m*29,0),3)
 +choose(@m,'uary','uary','ch','il','','e','y','ust',
  'tember','ober','ember','ember')+' '+LEFT(@d,2)
SELECT @m/=min(n),@d/=min(n)
FROM
(
  SELECT number
  FROM spt_values
)x(n)
WHERE
  @m%n+@d%n=0
  and n>1
END

उम्म… पहले दो लाइन क्या कर रहे हैं वहाँ ???
आउटगॉल्फ

@ E @G for पहली पंक्ति बता रही है कि इस स्क्रिप्ट के लिए किस डेटाबेस का उपयोग करना है, दूसरी पंक्ति इनपुट चर घोषित कर रही है। मैंने उन्हें गिनती में शामिल नहीं किया है क्योंकि वे परिभाषित करते हैं कि स्क्रिप्ट को कहां निष्पादित करना है और यह बताना है कि इनपुट चर क्या है
t-clausen.dk

मुझे '12/2'दूसरी पंक्ति दिखाई देती है, क्या आप सुनिश्चित हैं कि आप मुझे सच बता रहे हैं?
बाहर निकलना

@ E @G - मुझे डर है कि मुझे आपका सवाल समझ में नहीं आ रहा है
t-clausen.dk

मुझे लगता है कि आप एक हार्ड-कोडित तारीख का उपयोग कर रहे हैं, हालांकि मुझे यकीन नहीं है कि एसटीडीआईएन एसक्यूएल और वेरिएंट में समर्थित है ... इसके अलावा, ऐसा लगता है कि आप Septemberसाथ चूक गए हैं Septemper'temper','ober','ember','ember')+' '+LEFT(@d,2)
अगस्त को आउटगोल्फर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.