แปลง YYYYMM เป็น MMMYY


54

อ้างอิงจากคำถาม SOนี้

ท้าทายค่อนข้างง่าย: กำหนดระยะเวลาวันที่ในรูปแบบการส่งออกในรูปแบบYYYYMMMMMYY

กฎ:

  • ข้อมูลที่ป้อนจะเป็นตัวเลขหรือสตริงที่มีความยาว 6 ตัวอักษรซึ่งประกอบด้วยตัวเลขเท่านั้น
  • ล่าสุดตัวเลขสองหลักจะอยู่ระหว่างและ0112
  • เอาท์พุทจะต้องอยู่ในรูปแบบ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
คำถามนี้มีความสมดุลที่ดีมาก ทั้งการแยกวิเคราะห์ด้วยตนเองและการลงวันที่ในไลบรารีจะเหมือนกันอย่างน้อยใน Python
bkul

10
เมื่อวานฉันเห็น "แปลง YYYYMM เป็น MMMYY" บน HNQ ข้างโลโก้ SO ตอนนี้ฉันเห็นชื่อเดียวกันข้างโลโก้ PCG ฉันสับสนมาก :)
แมว

คำตอบ:


20

MATL, 18 14 13 ไบต์

4e!Z{Zc12XOXk

อินพุตมีให้เป็นสตริง (อยู่ในเครื่องหมายคำพูดเดี่ยว)

รุ่นนี้จะทำงานใน MATL บน 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 ไบต์ซึ่งใช้งานได้กับ Octave (และเป็นล่ามออนไลน์)

'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
Adnan

20

Python 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]

วิธีนี้จะเข้ารหัสชื่อเดือนด้วยวิธีที่น่าสนใจ (ขอบคุณ Henry Gomersall สำหรับการบันทึกไบต์)


11
การแยกวิเคราะห์ด้วยตนเองนั้นบ้า
Morgan Thrapp

@ MorganThrapp ฉันได้รับความคิดจากคำตอบนี้
bkul

1
รุ่นคู่มือที่คุณสามารถทำได้ใน 69 ไบต์ในหลาม 2 ถ้าคุณใช้ตัวเลขเป็น lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4]input:
xnor

1
แม้ว่าสิ่งนี้จะสูญเสียไบต์:lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
Henry Gomersall

1
@ a25bedc5-3d09-41b8-82fb-ea6c353d75ae - "เวลานำเข้า" จะช่วยให้คุณประหยัด 6 ตัวอักษร แต่จะเสียค่าใช้จ่าย 10 ("เวลา" สองเท่า)
TLW


18

PowerShell v2 +, 49 46 ไบต์

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

ขอบคุณ @Joey สำหรับการบันทึก 3 ไบต์!

รับอินพุต$args[0]เป็นสตริงที่ชัดเจน (เช่น'201604') ผ่านอินพุตบรรทัดคำสั่ง ใช้string.Insert()ฟังก์ชั่นเพื่อใส่-ในพื้นที่ที่เหมาะสมและสตริงผลลัพธ์จะป้อนอินพุตไปยังGet-Datecmdletพร้อมกับ-Uพารามิเตอร์รูปแบบที่ระบุชวเลขสามเดือนและปีสองหลัก เราแค็ปซูลนั้นใน parens และ tack บน.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แทนซึ่งสั้นกว่า คำแนะนำด้านข้าง: โซลูชันนี้มีความไวต่อสถานที่ (ซึ่งฉันไม่ชอบเป็นการส่วนตัว) แต่จะใช้เวลานานกว่านี้ในการอธิบาย
Joey

ยอดเยี่ยมด้วยการโทร-UFormatแทน ขอบคุณ! ฉันยังไม่รู้เกี่ยวกับคำพูดรอบตัวMMMyy- เป็นเรื่องดีที่จะรู้ในอนาคต
AdmBorkBork

8

เรติน่า , 71 70 ไบต์

ขอบคุณ Sp3000 สำหรับการบันทึก 1 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1 ตัวป้อนบรรทัดต่อท้ายมีความสำคัญ

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

R-6`.

ลองออนไลน์!

คำอธิบาย

การ201604เป็นตัวอย่าง:

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

วิธีนี้จะสลับตัวเลขสองหลักสุดท้ายของปีด้วยเดือนในขณะที่ยังขยายเดือนด้วยการใช้สายป้อนข้อมูลและเตรียมรายชื่อเดือนกลับด้านเพื่อให้เราได้รับ:

20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX¶¶¶¶16

ตำแหน่งที่แสดง linefeeds (0x0A)

+`...¶

ตอนนี้เราลบอักขระสามตัวที่ไม่ใช่ linefeed ซ้ำแล้วตามด้วย linefeed นั่นคือเรากินรายชื่อของเดือนจากสิ้นสำหรับแต่ละ linefeed คิดเป็นเดือน:

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

นี่คือเหตุผลที่เราได้แทรกสิ่งต่อไปนี้XXX: นับตั้งแต่เดือนเริ่มนับ1เราจะลบตัวอักษรอย่างน้อยสามตัวออกไปแม้กระทั่งในเดือนมกราคม

R-6`.

ในที่สุดเราลบทุกอย่างจนถึงตัวที่ 6 จากตอนท้าย กล่าวอีกนัยหนึ่งเราเก็บอักขระห้าตัวสุดท้ายเท่านั้น


นั่นช่างฉลาดทีเดียว
AdmBorkBork

7

CJam, 50 46 ไบต์

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

ลองออนไลน์ ขอบคุณ Martin Ender สำหรับการบีบอัดสตริงเพื่อบันทึกไม่กี่ไบต์

คำอธิบาย

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

Java 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 ฯลฯ ... ) เป็นตัวเลขในฐาน 36 และเข้ารหัสเป็นสัญลักษณ์ Unicode ที่สอดคล้องกัน จากนั้นรับสัญลักษณ์ที่สอดคล้องกันจากสตริงเข้ารหัสมันกลับมาอีกครั้งในฐาน 36 และหลังจากนั้นการจัดการสตริงธรรมดาบางอย่าง

ungolfed เล็กน้อย:

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

Python ขนาด 83 ไบต์

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

ฉันเพิ่งโพสต์คำตอบเกือบจะเหมือนกับคุณ ฉันไม่เห็นคุณเพราะใช้เวลาสักครู่ในการเขียนคำตอบ ถ้าคุณต้องการให้ฉันลบของฉันฉันจะหรือคุณสามารถใช้ของฉันที่จะได้รับไบต์พิเศษบางอย่าง
bkul

1
ไม่เป็นไรคุณทุบตีฉันทีละ 13 ไบต์ฉันจะยอมรับ ฉันชอบคำตอบของคุณเองเช่นกัน
กายวิภาคศาสตร์

5

Kotlin ขนาด 100 ไบต์

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

การใช้ Java SimpleDateFormat ให้ตรงไปตรงมา


1
อืมฉันไม่รู้ Kotlin แต่เนื่องจากมาจาก Java คุณไม่ควรรวมการนำเข้าSimpleDateFormat(เช่นimport java.text.*;) ใช่ไหม
Kevin Cruijssen

เนื่องจากความท้าทายขอผลลัพธ์ฉันจะถือว่าการพิมพ์เป็นส่วนหนึ่งของฟังก์ชั่นของคุณ
JohnWells

5

MATLAB / Octave ขนาด 42 ไบต์

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

สร้างฟังก์ชั่นที่ไม่ระบุชื่อชื่อที่เรียกว่ามีสตริงที่แสดงวันที่:ansans('201604')

การสาธิตออนไลน์

วิธีนี้ใช้datenumในการแปลงวันที่เข้าเป็นหมายเลขวันที่แบบอนุกรมจากนั้นdatestrด้วยข้อมูลจำเพาะเอาต์พุตที่กำหนดไว้ล่วงหน้าของmmmyy( 12) เพื่อให้ได้ผลลัพธ์ที่เป็นตัวแทนสตริงในรูปแบบที่ต้องการ ในที่สุดเราใช้upperเพื่อเปลี่ยนเป็นMMMYYเนื่องจากเดือนตัวพิมพ์ใหญ่ไม่ใช่ตัวเลือกผลลัพธ์


1
ว้าว gj ตีคนอื่นด้วยภาษาที่ไม่ใช่กอล์ฟ!
Downgoat

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 ไบต์ด้วยการบีบอัดสตริงซึ่งได้รับความอนุเคราะห์จาก @Adnan


1
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35Bแทนการ"JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"บันทึก 9 ไบต์
Adnan

5

JavaScript, 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
Downgoat

@Upgoat แล้วมีอะไรปรากฏให้คุณบ้าง
nicael

1
ฉันจะได้รับMAR16
Downgoat

@ Upgoat Huh มันแปลกทำไมมันถึงเป็นแบบนี้? เพราะผมได้รับนี้
nicael

สำหรับฉันแล้วมันแสดงAPR16แต่กรณีทดสอบที่สามแสดงDECให้ฉันเท่านั้น
Adnan

4

Julia, 57 56 53 ไบต์

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

นี่คือฟังก์ชันที่ไม่ระบุชื่อที่ยอมรับสตริงและส่งคืนสตริง หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

ก่อนอื่นเราสร้างDateTimeวัตถุโดยใช้ตัวสร้างประเภทและสตริงรูปแบบ โปรดทราบว่าmสตริงเดี่ยวในรูปแบบจะได้รับทั้งเดือนหนึ่งและสองหลักแม้ว่ากรณีก่อนหน้าจะไม่เกี่ยวข้องที่นี่ เนื่องจากไม่ได้ระบุวันจึงจะถือว่าวันแรกของเดือน

จากนั้นเราสามารถจัดรูปแบบค่าเป็นสตริงโดยใช้Dates.formatฟังก์ชันจากBase.Datessubmodule สตริงuyyได้รับชื่อเดือนสามตัวอักษรและปีสองหลัก แต่ผลในกรณีชื่อเช่น Apr16 แทน APR16 ที่ต้องการดังนั้นเราต้องการuppercaseมัน

ลองออนไลน์! (รวมถึงกรณีทดสอบทั้งหมด)


4

C, 147 145 112 112 ไบต์

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

การสาธิตออนไลน์

ขอบคุณugoren !


2
ลูกเล่นถูก ๆ - ลบ#include, กำหนดmเป็นพารามิเตอร์ - main(m),
ugoren

2
นอกจากนี้%.3sรูปแบบจะบันทึกการยกเลิกแบบ null
ugoren

ขอบคุณ @ugoren! ฉันยังมีการเปลี่ยนแปลงไป"%4s%2d" "%4s%d"
Marco

main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}สั้นลงมาก
l4m2

4

JavaScript ES6, 77 66 ไบต์

บันทึกแล้ว 11 ไบต์ด้วย@Bálint!

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);


ฉันทำหนึ่งใน 66 ไบต์ด้วยเทคนิค atob เดียวกัน แต่ฉันไม่สามารถคัดลอกมันออกมา
Bálint

@ Bálintฉันคิดว่าฉันมี 66 ไบต์เกินไป แต่จะเปิดเคาน์เตอร์ไบต์ของเราเป็นความผิดพลาดอันเนื่องมาจากการวางสำเนาที่ไม่ดี;)
Downgoat

คุณสามารถรับชื่อเดือนด้วย(Date(0,a[4]- -a[5])+"").substr(4,3)
Bálint

1
a[4]- -a[5]ฉันไม่ได้รับว่า มีอะไรผิดปกติกับa[4]+a[5]-1?
Neil

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

3

C #, 94 87 ไบต์

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

บันทึก 7 ไบต์โดยใช้ไวยากรณ์ C # 6

ลองออนไลน์


คุณสามารถออกจากข้อมูลประเภทผลตอบแทนสำหรับ lambdas เช่นC(string s)=>...
cat


3

Java 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ฉันคิดว่าคุณสามารถลดได้ถ้าคุณลบนำเข้าและแทนที่จะดูโดยตรงกับมันด้วย
Frozn

2
@ Frozn ที่จริงแล้วimport java.text.*;คือ 19 ไบต์และสองครั้งjava.text.ต่อหน้าทั้งสองSimpleDateFormatคือ 20 ไบต์ ดังนั้นมันจะเพิ่มขึ้น 1 ไบต์แทนที่จะลดลง
Kevin Cruijssen

โอ้ใช่แล้วคุณพูดถูก ฉันมักจะดูเวอร์ชั่นที่ไม่ดีและคิดว่ามันเท่ากับเวอร์ชั่นของกอล์ฟ ขออภัย :)
Frozn

@ Frozn Ah ก็แย่ไปหน่อย ปกติแล้วฉันยังคงใช้.*;รหัสที่ไม่ได้รับการแต่งแต้ม แต่คราวนี้ฉันดูเหมือนจะไม่สนใจมัน ฉันมีตัวเลือกบันทึกที่แปลงเป็นการนำเข้าโดยอัตโนมัติเนื่องจากฉันใช้ Java ในงานของฉันและฉันลืมที่จะเปลี่ยนเป็นimport java.text.*;..
Kevin Cruijssen

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;

เป็นไปได้ไหมที่จะใช้ PRINT แทน SELECT และไม่อ้างอิงตารางโดยใช้ตัวแปรเป็นอินพุตแทน การประกาศตัวแปรอินพุตและการกำหนดค่าไม่ส่งผลกระทบต่อจำนวนไบต์
t-clausen.dk

อนุญาตให้ป้อนข้อมูลจากตารางหรือไม่ ข้อมูลแท็ก codegolfแสดงให้เห็นว่าไม่มี
pajonk

@ t-clausen.dk วิธีที่สั้นที่สุดในการใช้การพิมพ์คือ 58 ตัวอักษร: begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print nและคุณต้องใช้ 42 ตัวอักษรพิเศษสำหรับการป้อนข้อมูลเดียว ( VARIABLE n varchar2;BEGIN:n:='201605';END;) แทนที่จะเป็น 31 ( insert into t values('000112');) ถ้าคุณมีวิธีที่สั้นกว่านี้โปรดบอกฉัน
Giacomo Garabello

@pajonk ในคำตอบนี้ไม่มีใครบอกอะไรฉันเกี่ยวกับการใช้งานตาราง
Giacomo Garabello

1
@pajonk ตามนี้คุณสามารถใช้ตารางสำหรับการป้อนข้อมูล
t-clausen.dk

2

Microsoft SQL Server ขนาด 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แสดงให้เห็นว่าไม่มี
pajonk

@pajonk คำตอบที่นี่ไม่ได้ใช้อินพุตจากตารางคำตอบคือบรรทัดบนสุดและตัวแปรอินพุตเป็นฮาร์ดโค้ด โปรดทราบว่าคุณสามารถใช้ตารางเป็นตัวแปรอินพุตตามที่ฉันพูดถึงก่อนหน้านี้ ส่วนด้านล่างเป็นตัวอย่างวิธีการแปลงค่าหลายค่า TSQL ไม่มี STDIN หรือคำสั่งอินพุต วิธีเดียวในการเพิ่มข้อมูลคือการใช้ตัวแปรหรือตาราง คำตอบทั้งหมดของฉันใช้คำเหล่านั้นสำหรับการป้อนข้อมูล
t-clausen.dk

โอเคขอบคุณสำหรับการชี้แจง
pajonk

2

Pyth, 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"สตริงบรรจุมี JANs สองตัวนั้นเพื่อที่ฉันจะได้จัดทำดัชนีหลอกแบบหนึ่งดัชนี

แก้ไข: แก้ไขข้อผิดพลาดที่ messing กับ TIO


2

R , 65 ไบต์

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

ลองออนไลน์!

month.abbจะเข้าเป็นสตริงยกระดับคงที่ ใช้โมดูลัสและsubstrเพื่อแยกค่าที่เกี่ยวข้อง


การใช้ฉลาดใน:การแปลงเป็นinteger!
จูเซปเป้

@Giuseppe ไม่คิดของฉัน :) เราเอาไปจากที่นี่ ฉันอาจนำไปใช้กับคำตอบที่มีอยู่จำนวนหนึ่งได้!
JayCe

@Giuseppe ฉันเพิ่งพบแฮ็คที่สั้นลงโดยใช้el- 1 ไบต์น้อยลง
JayCe

1

J, 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 ตัว)

(เพียงลองว่า^เคล็ดลับที่ใช้โดยDigital Traumaในคำตอบ Bashของเขาทำงานเป็น 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

การทดสอบออนไลน์: (ไม่รองรับการส่งผ่าน -R ผ่าน URL - ดังนั้นอินพุตจึงถูกส่งผ่านเป็นสตริงตัวอักษร JSON -rไม่สนับสนุนการส่งผ่าน URL - ตรวจสอบเอาต์พุตดิบด้วยตัวคุณเอง)


1

ตัวคูณ82 82ไบต์

[ [ 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 ปัญหา"อาจเกิดขึ้นบนคอมพิวเตอร์บางเครื่องเป็นที่นี่ แต่ไม่ได้อยู่ในคนอื่น ๆที่นี่


@Titus โปรดอย่าพยายามแก้ไขโพสต์ของคนอื่นหากมีปัญหาและใส่วิธีแก้ปัญหาของคุณเอง โปรดแสดงความคิดเห็นกับคำตอบหรือสร้างคำตอบใหม่ด้วยตัวเอง
ค่าหมึก

1

Swift 2.2, 149 bytes

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

พยายามทำให้สั้นกว่า Kotlin ... มันเป็นความอัปยศที่NSDateFormatterไม่มี initializer ที่ตั้งค่าdateFormatไว้ NSDateFormatterยังไม่มีค่าเริ่มต้นdateFormatทำให้เกิดการสูญเสียเพิ่มเติม

สวิฟท์ 3, 136 ไบต์

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

ขอบคุณการลบNSคำนำหน้าในบางคลาสฉันสามารถทำให้ Swift 3 ตอบสั้นลงเล็กน้อย ยังไม่สั้นกว่า Kotlin แม้ว่า ...

ฟังก์ชั่นการทดสอบและกรณี:

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

R, 154 150 114 112 112 ไบต์

ใช้อินพุตหกหลักเป็น "b" แยกตัวเลขสี่หลักแรกจากตัวเลขสองหลักสุดท้ายย่อเดือน 2 หลักและทำให้เป็นตัวพิมพ์ใหญ่และต่อกับตัวเลขหลักที่ 3 และ 4

แข็งแรงเล่นกอล์ฟ:

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="")
}

แก้ไข: แทนที่ชื่อซ้ำซ้อนด้วยตัวแปร คงฉันเป็นคนโง่ -2 ไบต์โดยการเปลี่ยนฟังก์ชั่นนิรนาม (ขอบคุณ cat)


คำตอบที่ดี! คุณสามารถออกจากa=ฟังก์ชั่นที่ไม่ระบุชื่อ
cat

@cat ฉันไม่คุ้นเคยกับฟังก์ชั่นที่ไม่ระบุชื่อ แต่ฉันไม่จำเป็นต้องเพิ่มวงเล็บที่จุดเริ่มต้นและจุดสิ้นสุดของฟังก์ชั่นถ้าฉันลบออกa=หรือไม่ อย่างนี้: (function(m) {a=3;m*a})(10)
หมอนนุ่ม ๆ

1
Nope 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 Darn เวอร์ชั่นใหม่ล้อเล่นทุกอย่างได้แล้ว! ฉันกำลังใช้งาน RStudio อยู่R version 3.1.1 (2014-07-10)และใช้งานได้ดี ทำงานที่นี่ฉันควรรับรุ่นใหม่และเปลี่ยนรหัสได้อย่างไร ขอขอบคุณสำหรับเคล็ดลับการใช้งานแบบไม่ระบุชื่อ!
หมอนนุ่ม ๆ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.