YYYYMM을 MMMYY로 변환


54

이 SO 질문 에 기초합니다 .

형식에 날짜가 주어지면 형식으로 YYYYMM출력하면 문제는 간단 합니다 MMMYY.

규칙 :

  • 입력은 숫자 또는 정확히 6 자 길이의 문자열이며 숫자만으로 구성됩니다.
  • 마지막 두 자리는 ~ 사이 0112있습니다.
  • 출력은 형식이어야합니다 MMMYY. 여기서 MMM, 달에 대한 대문자 3 자리 코드 (아래)를 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
어제 HNQ에서 SO 로고 옆에 "YYYYMM을 MMMYY로 변환"이 표시되었습니다. 이제 PCG 로고 옆에 동일한 제목이 표시됩니다. 나는 매우 혼란 스러웠다 :)
cat

답변:


20

MATL, 18 14 13 바이트

4e!Z{Zc12XOXk

입력은 문자열로 제공됩니다 (작은 따옴표로 묶음).

MATLAB은 자동으로 구문 분석 할 수 있으므로이 버전은 MATLAB의 MATL에서만 실행됩니다 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
어떻게
Adnan

20

파이썬 3, 70 바이트

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

내장 strftimestrptime기능을 사용합니다 .

1 바이트 이상을 위해 문자열을 수동으로 구문 분석하는 버전이 있습니다.

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

이것은 달 이름을 흥미로운 방식으로 인코딩합니다 (바이트를 저장 한 Henry Gomersall에게 감사합니다).


11
그 수동 파싱은 미쳤다.
Morgan Thrapp 2016 년

@MorganThrapp 이 답변 에서 아이디어를 얻었습니다 .
bkul

1
숫자를 입력으로 사용하면 Python 2에서 수동 버전을 69 바이트로 수행 할 수 있습니다 lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4].
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()

3 바이트를 절약 한 @Joey에게 감사합니다!

명령 행 입력을 통해 입력 $args[0]을 명시 적 문자열 (예 :)로 가져옵니다 '201604'. 용도 string.Insert()를 넣어 기능을 -적절한 공간에, 그 결과 문자열은 입력을 형성 Get-Datecmdlet를-U3 개월 속기 플러스 두 자리 연도를 지정하는 형식 매개 변수입니다. 우리는 이것을 parens로 캡슐화하고 a .ToUpper()를 사용하여 출력 문자열을 대문자로 만듭니다. 이 문자열은 파이프 라인에 남아 있으며 인쇄는 암시 적입니다.

또한 지적했듯이 이것은 로케일에 민감합니다. 다음은 이것이 올바르게 작동하는 로케일 정보입니다.

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

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

MMMyycmdlet에 대한 간단한 인수 이므로을 인용 할 필요가 없습니다 . 대신을 사용할 수도 있습니다 -UFormat %b%y. 즉 -u %b%y, 더 짧습니다. 참고 사항 :이 솔루션은 로케일에 민감하지만 개인적으로 싫어합니다.
Joey

-UFormat대신 우수한 통화 . 감사! 나는 또한 따옴표에 대해 MMMyy몰랐다. 그것은 미래에 대해 잘 알고있다.
AdmBorkBork 2016 년

8

망막 , 71 70 바이트

1 바이트를 절약 한 Sp3000에 감사합니다.

바이트 수는 ISO 8859-1 인코딩을 가정합니다. 후행 줄 바꿈이 중요합니다.

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

R-6`.

온라인으로 사용해보십시오!

설명

촬영 201604예를 들어 :

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

이렇게하면 연도의 마지막 두 자리가 월로 바뀌고 줄 바꿈을 사용하여 단항으로 월을 확장하고 월 목록을 역으로 추가하여 다음을 얻습니다.

20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX¶¶¶¶16

여기서 줄 바꿈을 나타냅니다 (0x0A).

+`...¶

이제 줄 바꿈이 아닌 세 줄이 아닌 문자를 반복해서 제거합니다. 즉, 한 달을 나타내는 각 줄 바꿈마다 끝부터 달의 목록을 먹습니다.

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

이것이 우리가 다음과 같이 삽입 한 이유입니다 XXX. 월부터 계산이 시작되므로 11 월에도 항상 3 자 이상을 제거합니다.

R-6`.

마지막으로, 우리는 끝에서 6 번째 문자까지 모든 것을 제거합니다. 다시 말해 우리는 마지막 5 자만 유지합니다.


꽤 현명하다.
AdmBorkBork 2016 년

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의 숫자이며 해당 유니 코드 기호로 인코딩합니다. 그런 다음 문자열에서 해당 기호를 가져 와서 기본 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 바이트만큼 나를 이겼습니다. 나는 당신의 수동 답변도 좋아합니다.
atlasologist

5

코 틀린, 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 / 옥타브, 42 바이트

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

ans날짜를 나타내는 문자열로 호출 되는 익명의 함수를 작성 ans('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

온라인으로 사용해보십시오

@Adnan이 제공 한 문자열 압축 덕분에 9 바이트 절약


1
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35B대신 "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"9 바이트 를 절약합니다.
Adnan

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
Downgoat

@Upgoat 그리고 당신을 위해 무엇이 나타나는가?
nicael

1
내가 MAR16
간다

@Upgoat Huh, 이상합니다. 왜 이런 식일 수 있습니까? 내가 이것을 얻기 때문에 .
nicael

나에게 그것은 표시 APR16되지만 세 번째 테스트 사례는 DEC나 에게만 표시됩니다 .
Adnan

4

줄리아, 57 56 53 바이트

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

이것은 문자열을 받아들이고 문자열을 반환하는 익명 함수입니다. 호출하려면 변수에 지정하십시오.

먼저 DateTime형식 생성자와 형식 문자열을 사용하여 개체를 만듭니다. m전자의 경우에는 관련이 없지만 형식 문자열 의 단일 은 한 자리와 두 자리의 월을 모두 얻습니다. 요일이 지정되지 않았으므로 첫 번째 달로 가정합니다.

그런 다음 하위 모듈 의 Dates.format함수를 사용하여 값을 문자열로 형식화 할 수 있습니다 Base.Dates. 이 문자열 uyy은 3 자리 월 이름과 2 자리 연도를 가져 오지만 결과는 제목 APR과 같이 제목이 표시됩니다 (예 : 원하는 APR16 대신 Apr16) uppercase.

온라인으로 사용해보십시오! (모든 테스트 케이스 포함)


4

C, 147 (145) 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형식은 널 종료를 저장합니다.
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

자바 스크립트 ES6, 77 66 바이트

@ Bálint 덕분에 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 바이트로 1 개를 만들었지 만 복사 할 수 없습니다.
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();

C # 6 구문을 사용하여 7 바이트를 절약했습니다.

온라인 시도


람다에 대한 반품 유형 정보를 생략 할 수 있습니다. 즉C(string s)=>...
cat


3

자바 8, 154113 바이트

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.앞의 두 번은 SimpleDateFormat20 바이트입니다. 따라서 낮추는 대신 1 바이트 씩 증가합니다.
Kevin Cruijssen

아 맞아. 나는 항상 ungolfed 버전을보고 그것이 골프 버전과 같다고 생각합니다. 죄송합니다 :)
Frozn 2016.

@ Frozn 아, 조금 내 나쁜. 일반적으로 여전히 .*;ungolfed 코드에 사용하지만 이번에는 무시한 것 같습니다. 직장에서 Java를 사용하기 때문에 자동으로 순수 가져 오기로 변환하는 저장 옵션이 있으며 간단히 import java.text.*;.. 로 변경하는 것을 잊었습니다 .
Kevin Cruijssen 2016.

2

Oracle SQL, 49 바이트

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

데이터는 유형 T의 열로 호출 된 테이블에 삽입해야합니다 . 또는 모든 연도가 1000보다 큰 경우에만 NVARCHAR2(6)CHAR(6)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 된 태그 정보가 없는 것을 제안합니다.
pajonk

@ t-clausen.dk print를 사용하는 가장 짧은 방법은 58 문자입니다. 더 짧은 방법이 있다면 31 ( ) 대신 begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print n단일 입력 ( VARIABLE n varchar2;BEGIN:n:='201605';END;)에 42 개의 추가 문자가 필요 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". 두 개의 JANpseudo-one-indexed 인덱싱 할 수 있습니다.

편집 : 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 방금 el1 바이트를 사용하여 더 짧은 핵을 찾았습니다 .
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

Pyth, 39 바이트

16 진 덤프 :

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

테스트 스위트.


1

jq, 35 자

(34 자 코드 + 1 자 명령 행 옵션)

( 그의 Bash 답변^Digital Trauma 가 사용한 트릭 이 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 문자열 리터럴로 전달 -r됩니다. URL을 통한 전달 은 지원되지 않습니다. 원시 출력을 직접 확인하십시오.)


1

팩터, 82 78 바이트

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

발표 :

[                    ! 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, 문제가있는 경우 다른 사람의 게시물을 수정하지 말고 자신 만의 솔루션을 삽입하십시오. 대신 답변에 댓글을 달거나 직접 새 답변을 만드십시오.
Value Ink

1

스위프트 2.2, 149 바이트

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

Kotlin보다 짧게하려고 시도하는 것은 부끄러운 NSDateFormatter일입니다. 초기화를 설정하는 초기화 프로그램이 없습니다 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 바이트

"b"에 6 자리 숫자를 입력하고, 처음 4 자리를 마지막 2 자리와 분리하고, 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="")}

언 골프 드 :

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=익명 함수
고양이

@cat 익명 함수에 익숙하지는 않지만 함수의 시작과 끝에 괄호를 추가 할 필요는 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 Darn 새로운 버전으로 모든 것을 망칠 수 있습니다! RStudio를 실행 중이며 R version 3.1.1 (2014-07-10)정상적으로 작동합니다. 새 버전을 받아서 코드를 변경해야합니까? 익명의 기능 팁에 감사드립니다!
부드러운 베개
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.