Converter AAAAMM para MMMYY

54

Baseando-se nesta questão SO .

O desafio é bastante simples: dado um período de data no formato, YYYYMMele é gerado no formato MMMYY.

Regras:

  • A entrada será um número ou uma sequência com exatamente 6 caracteres, consistindo apenas de dígitos.
  • Os últimos dois dígitos estarão entre 01e 12.
  • A saída deve estar no formato MMMYY, onde MMMrepresenta o código de três letras maiúsculas para o mês (abaixo) e YYrepresenta os dois últimos dígitos da YYYYparte da entrada.

Lista de meses com o código correspondente:

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

Exemplos:

Input     Output
201604    APR16
200001    JAN00
000112    DEC01
123405    MAY34
pajonk
fonte
5
Esta questão é muito bem equilibrada. A análise manual e as bibliotecas de datas acabam sendo iguais, pelo menos no Python.
bkul
10
Ontem, vi "Convert YYYYMM to MMMYY" no HNQ ao lado do logo SO. Agora vejo o mesmo título ao lado do logotipo do PCG. Eu estava muito confuso :)
cat

Respostas:

20

MATL, 18 14 13 bytes

4e!Z{Zc12XOXk

A entrada é fornecida como uma sequência (entre aspas simples).

Esta versão é executada apenas no MATL no MATLAB, pois o MATLAB é capaz de analisar automaticamente datestr('2016 04').

Explicação

        % 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

Aqui está uma versão de 18 bytes que funciona no Octave (e, portanto, no intérprete on-line)

'yyyymm'2$YO12XOXk

Experimente Online

Versão modificada para todos os casos de teste

Explicação

            % 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
Suever
fonte
3
Eu não vejo como isso pode ser batido assim .. gg
Adnan
20

Python 3, 70 bytes

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

Isso usa o built-in strftimee strptimefunções.

Por mais 1 byte, aqui está uma versão que analisa a string manualmente:

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

Isso codifica os nomes dos meses de uma maneira interessante (obrigado a Henry Gomersall por salvar um byte).

bkul
fonte
11
Essa análise manual é uma loucura.
Morgan Thrapp
@MorganThrapp Recebi a ideia desta resposta .
bkul
11
Sua versão manual pode ser feito em 69 bytes em Python 2 se você tomar um número como entrada: lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4].
xnor
11
Embora isso perca um byte:lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
Henry Gomersall 23/06
11
@ a25bedc5-3d09-41b8-82fb-ea6c353d75ae - "tempo de importação" pouparia 6 caracteres, mas custaria 10 ("tempo.", duas vezes))
TLW
18

PowerShell v2 +, 49 46 bytes

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

Obrigado a @Joey por salvar 3 bytes!

Recebe a entrada $args[0]como uma sequência explícita (por exemplo, '201604') via entrada da linha de comando. Usa a string.Insert()função para colocar um -no espaço apropriado, e essa sequência resultante forma a entrada no Get-Datecmdlet com o -Uparâmetro format especificando o atalho de três meses mais o ano de dois dígitos. Encapsulamos isso em parênteses e aderimos a um .ToUpper()para tornar a cadeia de saída maiúscula. Essa sequência é deixada no pipeline e a impressão está implícita.

Além disso, como apontado, isso é sensível à localidade. Aqui estão as informações de localidade que estou usando, onde isso funciona corretamente.

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

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)
AdmBorkBork
fonte
Você não precisa citar o arquivo MMMyy, pois é um argumento simples para um cmdlet. Você também pode usar -UFormat %b%y, ou seja -u %b%y, que é ainda mais curto. Nota lateral: Esta solução é sensível ao local (do qual eu pessoalmente não gosto), mas seria um pouco mais demorado explicar isso, reconhecidamente.
Joey
Excelente chamada com o -UFormatlugar. Obrigado! Também não sabia das citações MMMyy- é bom saber para o futuro.
AdmBorkBork
8

Retina , 71 70 bytes

Agradecimentos ao Sp3000 por economizar 1 byte.

A contagem de bytes assume a codificação ISO 8859-1. O avanço de linha à direita é significativo.

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

R-6`.

Experimente online!

Explicação

Tomando 201604como exemplo:

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

Isso troca os dois últimos dígitos do ano com o mês, enquanto também expande o mês em unário usando feeds de linha e precede a lista de meses no sentido inverso, para obtermos:

20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX¶¶¶¶16

Onde as linhas representam linhas (0x0A).

+`...¶

Agora, removemos repetidamente três caracteres que não são de avanço de linha, seguidos por um avanço de linha. Ou seja, consumimos a lista de meses do final de cada avanço de linha que representa um mês:

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

É por isso que inserimos isso XXX: desde que os meses começam a contar 1, sempre removeremos pelo menos três caracteres, mesmo em janeiro.

R-6`.

Finalmente, removemos tudo até o sexto personagem do final. Em outras palavras, mantemos apenas os últimos cinco caracteres.

Martin Ender
fonte
Isso é muito inteligente.
AdmBorkBork
7

CJam, 50 46 bytes

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

Experimente online. Agradecemos a Martin Ender por compactar a string para economizar alguns bytes.

Explicação

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
NinjaBearMonkey
fonte
6

Java 7, 137 caracteres (161 bytes)

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

Considere que o nome de cada mês (JAN, FEB, etc.) seja um número na base 36 e codifique-o no símbolo Unicode correspondente. Em seguida, obtenha o símbolo correspondente da string e codifique-o novamente na base 36 e, depois disso, algumas manipulações simples da string.

Ligeiramente não destruído:

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
}

Você pode vê-lo em execução aqui: https://ideone.com/IKlnPY

cliffroot
fonte
5

Python, 83 bytes

from datetime import*
lambda x:datetime.strptime(x,'%Y%m').strftime('%b%y').upper()
atlasologist
fonte
Acabei de publicar uma resposta quase idêntica à sua. Não vi o seu porque demorou um pouco para escrever a resposta. Se você quiser que eu exclua o meu, eu irei, ou você pode usá-lo para obter alguns bytes extras.
bkul
11
Tudo bem, você me venceu por 13 bytes, eu admito. Também gosto da sua resposta manual.
Atlasologist
5

Kotlin, 100 bytes

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

Uso bastante direto do Java SimpleDateFormat

Rames
fonte
11
Hmm, eu não conheço o Kotlin, mas como é derivado do Java, você não deve incluir a importação do SimpleDateFormat(ie import java.text.*;)?
Kevin Cruijssen
Como o desafio pede saída, eu suponho que uma impressão seja necessária como parte de sua função.
JohnWells
5

MATLAB / oitava, 42 bytes

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

Cria uma função anônima chamada ansque é chamada com uma string representando a data: ans('201604').

Demo Online

Esta solução usa datenumpara converter a data de entrada em um número de data de série e, em seguida, datestrcom a especificação de saída predefinida de mmmyy( 12) para gerar a representação de sequência no formato necessário. Finalmente, usamos upperpara alterá-lo para, MMMYYuma vez que o mês em maiúsculas não é uma opção de saída.

Suever
fonte
11
Uau, gj em vencer todos os outros em um idioma não-golfe!
Downgoat
5

05AB1E, 51 42 41 bytes

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

Explicação

                                           # 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

Experimente online

9 bytes salvos graças à compactação de strings, cortesia de @Adnan

Emigna
fonte
11
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35Bem vez de "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"salva 9 bytes.
22416 Adnan
5

JavaScript, 87 84 80 79 bytes

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

Para obter o mês, obtém a data (formada por "AAAAMM" convertida em "AAAA-MM") e recupera os caracteres de 5 a 8, que são exatamente as três primeiras letras do mês. Mas custa muito convertê-lo para maiúsculas.

Demo:

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

nicael
fonte
Primeiro deve serAPR16
Downgoat
@Upgoat E o que está aparecendo para você?
Nicael
11
Estou ficandoMAR16
Downgoat
@ Upgoat Huh, isso é estranho, por que poderia ser assim? Porque eu entendo isso .
Nicael
Para mim, mostra APR16, mas o terceiro caso de teste mostra apenas DECpara mim.
Adnan
4

Julia, 57 56 53 bytes

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

Esta é uma função anônima que aceita uma string e retorna uma string. Para chamá-lo, atribua-o a uma variável.

Primeiro, construímos um DateTimeobjeto usando o construtor type e uma string de formato. Observe que o single mna string de formato receberá meses de um e dois dígitos, embora o primeiro caso seja irrelevante aqui. Como nenhum dia é especificado, o primeiro do mês é assumido.

Podemos então formatar o valor como uma string usando a Dates.formatfunção do Base.Datessubmódulo. A string uyyobtém o nome do mês com três letras e o ano com dois dígitos, mas o resultado está no título, por exemplo, Apr16 em vez do APR16 desejado, por isso precisamos uppercase.

Experimente online! (inclui todos os casos de teste)

Alex A.
fonte
4

C, 147 145 112 bytes

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

Demonstração online

Obrigado ugoren !

Marco
fonte
2
Alguns truques baratos - delete the #include, define mcomo um parâmetro - main(m),
ugoren
2
Além disso, o %.3sformato salva a terminação nula.
ugoren
Obrigado @ugoren! Eu também mudei "%4s%2d"para "%4s%d".
Marco
main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}muito menor
l4m2 08/04
4

JavaScript ES6, 77 66 bytes

Economizou 11 bytes graças a @ Bálint!

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

Get é a data extraindo a string retornada pela Dateclasse. depois capitaliza e adiciona o ano.

Versão 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);

Downgoat
fonte
Eu fiz um em 66 bytes com a mesma técnica atob, mas não pode copiá-lo para fora
Bálint
@ Bálint Pensei que também tinha 66 bytes, mas o contador de bytes estava errado devido a uma cópia incorreta da colagem;) #
Downgoat
Você pode obter o nome do mês com(Date(0,a[4]- -a[5])+"").substr(4,3)
Bálint
11
Eu não entendo isso a[4]- -a[5]. O que havia de errado a[4]+a[5]-1?
Neil
11
new Date(0,a[4]+a[5]-1)+""=>new Date(0,a[4]+a[5]-1)+0
l4m2
3

C #, 94 87 bytes

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

7 bytes salvos usando a sintaxe C # 6.

Experimente on-line

raznagul
fonte
Você pode deixar de fora informações tipo de retorno para lambdas, ou sejaC(string s)=>...
cat
3

Japonês, 35 34 bytes

ÐUr$/..../$,"$&-")+P s4,7 u +Us2,4

Ligação.

Utiliza a mesma técnica da minha resposta JavaScript .

nicael
fonte
3

Java 8, 154 113 bytes

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

Explicação:

Experimente online.

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
Kevin Cruijssen
fonte
Eu acho que você pode reduzi-lo se você remover a importação e, em vez disso, se referir diretamente a ela java.text.SimpleDateFormat.
Frozn 23/06/16
2
@Frozn Na verdade, import java.text.*;tem 19 bytes e duas vezes java.text.na frente de ambos SimpleDateFormattem 20 bytes. Portanto, aumentaria em 1 byte em vez de diminuí-lo.
Kevin Cruijssen
Oh sim, você está certo. Eu sempre olho para a versão não-golfada e acho que é igual à versão do golfe. Desculpe :)
Frozn
@ Frozn Ah, também um pouco ruim. Normalmente, ainda uso .*;o código não-bloqueado, mas desta vez parece que o negligenciei. Tenho opções de salvamento que converte automaticamente às importações puros desde que eu usar Java em meu trabalho, e eu simplesmente esqueceu-se de alterá-lo para import java.text.*;..
Kevin Cruijssen
2

Oracle SQL, 49 bytes

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

Os dados devem ser inseridos em uma tabela chamada Tcom uma coluna Ndo tipo VARCHAR2(6), CHAR(6)ou, apenas se todos os anos são> 1000, NUMBER

Uso:

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;
Giacomo Garabello
fonte
Seria possível usar PRINT em vez de SELECT e não se referir à tabela usando uma variável como entrada? Declarando variável de entrada e atribuir o valor não afeta a contagem de bytes
t-clausen.dk
É permitido receber informações de uma tabela? As informações da tag codegolf sugerem que não.
Pajonk
@ t-clausen.dk a maneira mais curta de imprimir é 58 caracteres: begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print ne você precisa de 42 caracteres extras para uma única entrada ( VARIABLE n varchar2;BEGIN:n:='201605';END;) em vez de 31 ( insert into t values('000112');) se você tiver maneiras mais curtas, por favor me diga.
Giacomo Garabello
@pajonk em esta resposta ninguém me dizer alguma coisa sobre o uso de tabelas
Giacomo Garabello
11
@pajonk de acordo com este , você pode usar tabelas para entrada
t-clausen.dk
2

Microsoft SQL Server, 57 bytes

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

A Upperfunção é necessária, pois o formato não produz meses em maiúsculas, como seria de esperar com o padrão de formato MMM .

Uso:

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
Nova Iorque
fonte
Só vi sua resposta, é muito como o meu, não percebeu até agora, removida a minha resposta
t-clausen.dk
É permitido receber informações de uma tabela? As informações da tag codegolf sugerem que não.
Pajonk
@pajonk a resposta aqui não usa a entrada de uma tabela, a resposta é a linha superior e a variável de entrada é codificada. Observe que você pode usar tabelas como variáveis ​​de entrada, como mencionei anteriormente. A parte inferior é um exemplo de como converter vários valores. O TSQL não possui instruções STDIN nem de entrada. A única maneira de adicionar dados é usar variáveis ​​ou tabelas. Todas as minhas respostas estão usando aqueles para entrada
t-clausen.dk
Ok, obrigado por esclarecer.
Pajonk
2

Pitão, 45 bytes

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

Experimente online!

Explicação:

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

A cadeia compactada contém "JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC". Os dois JANs são para que eu possa indexá-lo pseudo-um-indexado.

EDIT: Corrigido o erro que estava mexendo com o TIO

ericeschnei
fonte
2

R , 65 bytes

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

Experimente online!

Pega a entrada como uma string, aproveita a constante month.abb. Usa módulo e substrpara extrair valores relevantes.

JayCe
fonte
uso inteligente de :para converter para integer!
Giuseppe
@ Giuseppe Não é minha ideia :) eu peguei a partir daqui . Provavelmente posso aplicá-lo a várias respostas existentes!
Jayce
@ Giuseppe Acabei de encontrar um hack mais curto usando el- 1 byte a menos.
Jayce
1

J, 70 bytes

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

Uso

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

Explicação

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
milhas
fonte
1

Pitão, 39 bytes

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

Suíte de teste.

Freira Furada
fonte
1

jq, 35 caracteres

(Código de 34 caracteres + opção de linha de comando de 1 caractere.)

(Tentei apenas se o ^truque usado pelo Digital Trauma em sua resposta Bash também funciona em jq. Funciona. Agora você sabe quem inspirou o personagem mais importante dessa resposta. (A alternativa é usar a ascii_upcasefunção.))

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

Execução de amostra (opção -Rusada apenas nesta amostra para passar em todos os casos de teste.)

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

Teste on-line: (A passagem de -R pela URL não é suportada - portanto, a entrada passou como literal da string JSON. A passagem da -rURL não é suportada - verifique você mesmo Raw Output.)

homem a trabalhar
fonte
1

Fator, 82 78 bytes

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

Explicado:

[                    ! 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
gato
fonte
1

PHP, 78 bytes

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

O "problema do ano 2038" pode ocorrer em alguns computadores, como aqui . Mas não em outros, como aqui .

Marco
fonte
@Titus, por favor, não tente editar as postagens de outras pessoas se houver problemas e insira suas próprias soluções; em vez disso, comente a resposta OU crie você mesmo uma nova resposta.
Value Ink
1

Swift 2.2, 149 bytes

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

Tentando diminuir isso que Kotlin ... É uma pena NSDateFormatterque não tenha um inicializador que defina seu valor dateFormat. NSDateFormattertambém não possui um dateFormatvalor padrão , causando perdas adicionais.

Swift 3, 136 bytes

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

Graças à remoção do NSprefixo em algumas classes, pude tornar a resposta do Swift 3 um pouco mais curta. Ainda não é mais curto que Kotlin ...

Função de teste e casos:

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")
JAL
fonte
1

R, 154 150 114 112 bytes

Coloca a entrada de seis dígitos em "b", separa os quatro primeiros dígitos dos últimos dois dígitos, abrevia o mês de 2 dígitos, coloca-o em maiúscula e concatena-o com o terceiro e o quarto dígitos.

Golfe:

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

EDITAS: substituiu nomes duplicados por variáveis; me consertou sendo estúpido. -2 bytes, tornando a função anônima (obrigado, gato).

um travesseiro macio
fonte
Boa resposta! Você pode deixar de fora o a=para uma função anônima
cat
@cat Eu não estou muito familiarizado com funções anônimas, mas não precisaria adicionar parênteses no início e no final da função se removesse o a=? Algo assim: (function(m) {a=3;m*a})(10)
um travesseiro macio
11
Não, 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="")}é um objeto de função por si só.
cat
Isso não parece funcionar. em RStudio with R 3.2.3 (2015-12-10)I getError in i(o, b) : invalid format '%06d'; use format %s for character objects
cat
@cat Malditas novas versões estragando tudo! Estou no RStudio rodando R version 3.1.1 (2014-07-10)e funciona bem. Como isso funciona aqui, devo obter a nova versão e alterar o código? Também obrigado pela dica de função anônima!
um travesseiro macio