Chuyển đổi YYYYMM sang MMMYY


54

Dựa trên câu hỏi SO này .

Thách thức là khá đơn giản: đưa ra một khoảng thời gian ngày trong định dạng YYYYMMđầu ra nó ở định dạng MMMYY.

Quy tắc:

  • Đầu vào sẽ là một số hoặc một chuỗi dài chính xác 6 ký tự, chỉ bao gồm các chữ số.
  • Hai chữ số cuối cùng sẽ nằm giữa 0112.
  • Đầu ra phải ở dạng MMMYY, trong đó MMMđại diện cho mã ba chữ cái viết hoa cho tháng (bên dưới) và YYđại diện cho hai chữ số cuối của YYYYmột phần của đầu vào.

Danh sách các tháng có mã tương ứng:

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

Ví dụ:

Input     Output
201604    APR16
200001    JAN00
000112    DEC01
123405    MAY34

5
Câu hỏi này rất cân bằng. Cả hai thư viện phân tích thủ công và thư viện ngày cuối cùng đều giống nhau, ít nhất là trong Python.
bkul

10
Hôm qua, tôi đã thấy "Chuyển đổi YYYYMM sang MMMYY" trên HNQ bên cạnh logo SO. Bây giờ tôi thấy tiêu đề tương tự bên cạnh logo PCG. Tôi đã rất bối rối :)
con mèo

Câu trả lời:


20

MATL, 18 14 13 byte

4e!Z{Zc12XOXk

Đầu vào được cung cấp dưới dạng một chuỗi (kèm theo dấu ngoặc đơn).

Phiên bản này chỉ chạy trong MATL trên MATLAB vì MATLAB có thể tự động phân tích cú pháp datestr('2016 04').

Giải trình

        % 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

Đây là phiên bản 18 byte hoạt động trên Octave (và do đó trình thông dịch trực tuyến)

'yyyymm'2$YO12XOXk

Dùng thử trực tuyến

Phiên bản sửa đổi cho tất cả các trường hợp thử nghiệm

Giải trình

            % 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
Tôi không thấy làm thế nào điều này có thể bị đánh bại như vậy .. gg
Adnan

20

Python 3, 70 byte

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

Điều này sử dụng tích hợp strftimestrptimechức năng.

Để biết thêm 1 byte, đây là phiên bản phân tích chuỗi theo cách thủ công:

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

Điều này mã hóa tên tháng theo cách thú vị (cảm ơn Henry Gomersall vì đã lưu một byte).


11
Đó là phân tích thủ công là điên rồ.
Morgan Thrapp

@MorganThrapp Tôi có ý tưởng từ câu trả lời này .
bkul

1
Phiên bản thủ công của bạn có thể được thực hiện bằng 69 byte trong Python 2 nếu bạn lấy số làm đầu vào : lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4].
xnor

1
Mặc dù điều này làm mất một byte:lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
Henry Gomersall

1
@ a25bedc5-3d09-41b8-82fb-ea6c353d75ae - "thời gian nhập" sẽ giúp bạn tiết kiệm 6 ký tự, nhưng sẽ tiêu tốn của bạn 10 ("thời gian.", hai lần)
TLW


18

PowerShell v2 +, 49 46 byte

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

Cảm ơn @Joey vì đã tiết kiệm 3 byte!

Đưa đầu vào $args[0]dưới dạng một chuỗi rõ ràng (ví dụ '201604':) thông qua đầu vào dòng lệnh. Sử dụng string.Insert()hàm để đặt một -khoảng trống thích hợp và chuỗi kết quả đó tạo thành đầu vào cho Get-Datelệnh ghép ngắn với -Utham số định dạng chỉ định tốc ký ba tháng cộng với năm hai chữ số. Chúng tôi gói gọn rằng trong parens và giải quyết một .ToUpper()để làm cho chuỗi đầu ra được viết hoa. Chuỗi đó được để lại trên đường ống và in ấn là ẩn.

Ngoài ra, như đã chỉ ra, đây là nhạy cảm địa phương. Đây là thông tin ngôn ngữ mà tôi đang sử dụng, nơi này hoạt động chính xác.

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

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

Bạn không cần trích dẫn MMMyy, vì đó là một đối số đơn giản cho một lệnh ghép ngắn. Bạn cũng có thể chỉ cần sử dụng -UFormat %b%y, tức là -u %b%ythay vào đó, thậm chí còn ngắn hơn. Lưu ý bên lề: Giải pháp này nhạy cảm với ngôn ngữ (mà cá nhân tôi không thích), nhưng sẽ lâu hơn một chút để giải thích cho điều đó, phải thừa nhận.
Joey

Cuộc gọi tuyệt vời với -UFormatthay thế. Cảm ơn! Tôi cũng không biết về những trích dẫn xung quanh MMMyy- đó là điều tốt để biết cho tương lai.
admBorkBork

8

Võng mạc , 71 70 byte

Cảm ơn Sp3000 vì đã tiết kiệm 1 byte.

Số lượng byte giả định mã hóa ISO 8859-1. Các linefeed trailing là đáng kể.

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

R-6`.

Hãy thử trực tuyến!

Giải trình

Lấy 201604một ví dụ:

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

Điều này hoán đổi hai chữ số cuối của năm với tháng đồng thời mở rộng tháng một cách đơn phương bằng cách sử dụng các nguồn cấp dữ liệu và sắp xếp lại danh sách các tháng theo chiều ngược lại để chúng tôi nhận được:

20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX¶¶¶¶16

Trong đó đại diện cho các nguồn cấp dữ liệu (0x0A).

+`...¶

Bây giờ chúng tôi liên tục xóa ba ký tự không phải là nguồn cấp theo sau là một nguồn cấp. Đó là chúng tôi ăn hết danh sách các tháng kể từ cuối cho mỗi dòng cho mỗi tháng:

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

Đây là lý do tại sao chúng tôi đã chèn vào đó XXX: kể từ khi các tháng bắt đầu đếm 1, chúng tôi sẽ luôn xóa ít nhất ba ký tự, ngay cả trong tháng 1.

R-6`.

Cuối cùng, chúng tôi loại bỏ mọi thứ cho đến ký tự thứ 6 từ cuối. Nói cách khác, chúng tôi chỉ giữ năm ký tự cuối cùng.


Điều đó khá nguy hiểm.
admBorkBork

7

CJam, 50 46 byte

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

Hãy thử trực tuyến. Cảm ơn Martin Ender đã nén chuỗi để lưu một vài byte.

Giải trình

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 ký tự (161 byte)

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

Hãy xem mỗi tên tháng (JAN, FEB, v.v.) là một số trong cơ sở 36 và mã hóa nó thành ký hiệu Unicode tương ứng. Sau đó lấy biểu tượng tương ứng từ chuỗi mã hóa lại một lần nữa trong cơ sở 36 và sau đó một số thao tác chuỗi đơn giản.

Hơi vô dụng:

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
}

Bạn có thể thấy nó chạy ở đây: https://ideone.com/IKlnPY


5

Python, 83 byte

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

Tôi chỉ đăng một câu trả lời gần giống với bạn. Tôi không thấy bạn vì phải mất một thời gian để viết câu trả lời. Nếu bạn muốn tôi xóa của tôi, tôi sẽ hoặc bạn có thể sử dụng của tôi để có thêm một số byte.
bkul

1
Điều đó tốt, bạn đánh bại tôi 13 byte, tôi sẽ thừa nhận. Tôi thích câu trả lời bằng tay của bạn, quá.
đồ học

5

Kotlin, 100 byte

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

Việc sử dụng Java SimpleDateFormat khá đơn giản


1
Hmm, tôi không biết Kotlin, nhưng vì nó có nguồn gốc từ Java, bạn không nên bao gồm việc nhập SimpleDateFormat(nghĩa là import java.text.*;)?
Kevin Cruijssen

Vì thử thách yêu cầu đầu ra, tôi cho rằng một bản in là bắt buộc như là một phần của chức năng của bạn.
JohnWells

5

MATLAB / Octave, 42 byte

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

Tạo một hàm ẩn danh có tên ansđược gọi bằng một chuỗi biểu thị ngày : ans('201604').

Demo trực tuyến

Giải pháp này sử dụng datenumđể chuyển đổi ngày đầu vào thành số ngày nối tiếp và sau đó datestrvới thông số đầu ra được xác định trước của mmmyy( 12) để mang lại biểu diễn chuỗi theo định dạng bắt buộc. Cuối cùng, chúng tôi sử dụng upperđể thay đổi nó MMMYYvì tháng chữ hoa không phải là một tùy chọn đầu ra.


1
Wow, gj về việc đánh bại những người khác bằng ngôn ngữ không chơi gôn!
Hạ cấp

5

05AB1E, 51 42 41 byte

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

Giải trình

                                           # 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

Dùng thử trực tuyến

9 byte được lưu nhờ nén chuỗi, nhờ vào @Adnan


1
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35Bthay vì "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"tiết kiệm 9 byte.
Ad Nam

5

JavaScript, 87 84 80 79 byte

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

Để có được tháng, hãy lấy ngày (được hình thành từ "YYYYMM" được chuyển đổi thành "YYYY-MM") và lấy các ký tự từ 5 đến 8, chính xác là ba chữ cái đầu tiên của tháng. Nhưng chi phí nhiều để chuyển đổi nó thành chữ hoa

Bản giới thiệu:

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


Đầu tiên phải làAPR16
Downgoat

@Upgoat Và những gì xuất hiện cho bạn?
nicael

1
Tôi đang nhận đượcMAR16
Downgoat

@Upgoat Huh, thật lạ, tại sao nó lại như vậy? Bởi vì tôi nhận được điều này .
nicael

Đối với tôi nó không hiển thị APR16, nhưng trường hợp thử nghiệm thứ ba chỉ hiển thị DECcho tôi.
Ad Nam

4

Julia, 57 56 53 byte

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

Đây là một hàm ẩn danh chấp nhận một chuỗi và trả về một chuỗi. Để gọi nó, gán nó cho một biến.

Đầu tiên chúng ta xây dựng một DateTimeđối tượng bằng cách sử dụng hàm tạo kiểu và chuỗi định dạng. Lưu ý rằng chuỗi đơn mtrong chuỗi định dạng sẽ có cả tháng một và hai chữ số, mặc dù trường hợp trước đây không liên quan ở đây. Vì không có ngày nào được chỉ định, ngày đầu tiên của tháng được giả định.

Sau đó chúng ta có thể định dạng giá trị dưới dạng một chuỗi bằng cách sử dụng Dates.formathàm từ Base.Datesmô hình con. Chuỗi uyynhận được tên tháng gồm ba chữ cái và năm có hai chữ số, nhưng kết quả là trong trường hợp tiêu đề, ví dụ 16 tháng 4 thay vì APR16 mong muốn, vì vậy chúng tôi cần uppercasenó.

Hãy thử trực tuyến! (bao gồm tất cả các trường hợp thử nghiệm)


4

C, 147 145 112 byte

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

Bản demo trực tuyến

Cảm ơn xấu xí !


2
Một số thủ thuật rẻ tiền - xóa #include, xác định mlà tham số - main(m),
ugoren

2
Ngoài ra, %.3sđịnh dạng lưu kết thúc null.
xấu xí

Cảm ơn @ugoren! Tôi cũng đổi "%4s%2d"thành "%4s%d".
Marco

main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}ngắn hơn rất nhiều
l4m2

4

JavaScript ES6, 77 66 byte

Đã lưu 11 byte nhờ @ Bálint!

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

Nhận ngày bằng cách trích xuất chuỗi được trả về bởi Datelớp. sau đó viết hoa và thêm năm.

Phiên bản 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);


Tôi đã tạo một trong 66 byte với cùng một kỹ thuật atob, nhưng tôi không thể sao chép nó ra
Bálint

@ Bálint Tôi nghĩ rằng tôi cũng đã nhận được 66 byte nhưng biến bộ đếm byte của chúng tôi bị sai do dán bản sao xấu;)
Downgoat

Bạn có thể nhận được tên của tháng với(Date(0,a[4]- -a[5])+"").substr(4,3)
Bálint

1
Tôi không hiểu điều đó a[4]- -a[5]. Điều gì đã xảy ra với 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 byte

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

Đã lưu 7 byte bằng cách sử dụng Cú pháp C # 6.

Thử trực tuyến


Bạn có thể để lại thông tin loại trả về cho lambdas, tức làC(string s)=>...
mèo


3

Java 8, 154 113 byte

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

Giải trình:

Hãy thử trực tuyến.

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

Tôi nghĩ bạn có thể rút ngắn nó nếu bạn loại bỏ việc nhập và thay vào đó trực tiếp tham khảo nó với java.text.SimpleDateFormat.
Frozn

2
@Frozn Trên thực tế, import java.text.*;là 19 byte và hai lần java.text.trước cả hai SimpleDateFormatlà 20 byte. Vì vậy, nó sẽ tăng thêm 1 byte thay vì hạ thấp nó.
Kevin Cruijssen

Ồ đúng rồi. Tôi luôn nhìn vào phiên bản không có người lái và nghĩ rằng nó tương đương với phiên bản golf. Xin lỗi :)
Frozn

@Frozn Ah, cũng hơi xấu. Thông thường tôi vẫn sử dụng .*;cho mã không được mã hóa, nhưng lần này dường như tôi đã bỏ qua nó. Tôi có các tùy chọn lưu tự động chuyển đổi nó thành nhập khẩu thuần túy kể từ khi tôi sử dụng Java trong công việc của mình và tôi chỉ đơn giản là quên thay đổi nó thành import java.text.*;..
Kevin Cruijssen

2

Oracle SQL, 49 byte

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

Dữ liệu phải được lắp vào một bảng gọi Tvới một cột Nkiểu VARCHAR2(6), CHAR(6)hoặc, chỉ khi tất cả các năm là> 1000, NUMBER

Sử dụng:

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;

Có thể sử dụng PRINT thay vì CHỌN và không tham chiếu bảng sử dụng biến làm đầu vào thay thế? Khai báo biến đầu vào và gán giá trị không ảnh hưởng đến số byte
t-clausen.dk

Được phép lấy đầu vào từ một bảng? Các thông tin thẻ codegolf cho thấy rằng không có.
pyjama

@ t-clausen.dk cách ngắn nhất để sử dụng in là 58 ký tự: begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print nvà bạn cần thêm 42 ký tự cho một đầu vào ( VARIABLE n varchar2;BEGIN:n:='201605';END;) thay vì 31 ( insert into t values('000112');) nếu bạn có cách ngắn hơn xin vui lòng cho tôi biết.
Giacomo Garabello

@pajonk trong câu trả lời này không ai nói cho tôi biết gì về việc sử dụng bảng
Giacomo Garabello

1
@pajonk theo điều này , bạn có thể sử dụng các bảng cho đầu vào
t-clausen.dk

2

Máy chủ Microsoft SQL, 57 byte

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

Các Upperchức năng được yêu cầu như định dạng không sản xuất tháng trường hợp Upper như được mong đợi với MMM mẫu định dạng.

Sử dụng:

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

Chỉ cần nhìn thấy câu trả lời của bạn, nó rất giống như của tôi, cho đến bây giờ vẫn không nhận ra, đã xóa câu trả lời của tôi
t-clausen.dk

Được phép lấy đầu vào từ một bảng? Các thông tin thẻ codegolf cho thấy rằng không có.
pyjama

@pajonk câu trả lời ở đây không sử dụng đầu vào từ một bảng, câu trả lời là dòng trên cùng và biến đầu vào được mã hóa cứng. Lưu ý rằng bạn có thể sử dụng các bảng làm biến đầu vào như tôi đã đề cập trước đó. Phần dưới cùng là một ví dụ về cách chuyển đổi một số giá trị. TSQL không có STDIN cũng như các câu lệnh đầu vào. Chỉ có cách thêm dữ liệu là sử dụng biến hoặc bảng. Tất cả các câu trả lời của tôi đang sử dụng những câu trả lời cho đầu vào
t-clausen.dk

Ok, cảm ơn đã làm rõ.
pyjama

2

Bình thường, 45 byte

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

Hãy thử trực tuyến!

Giải trình:

+:."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).

Chuỗi đóng gói chứa "JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC". Hai cái JANnày để tôi có thể lập chỉ mục giả nó một chỉ mục.

EDIT: Đã sửa lỗi gây rối với TIO


2

R , 65 byte

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

Hãy thử trực tuyến!

Lấy đầu vào dưới dạng một chuỗi, tận dụng hằng số month.abb. Sử dụng mô đun và substrđể trích xuất các giá trị liên quan.


sử dụng thông minh :để chuyển đổi sang integer!
Giuseppe

@Giuseppe Không phải ý tưởng của tôi :) Tôi đã lấy nó từ đây . Tôi có thể có thể áp dụng nó cho một số câu trả lời hiện có của tôi!
JayCe

@Giuseppe Tôi vừa tìm thấy một bản hack ngắn hơn bằng cách sử dụng el- 1 byte ít hơn.
JayCe

1

J, 70 byte

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

Sử dụng

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

Giải trình

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

Bình thường, 39 byte

Hexdump:

0000000: 2b 40 63 2e 22 41 59 12 56 0a 7c bd 93 e3 1c 07 +@c."AY.V.|.....
0000010: e3 d4 d9 ed 5b 49 02 cd b4 92 83 86 22 33 73 3e ....[I......"3s>
0000020: 32 7a 3a 7a 32 20 34                            2z:z2 4

Bộ thử nghiệm.


1

jq, 35 ký tự

(Mã 34 ký tự + 1 ký tự tùy chọn dòng lệnh.)

(Chỉ cần thử liệu ^mẹo sử dụng Digital Trauma trong câu trả lời Bash của anh ấy có hoạt động trong jq không. Hoạt động. Bây giờ bạn đã biết ai đã truyền cảm hứng cho nhân vật quan trọng nhất của câu trả lời này. (Cách thay thế là sử dụng ascii_upcasechức năng.))

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

Chạy mẫu (Tùy chọn -Rchỉ được sử dụng trong mẫu này để vượt qua tất cả các trường hợp thử nghiệm.)

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

Kiểm tra trực tuyến: (Truyền qua -R qua URL không được hỗ trợ - vì vậy, đầu vào được chuyển dưới dạng chuỗi JSON. -rKhông được hỗ trợ chuyển qua URL - hãy tự kiểm tra Đầu ra thô.)


1

Yếu tố, 82 78 byte

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

Hiệu quả:

[                    ! 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 byte

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

Các "năm 2038 vấn đề" có thể xảy ra trên một số máy tính, như ở đây . Nhưng không phải ở những người khác, như ở đây .


@Titus, vui lòng không thử chỉnh sửa bài đăng của người khác nếu có vấn đề và chèn giải pháp của riêng bạn; thay vào đó, hãy bình luận về câu trả lời HOẶC tự tạo một câu trả lời mới.
Mực giá trị

1

Swift 2.2, 149 byte

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

Cố gắng để có được điều này ngắn hơn Kotlin ... Thật xấu hổ NSDateFormatterkhi không có trình khởi tạo nào thiết lập nó dateFormat. NSDateFormattercũng không có dateFormatgiá trị mặc định , gây thêm tổn thất.

Swift 3, 136 byte

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

Nhờ loại bỏ NStiền tố trên một số lớp, tôi đã có thể làm cho câu trả lời Swift 3 ngắn hơn một chút. Vẫn không ngắn hơn Kotlin mặc dù ...

Chức năng kiểm tra và trường hợp:

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 byte

Đưa đầu vào sáu chữ số thành "b", tách bốn chữ số đầu tiên khỏi hai chữ số cuối, viết tắt tháng 2 chữ số và viết hoa và viết hoa với chữ số thứ 3 và thứ 4.

Chơi gôn

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

Ung dung:

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: thay thế tên trùng lặp bằng các biến; cố định tôi là ngu ngốc -2 byte bằng cách chuyển hàm ẩn danh (cảm ơn, con mèo).


Câu trả lời tốt đẹp! Bạn có thể rời khỏi a=chức năng ẩn danh
con mèo

@cat Tôi không quá quen thuộc với các hàm ẩn danh nhưng tôi sẽ không cần thêm dấu ngoặc đơn ở đầu và cuối của hàm nếu tôi xóa a=? Một cái gì đó như thế này: (function(m) {a=3;m*a})(10)
một chiếc gối mềm

1
Không, 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="")}là một đối tượng chức năng của riêng mình.
mèo

Điều này dường như không hoạt động. vào RStudio with R 3.2.3 (2015-12-10)tôi nhận đượcError in i(o, b) : invalid format '%06d'; use format %s for character objects
con mèo

@cat Darn phiên bản mới làm rối tung mọi thứ! Tôi đang chạy RStudio R version 3.1.1 (2014-07-10)và nó hoạt động tốt. Làm thế nào để nó hoạt động ở đây, tôi có nên lấy phiên bản mới và thay đổi mã không? Cũng cảm ơn cho các mẹo chức năng ẩn danh!
một chiếc gối mềm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.