YYYYMM को MMMYY में बदलें


54

इस एसओ प्रश्न पर आधारित ।

चुनौती बल्कि सरल है: प्रारूप में एक दिनांक की अवधि को YYYYMMआउटपुट में दिया जाता है MMMYY

नियम:

  • इनपुट संख्या या स्ट्रिंग होगा जो केवल 6 वर्णों का होगा, जिसमें केवल अंक होंगे।
  • अंतिम दो अंक 01और के बीच होंगे 12
  • आउटपुट फॉर्म में होना चाहिए MMMYY, जहां MMMमहीने के लिए अपरकेस तीन-अक्षर कोड का YYप्रतिनिधित्व करता है (नीचे) और इनपुट के भाग के दो अंतिम अंकों का प्रतिनिधित्व YYYYकरता है।

संबंधित कोड के साथ महीनों की सूची:

MM    MMM
01    JAN
02    FEB
03    MAR
04    APR
05    MAY
06    JUN
07    JUL
08    AUG
09    SEP
10    OCT
11    NOV
12    DEC

उदाहरण:

Input     Output
201604    APR16
200001    JAN00
000112    DEC01
123405    MAY34

5
यह प्रश्न बहुत अच्छी तरह से संतुलित है। दोनों मैनुअल पार्सिंग और डेट लाइब्रेरी, अंत में पायथन में कम से कम उसी के बारे में हैं।
bkul २२'१६

10
कल, मैंने SO लोगो के बगल में HNQ पर "कन्वर्ट YYYMM को MMMYY" के रूप में देखा। अब मुझे PCG लोगो के पास वही शीर्षक दिखाई दे रहा है। मैं बहुत उलझन में था :)
बिल्ली

जवाबों:


20

MATL, 18 14 13 बाइट्स

4e!Z{Zc12XOXk

इनपुट एक स्ट्रिंग (एकल उद्धरण में संलग्न) के रूप में प्रदान किया जाता है।

यह संस्करण केवल MATLAB पर MATLAB में चलता है क्योंकि MATLAB स्वचालित रूप से पार्स करने में सक्षम है datestr('2016 04')

व्याख्या

        % Implicitly grab input as a string
4e!     % Reshape input to be 2 x 4 (puts the year in row 1 and month in row 2)
Z{      % Place each row in a separate cell
Zc      % Join them together using a space to create 'yyyy mm' format
12      % Number literal, pre-defined datestring of 'mmmyy'
XO      % Convert from serial date number to string using this format
Xk      % Convert to uppercase
        % Implicitly display

यहाँ एक 18 बाइट संस्करण है जो ऑक्टेव पर काम करता है (और इसलिए ऑनलाइन दुभाषिया)

'yyyymm'2$YO12XOXk

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

सभी परीक्षण मामलों के लिए संशोधित संस्करण

व्याख्या

            % Implicitly grab input as a string
'yyyymm'    % Push the format string as a string literal
2$YO        % Convert to a serial date number
12          % Number literal, pre-defined datestring of 'mmmyy'
XO          % Convert from serial date number to string using this format
Xk          % Convert to uppercase
            % Implicitly display

3
मैं नहीं देखता कि यह कैसे पीटा जा सकता है .. gg
अदनान

20

पायथन 3, 70 बाइट्स

from time import*
lambda s:strftime("%b%y",strptime(s,"%Y%m")).upper()

यह बिल्ट-इन strftimeऔर strptimeफ़ंक्शंस का उपयोग करता है ।

1 बाइट अधिक के लिए, यहां एक संस्करण है जो स्ट्रिंग को मैन्युअल रूप से पार्स करता है:

lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]

यह एक दिलचस्प तरीके से महीने के नामों को एन्कोड करता है (बाइट बचाने के लिए हेनरी गोमर्सल को धन्यवाद)।


11
यह मैनुअल पार्सिंग पागल है।
मॉर्गन थ्राप्प

@MorganThrapp मुझे इस उत्तर से विचार मिला ।
21

1
आपका मैन्युअल संस्करण अजगर 2 में 69 बाइट्स में किया जा सकता है अगर आप इनपुट के रूप में एक नंबर लेने के लिए: lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4]
xnor

1
हालांकि यह एक बाइट खो देता है:lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
हेनरी गोमर्सल

1
@ a25bedc5-3d09-41b8-82fb-ea6c353d75ae - "आयात समय" आपको 6 वर्णों को बचाएगा, लेकिन आपको 10 ("समय", दो बार) खर्च होगा
TLW


18

PowerShell v2 +, 49 46 बाइट्स

(date $args[0].insert(4,'-')-U %b%y).ToUpper()

3 बाइट बचाने के लिए @Joey को धन्यवाद!

कमांड लाइन इनपुट के माध्यम से $args[0]एक स्पष्ट स्ट्रिंग (उदाहरण के लिए '201604') के रूप में इनपुट लेता है । उपयुक्त स्थान में string.Insert()डालने के लिए फ़ंक्शन का उपयोग करता -है, और उस परिणामी स्ट्रिंग तीन-महीने शॉर्टहैंड प्लस दो-अंक वर्ष निर्दिष्ट करने वाले प्रारूप पैरामीटर के साथ Get-Datecmdlet में इनपुट बनाता है -U। हम इसे पैरेन्स में एनकैप्सुलेट करते हैं, और .ToUpper()आउटपुट स्ट्रिंग को कैपिटल बनाने के लिए एक डील करते हैं । उस तार को पाइप लाइन पर छोड़ दिया जाता है और छपाई की जाती है।

इसके अलावा, जैसा कि बताया गया है, यह स्थानीय-संवेदनशील है। यहाँ स्थानीय जानकारी है कि मैं जहाँ यह सही ढंग से काम कर रहा हूँ का उपयोग कर रहा हूँ।

PS C:\Tools\Scripts\golfing> get-culture

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)

आपको यह उद्धृत करने की आवश्यकता नहीं है MMMyy, क्योंकि यह cmdlet का एक सरल तर्क है। तुम भी बस का उपयोग कर सकते हैं -UFormat %b%y, यानी -u %b%yबजाय, जो भी कम है। साइड नोट: यह समाधान स्थानीय-संवेदनशील है (जिसे मैं व्यक्तिगत रूप से नापसंद करता हूं), लेकिन इसके लिए, उचित रूप से हिसाब देना थोड़ा अधिक लंबा होगा।
जॉय

-UFormatइसके बजाय उत्कृष्ट कॉल । धन्यवाद! मैं भी आसपास के उद्धरणों के बारे में नहीं जानता था MMMyy- भविष्य के लिए जानना अच्छा है।
AdBBorkBork

8

रेटिना , 71 70 बाइट्स

1 बाइट बचाने के लिए Sp3000 का धन्यवाद।

बाइट गिनती आईएसओ 8859-1 एन्कोडिंग मानती है। अनुगामी लाइनफीड महत्वपूर्ण है।

(..)(..)$
DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX$2$*¶$1
+`...¶

R-6`.

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

व्याख्या

201604एक उदाहरण के रूप में लेना :

(..)(..)$
DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX$2$*¶$1

यह वर्ष के अंतिम दो अंकों को महीने के साथ स्वैप करता है जबकि लाइनफीड्स का उपयोग करके महीने का विस्तार करते हुए, और महीनों की सूची को उल्टा करने के लिए तैयार करता है ताकि हम प्राप्त करें:

20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX¶¶¶¶16

जहां लाइनफीड्स (0x0A) का प्रतिनिधित्व करते हैं।

+`...¶

अब हम बार-बार तीन गैर-लाइनफीड पात्रों को हटाते हैं, उसके बाद एक लाइनफीड। हम एक महीने का प्रतिनिधित्व करने वाले प्रत्येक लाइनफीड के लिए अंत से महीनों की सूची खाते हैं:

20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX¶¶¶¶16
20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJAN¶¶¶16
20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEB¶¶16
20DECNOVOCTSEPAUGJULJUNMAYAPRMAR¶16
20DECNOVOCTSEPAUGJULJUNMAYAPR16

यही कारण है कि हमने वह डाला है XXX: चूंकि महीनों से गिनती शुरू होती है 1, हम हमेशा जनवरी के लिए कम से कम तीन अक्षर निकाल देंगे।

R-6`.

अंत में, हम अंत से 6 वें वर्ण तक सब कुछ हटा देते हैं। दूसरे शब्दों में, हम केवल अंतिम पांच अक्षर रखते हैं।


यह काफी खतरनाक है।
AdmBorkBork

7

सीजेएम, 50 46 बाइट्स

q2/1>~i("4H~0ë~³!ò²×¶7Ö"256b25b'Af+3/=\

इसे ऑनलाइन आज़माएं। कुछ बाइट्स को बचाने के लिए स्ट्रिंग को संपीड़ित करने के लिए मार्टिन एंडर का धन्यवाद।

व्याख्या

q2/  e# Get input and divide it into groups of 2, like ["20" "16" "04"]
1>~  e# Discard the first item and dump the remaining array to the stack
i(   e# Convert the top value (month) to an integer and decrement it, because
     e# arrays are zero-indexed
"..."256b25b e# Convert this string from base-256 to base-25
'Af+ e# "Add" a capital A to each number to get the letters
3/   e# Divide into groups of 3 to make an array of month names
=\   e# Get the requested month and swap the elements to put the year on
     e# top, so it is printed last


6

जावा 7, 137 अक्षर (161 बाइट्स)

String d(String i){return Integer.toString("憯䷳烣㘿烪摿摽㛨近筍矯䏔".charAt(Integer.parseInt(i.substring(4))-1),36).toUpperCase()+i.substring(2,4);}

प्रत्येक महीने के नाम पर विचार करें (JAN, FEB etc ...) बेस 36 में एक संख्या है और इसे संबंधित यूनिकोड प्रतीक में अंकित किया गया है। फिर स्ट्रिंग से संबंधित प्रतीक प्राप्त करें इसे बेस 36 में फिर से एनकोड करें और उसके बाद कुछ सादे स्ट्रिंग जोड़तोड़ करें।

थोड़ा अपराजित:

String d(String input){
return 
  Integer.toString("憯䷳烣㘿烪摿摽㛨近筍矯䏔" // encoded month names
  .charAt(Integer.parseInt(input.substring(4))-1),36) // get a symbol from encoded names at position input[4:], decode it to base 36 value
  .toUpperCase()+input.substring(2,4); // get it to upper case and add year
}

आप इसे यहां देख सकते हैं: https://ideone.com/IKlnPY


5

पायथन, 83 बाइट्स

from datetime import*
lambda x:datetime.strptime(x,'%Y%m').strftime('%b%y').upper()

मैंने अभी आपका लगभग समान जवाब पोस्ट किया है। मैंने तुम्हारा नहीं देखा क्योंकि उत्तर लिखने में थोड़ा समय लगा। यदि आप चाहते हैं कि मैं अपना डिलीट कर दूं, तो मैं कुछ अतिरिक्त बाइट्स प्राप्त करने के लिए मेरा उपयोग कर सकता हूं।
bkul २२'१६

1
यह ठीक है, आपने मुझे 13 बाइट्स से हराया, मैं मना लूंगा। मुझे आपका मैनुअल उत्तर भी पसंद है।
एटलसोलॉजिस्ट

5

कोटलिन, 100 बाइट्स

fun f(d:String)=SimpleDateFormat("MMMyy").format(SimpleDateFormat("yyyyMM").parse(d)).toUpperCase()

जावा SimpleDateFormat का बहुत सीधा आगे उपयोग


1
हम्म, मैं कोटलिन को नहीं जानता, लेकिन चूंकि यह जावा से लिया गया है, इसलिए आपको SimpleDateFormat(यानी import java.text.*;) के आयात को शामिल नहीं करना चाहिए ?
केविन क्रूज़सेन

चूंकि चुनौती आउटपुट के लिए पूछती है, मुझे लगता है कि आपके फ़ंक्शन के हिस्से के रूप में एक प्रिंट आवश्यक है।
जॉनवेल्स

5

MATLAB / ऑक्टेव, 42 बाइट्स

@(x)upper(datestr(datenum(x,'yyyymm'),12))

एक अनाम फ़ंक्शन बनाता ansहै जिसे तारीख का प्रतिनिधित्व करने वाले स्ट्रिंग के साथ कहा जाता है ans('201604'):।

ऑनलाइन डेमो

यह समाधान datenumइनपुट तिथि को एक सीरियल दिनांक संख्या में परिवर्तित करने के लिए उपयोग करता है, और फिर आवश्यक स्वरूप में स्ट्रिंग प्रतिनिधित्व प्राप्त करने के लिए ( ) datestrपूर्वनिर्धारित आउटपुट कल्पना के साथ । अंत में, हम इसे बदलने के लिए उपयोग करते हैं क्योंकि अपरकेस महीना आउटपुट विकल्प नहीं है।mmmyy12upperMMMYY


1
वाह, गैर-गोल्फ भाषा में हर किसी की पिटाई पर जीजे!
19

5

05AB1E, 51 42 41 बाइट्स

2ô¦`ï<•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35B3ôsèsJ

व्याख्या

                                           # implicit input, 123405
2ô                                         # split input into pieces of 2, ['12','34','05']
  ¦`                                       # push last 2 elements to stack, '05', '34'
    ï<                                     # convert month to its int index, 4
      •r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35B        # get compressed string containing 3-letter months, 
                                             JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC
                                   3ô      # split into pieces of 3
                                             ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
                                     sè    # get month at index retrieved earlier, MAY
                                       sJ  # join with 2-digit year and implicitly print, MAY34

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

9 बाइट्स ने स्ट्रिंग संपीड़न के लिए धन्यवाद बचाया, @ अदनान के सौजन्य से


1
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35Bके बजाय "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"9 बाइट बचाता है।
अदनान

5

जावास्क्रिप्ट, 87 84 80 79 बाइट्स

x=>(new Date(x.replace(/.{4}/,'$&-'))+'').slice(4,7).toUpperCase()+x.slice(2,4)

महीना पाने के लिए, तारीख मिलती है (जो "YYYYMM" से "YYYY-MM" में परिवर्तित होती है) बनती है और 5 से 8 अक्षरों को पुनः प्राप्त करती है, जो कि महीने के पहले तीन अक्षर हैं। लेकिन इसे ऊपरी मामले में बदलने में बहुत खर्च होता है।

डेमो:

function s(x) {
  return (new Date(x.replace(/.{4}/, '$&-')) + '').slice(4,7)
         .toUpperCase() + x.slice(2, 4)
}

console.log(s('201604'));
console.log(s('200001'));
console.log(s('000112'));
console.log(s('123405'));


सबसे पहले होना चाहिएAPR16
डाउनगोट

@Upgoat और आपके लिए क्या दिखाई दे रहा है?
निकेल

1
मैं हो रहा हूंMAR16
डाउनगैट

@Upgoat हुह, यह अजीब है, यह इस तरह क्यों हो सकता है? क्योंकि मुझे यही मिलता है
निकेल

मेरे लिए यह शो करता है APR16, लेकिन तीसरा टेस्ट केस DECमेरे लिए ही दिखाता है।
अदनान

4

जूलिया, 57 56 53 बाइट्स

s->uppercase(Dates.format(DateTime(s,"yyyym"),"uyy"))

यह एक अनाम फ़ंक्शन है जो एक स्ट्रिंग को स्वीकार करता है और एक स्ट्रिंग लौटाता है। इसे कॉल करने के लिए, इसे किसी वैरिएबल पर असाइन करें।

पहले हम DateTimeटाइप कंस्ट्रक्टर और एक प्रारूप स्ट्रिंग का उपयोग करके एक ऑब्जेक्ट का निर्माण करते हैं। ध्यान दें कि mप्रारूप स्ट्रिंग में एकल को एक और दो-अंक दोनों महीने मिलेंगे, हालांकि पूर्व का मामला यहां अप्रासंगिक है। चूंकि कोई दिन निर्दिष्ट नहीं है, इसलिए महीने का पहला मान लिया गया है।

फिर हम सबमॉडल Dates.formatसे फ़ंक्शन का उपयोग करके एक स्ट्रिंग के रूप में मान को प्रारूपित कर सकते हैं Base.Dates। स्ट्रिंग uyyको तीन-अक्षर महीने का नाम और दो-अंक वाला वर्ष मिलता है, लेकिन परिणाम शीर्षक मामले में है, जैसे वांछित APR16 के बजाय Apr16, इसलिए हमें इसकी आवश्यकता है uppercase

इसे ऑनलाइन आज़माएं! (सभी परीक्षण मामले शामिल हैं)


4

सी, 147 145 112 बाइट्स

main(m){char a[99]="JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC";scanf("%4s%d",a+50,&m);printf("%.3s%s",a+--m*3,a+52);}

ऑनलाइन डेमो

धन्यवाद बदसूरत !


2
कुछ सस्ते तरकीबें - #includemmain(m)
डिफाइन

2
इसके अलावा, %.3sप्रारूप शून्य समाप्ति को बचाता है।
15

धन्यवाद @ यूगोरेन! मैं भी बदल "%4s%2d"गया "%4s%d"
मार्को

main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}बहुत छोटा
l4m2

4

जावास्क्रिप्ट ईएस 6, 77 66 बाइट्स

@ बॅलिंट को 11 बाइट्स धन्यवाद!

a=>(new Date(0,a[4]+a[5]-1)+"").slice(4,7).toUpperCase()+a[2]+a[3]

Dateकक्षा द्वारा लौटाए गए स्ट्रिंग को निकालकर तारीख प्राप्त करें । तब पूंजीकरण और वर्ष जोड़ता है।

ES5 संस्करण:

var a = prompt("Enter YYYYMM: ");
result = (new Date(0,a[4]+a[5]-1)+"").slice(4,7).toUpperCase()+a[2]+a[3]
alert(result);


मैंने एक ही atob तकनीक के साथ 66 बाइट्स में एक बनाया है, लेकिन मैं इसे कॉपी नहीं कर सकता
Bálint

@ बैलिंट मुझे लगा कि मुझे 66 बाइट्स मिल गए हैं लेकिन हमारे बाइट काउंटर को खराब कॉपी
पेस्टिंग के

आप इस महीने का नाम ले सकते हैं(Date(0,a[4]- -a[5])+"").substr(4,3)
Bálint

1
मुझे वह नहीं मिला a[4]- -a[5]। इसमें क्या गलत था a[4]+a[5]-1?
नील

1
new Date(0,a[4]+a[5]-1)+""=>new Date(0,a[4]+a[5]-1)+0
l4m2

3

सी #, 94 87 बाइट्स

string C(string s)=>System.DateTime.Parse(s.Insert(4,"-")).ToString("MMMyy").ToUpper();

C # 6 सिंटेक्स का उपयोग करके 7 बाइट्स की बचत की।

ऑनलाइन प्रयास करें


आप लैम्ब्डा के लिए वापसी प्रकार की जानकारी छोड़ सकते हैं, अर्थात्C(string s)=>...
बिल्ली


3

जावा 8, 154 113 बाइट्स

import java.text.*;s->new SimpleDateFormat("MMMyy").format(new SimpleDateFormat("yyyyMM").parse(s)).toUpperCase()

स्पष्टीकरण:

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

import java.text.*;                 // Required import for SimpleDateFormat
s->                                 // Method with String as both parameter and return-type
  new SimpleDateFormat("MMMyy")     //  Create a formatter with format "MMMyy"
   .format(                         //  Format the following:
     new SimpleDateFormat("yyyyMM") //   Create another formatter with format "yyyyMM"
     .parse(s))                     //   Parse the input with this format
  .toUpperCase()                    //  Convert everything to Uppercase and return

मुझे लगता है कि यदि आप आयात को हटाते हैं तो आप इसे छोटा कर सकते हैं और इसके बजाय सीधे इसके साथ संदर्भ लें java.text.SimpleDateFormat
फ्रोज़न

2
@Frozn वास्तव में, import java.text.*;19 बाइट्स है, और दोनों के java.text.सामने दो बार SimpleDateFormat20 बाइट्स है। इसलिए इसे कम करने के बजाय 1 बाइट में वृद्धि होगी।
केविन क्रूज़सेन

ओह, तुम ठीक कह रहे हो। मैं हमेशा ungolfed संस्करण को देखता हूं और सोचता हूं कि यह गोल्फ वाले के बराबर है। क्षमा करें :)
फ्रोज़न

@Frozn आह, मेरा भी थोड़ा बुरा है। आमतौर पर मैं अभी भी .*;अनगुल्ड कोड के लिए उपयोग करता हूं, लेकिन इस बार मुझे लगता है कि यह उपेक्षित है। मेरे पास ऐसे विकल्प हैं जो स्वचालित रूप से इसे शुद्ध आयातों में परिवर्तित कर देते हैं क्योंकि मैं अपनी नौकरी में जावा का उपयोग करता हूं, और मैं बस इसे बदलना भूल गया हूं import java.text.*;..
केविन क्रूज़सेन

2

Oracle SQL, 49 बाइट्स

select to_char(to_date(n,'yyyymm'),'MONyy')from t

डेटा को एक तालिका में टाइप के Tकॉलम Nके साथ डाला जाना चाहिए VARCHAR2(6), CHAR(6)या, केवल अगर सभी वर्ष> 1000 हो, NUMBER

उपयोग:

drop table t;
create table t (n VARCHAR2(6));
insert into t values ('201604');
insert into t values ('200001');
insert into t values ('000112');
insert into t values ('123405');    

select to_char(to_date(n,'yyyymm'),'MONyy')from t;

क्या SELECT के बजाय PRINT का उपयोग करना संभव होगा और इसके बजाय इनपुट के रूप में एक चर का उपयोग करके तालिका को संदर्भित नहीं करना चाहिए? इनपुट चर घोषित करना और मूल्य निर्दिष्ट करना बाइट की गिनती को प्रभावित नहीं करता है
t-clausen.dk

क्या इसे किसी तालिका से इनपुट लेने की अनुमति है? Codegolf टैग की जानकारी पता चलता है कि कोई।
पजाँक

@ t-clausen.dk प्रिंट का उपयोग करने का सबसे छोटा तरीका 58 वर्ण है: begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print nऔर आपको VARIABLE n varchar2;BEGIN:n:='201605';END;31 के बजाय एकल इनपुट ( ) के लिए 42 अतिरिक्त वर्णों की आवश्यकता है insert into t values('000112');यदि आपके पास छोटे तरीके हैं तो कृपया मुझे बताएं।
जियाको गारबेलो

इस जवाब में @pajonk ने मुझे टेबल के इस्तेमाल के बारे में कुछ नहीं बताया
जियाको गारबेलो

1
@pajonk के अनुसार इस , आप तालिकाओं के लिए इनपुट का उपयोग कर सकते हैं
t-clausen.dk

2

Microsoft SQL सर्वर, 57 बाइट्स

SELECT UPPER(FORMAT(CAST('201601'+'01' AS DATE),'MMMyy'))

Upperसमारोह प्रारूप अपर केस महीने के रूप में के साथ उम्मीद होगी उत्पादन नहीं करता है के रूप में आवश्यक है MMM प्रारूप पैटर्न।

उपयोग:

drop table t;
create table t (n VARCHAR(6));
insert into t values ('201604');
insert into t values ('200001');
insert into t values ('000112');
insert into t values ('123405');    

SELECT UPPER(FORMAT(CAST(n+'01' AS DATE),'MMMyy')) FROM t

बस अपना उत्तर देखा, यह मेरा जैसा है, अब तक इस पर ध्यान नहीं दिया, मेरा उत्तर हटा दिया
t-clausen.dk

क्या इसे किसी तालिका से इनपुट लेने की अनुमति है? Codegolf टैग की जानकारी पता चलता है कि कोई।
पजाँक

@ पजॉन्क यहाँ उत्तर तालिका से इनपुट का उपयोग नहीं करता है, उत्तर शीर्ष रेखा है और इनपुट चर हार्डकोड है। ध्यान दें कि आप टेबल का उपयोग इनपुट चर के रूप में कर सकते हैं जैसा कि मैंने पहले उल्लेख किया है। नीचे का भाग एक उदाहरण है कि कैसे कई मूल्यों को परिवर्तित किया जाए। TSQL में न तो STDIN है और न ही इनपुट स्टेटमेंट। डेटा जोड़ने का एकमात्र तरीका चर या तालिकाओं का उपयोग करना है। मेरे सभी उत्तर इनपुट के लिए उपयोग कर रहे हैं
t-clausen.dk

ठीक है, स्पष्ट करने के लिए धन्यवाद।
पजाँक

2

पायथ, 45 बाइट्स

+:."AYw2ûDÈëKH§È¼DYÉx\E±oË"J*3sgz5+3J:z2 4

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

स्पष्टीकरण:

+:."AYw2ûDÈëKH§È¼DYÉx\E±oË"J*3sgz5+3J:z2 4
                                z           Take the input
                               g 5          Slice inclusively from index 5 to the end
                              s             Parse as an int
                            *3              Multiply by 3
                           J                Store in variable J, this also returns J
 :                                          Take a slice
  ."AYw2ûDÈëKH§È¼DYÉx\E±oË"                 Of this packed string
                           J*3sgz5          From the J we defined before
                                  +3J       To J+3
+                                           To this string, append
                                     :z     A slice of the index
                                       2 4  From [2,4).

पैक्ड स्ट्रिंग शामिल है "JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"। दो JANएस इतना है कि मैं इसे छद्म-एक-अनुक्रमित कर सकता हूं।

संपादित करें: फिक्स्ड बग जो टीआईओ के साथ खिलवाड़ था


2

आर , 65 बाइट्स

function(A)paste0(toupper(month.abb[el(A:1)%%100]),substr(A,3,4))

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

एक स्ट्रिंग के रूप में इनपुट लेता है, निरंतर का लाभ उठाता है month.abb। मापांक का उपयोग करता है और substrप्रासंगिक मूल्यों को निकालने के लिए।


में :बदलने के लिए चतुर उपयोग integer!
Giuseppe

@Giuseppe मेरा विचार नहीं है :) मैंने इसे यहाँ से लिया है । मैं शायद इसे अपने मौजूदा उत्तरों के एक नंबर पर लागू कर सकता हूं!
JayCe

@Giuseppe मैंने सिर्फ एक छोटी हैक का उपयोग करके पाया el- 1 कम बाइट।
20

1

जे, 70 बाइट्स

4(}.((,~(_3]\'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'){~1-~".)~2&}.){.)]

प्रयोग

   f =: 4(}.((,~(_3]\'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'){~1-~".)~2&}.){.)]
   f '201604'
APR16
   f '200001'
JAN00
   f '000112'
DEC01
   f '123405'
MAY34

व्याख्या

4(}.((,~(_3]\'...'){~1-~".)~2&}.){.)] Input: s
                                    ] Identity function, gets the value s
4                                     The constant 4
                                 {.   Take the first 4 chars from s
                            2&}.      Drop the first 2 (Take the last 2) to get the year
  }.                                  Drop the first 4 chars from s to get the month
                        ".            Parse the month substring as a number
                     1-~              Subtract 1 from it
             '...'                    List of MMM month names
         _3]\                         Split the list into nonoverlapping sublists of size 3
      ,~                              Join the MMM month name with the year and return


1

jq, 35 अक्षर

(34 अक्षर कोड + 1 वर्ण कमांड-लाइन विकल्प।)

(बस कोशिश की गई कि उनके बैश जवाब में डिजिटल ट्रॉमा^ द्वारा उपयोग की गई ट्रिक jq में भी काम करे। अब आप जानते हैं कि इस उत्तर के सबसे महत्वपूर्ण चरित्र को किसने प्रेरित किया। (विकल्प फ़ंक्शन का उपयोग करने के लिए है।)ascii_upcase

strptime("%Y%m")|strftime("%^b%y")

नमूना रन ( -Rसभी परीक्षण मामलों को पारित करने के लिए इस नमूने में केवल विकल्प का उपयोग किया जाता है।)

bash-4.3$ jq -Rr 'strptime("%Y%m")|strftime("%^b%y")' <<END
201604
200001
000112
123405
END
APR16
JAN00
DEC01
MAY34

ऑन-लाइन परीक्षण: (URL के माध्यम से पासिंग -R समर्थित नहीं है - इसलिए JSON स्ट्रिंग शाब्दिक के रूप में इनपुट पास हुआ। -rURL से गुजरना समर्थित नहीं है - स्वयं रॉ आउटपुट की जाँच करें।)


1

फैक्टर, 82 78 बाइट्स

[ [ 2 tail* 10 base> month-abbreviation ] [ 4 head 2 tail ] bi append >upper ]

Eshplained:

[                    ! new anonymouse function block (quotation)
  [                  ! new quotation 
    2 tail*          ! "201604" -> "04"
    10 base>         ! "04"     -> 4
    month-abbreviation ! 4 -> "Apr"
  ]                  ! end quotation
  [                  ! new quotation
    4 head           ! "201604" -> "2016"
    2 tail           ! "2016"   -> "16" 
  ]                  ! end quotation
  bi                 ! bifurcate two quotations to TOS
  append             ! "Apr" "16" -> "Apr16"
  >upper             ! "Apr16"    -> "APR16"
]                    ! end quotation

1

PHP, 78 बाइट्स

<?=fscanf(STDIN,"%4d%d",$y,$m)?strtoupper(date("My",mktime(0,0,0,$m,1,$y))):0;

"वर्ष 2038 समस्या" कुछ कंप्यूटरों पर हो सकता है, के रूप में यहाँ । लेकिन दूसरों में नहीं, जैसा यहाँ है


@ समस्याएँ, कृपया अन्य लोगों के पदों को संपादित करने का प्रयास न करें यदि कोई समस्या है और अपने स्वयं के समाधान डालें; इसके बजाय, कृपया उत्तर पर टिप्पणी करें या स्वयं एक नया उत्तर बनाएं।
मूल्य इंक

1

स्विफ्ट 2.2, 149 बाइट्स

let f = NSDateFormatter(),g = NSDateFormatter();f.dateFormat = "yyyyMM";g.dateFormat = "MMMyy"
g.stringFromDate(f.dateFromString(i)!).uppercaseString

कोटलिन की तुलना में इसे छोटा करने की कोशिश कर रहा है ... यह शर्म की NSDateFormatterबात नहीं है कि इसके पास एक इनिशलाइज़र है जो इसे सेट करता है dateFormatNSDateFormatterएक डिफ़ॉल्ट dateFormatमान भी नहीं होता है , जिससे अतिरिक्त नुकसान होता है।

स्विफ्ट 3, 136 बाइट्स

let f = DateFormatter(),g = DateFormatter();f.dateFormat = "yyyyMM";g.dateFormat = "MMMyy"
g.string(from: f.date(from: i)!).uppercased()

NSकुछ वर्गों पर उपसर्ग को हटाने के लिए धन्यवाद , मैं स्विफ्ट 3 का जवाब थोड़ा छोटा करने में सक्षम था। अभी भी कोटलिन से कम नहीं है ...

परीक्षण समारोह और मामले:

import Foundation
import XCTest

func dateConverter(i: String) -> String? {
    let f = DateFormatter(),g = DateFormatter();f.dateFormat = "yyyyMM";g.dateFormat = "MMMyy"

    if let date = f.date(from: i) {
        return g.string(from: date).uppercased()
    }

    return nil
}

XCTAssert(dateConverter(i: "201604") == "APR16")
XCTAssert(dateConverter(i: "200001") == "JAN00")
XCTAssert(dateConverter(i: "000112") == "DEC01")
XCTAssert(dateConverter(i: "123405") == "MAY34")

1

आर, 154 150 114 112 बाइट्स

छह अंकों के इनपुट को "बी" में ले जाता है, पहले चार अंकों को पिछले दो अंकों से अलग करता है, 2 अंकों के महीने को संक्षिप्त करता है और इसे अपरकेस बनाता है, और इसे 3 और 4 वें अंक के साथ जोड़ देता है।

golfed:

function(b){h=substr;i=sprintf;o="%06d";cat(toupper(month.abb[as.numeric(h(i(o,b),5,6))]),h(i(o,b),3,4),sep="")}

Ungolfed:

function(b){
   h=substr;i=sprintf;o="%06d";

   cat(
      toupper(month.abb[as.numeric(h(i(o,b),5,6))]),
      h(i(o,b),3,4),
   sep="")
}

EDITS: चर के साथ डुप्लिकेट नाम बदल दिए गए; मुझे बेवकूफ बना दिया। फंक्शन अनाम मोड़ से -2 बाइट्स (धन्यवाद, बिल्ली)।


अच्छा जवाब! आप a=एक गुमनाम समारोह के लिए रवाना हो सकते हैं
बिल्ली

@ मैं गुमनाम कार्यों से बहुत परिचित नहीं हूं, लेकिन अगर मुझे हटा दिया जाए तो क्या मुझे समारोह की शुरुआत और अंत में कोष्ठक जोड़ने की आवश्यकता नहीं होगी a=? कुछ इस तरह: (function(m) {a=3;m*a})(10)
एक नरम तकिया

1
नहींं, function(b){h=substr;i=sprintf;o="%06d";cat(toupper(month.abb[as.numeric(h(i(o,b),5,6))]),h(i(o,b),3,4),sep="")}अपने आप में एक फ़ंक्शन ऑब्जेक्ट है।
बिल्ली

यह काम नहीं करता है। पर RStudio with R 3.2.3 (2015-12-10)मैंError in i(o, b) : invalid format '%06d'; use format %s for character objects
बिल्ली

@cat नया संस्करण सब कुछ गड़बड़! मैं RStudio चल रहा हूँ R version 3.1.1 (2014-07-10)और यह ठीक काम करता है। यहां यह कैसे काम करता है, क्या मुझे नया संस्करण प्राप्त करना चाहिए और कोड को बदलना चाहिए? अनाम फ़ंक्शन टिप के लिए भी धन्यवाद!
एक नरम तकिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.