Baseando-se nesta questão SO .
O desafio é bastante simples: dado um período de data no formato, YYYYMM
ele é 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
01
e12
. - A saída deve estar no formato
MMMYY
, ondeMMM
representa o código de três letras maiúsculas para o mês (abaixo) eYY
representa os dois últimos dígitos daYYYY
parte 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
Respostas:
MATL,
181413 bytesA 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
Aqui está uma versão de 18 bytes que funciona no Octave (e, portanto, no intérprete on-line)
Experimente Online
Versão modificada para todos os casos de teste
Explicação
fonte
Python 3, 70 bytes
Isso usa o built-in
strftime
estrptime
funções.Por mais 1 byte, aqui está uma versão que analisa a string manualmente:
Isso codifica os nomes dos meses de uma maneira interessante (obrigado a Henry Gomersall por salvar um byte).
fonte
lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4]
.lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
Bash + coreutils, 18
Requer a versão de 64 bits
date
para os casos de teste fornecidos, que reconhecem datas anteriores a 14 de dezembro de 1901 .fonte
PowerShell v2 +,
4946 bytesObrigado 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 astring.Insert()
função para colocar um-
no espaço apropriado, e essa sequência resultante forma a entrada noGet-Date
cmdlet com o-U
parâ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.
fonte
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.-UFormat
lugar. Obrigado! Também não sabia das citaçõesMMMyy
- é bom saber para o futuro.Retina ,
7170 bytesAgradecimentos ao Sp3000 por economizar 1 byte.
A contagem de bytes assume a codificação ISO 8859-1. O avanço de linha à direita é significativo.
Experimente online!
Explicação
Tomando
201604
como exemplo: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:
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:
É por isso que inserimos isso
XXX
: desde que os meses começam a contar1
, sempre removeremos pelo menos três caracteres, mesmo em janeiro.Finalmente, removemos tudo até o sexto personagem do final. Em outras palavras, mantemos apenas os últimos cinco caracteres.
fonte
CJam,
5046 bytesExperimente online. Agradecemos a Martin Ender por compactar a string para economizar alguns bytes.
Explicação
fonte
Bash,
3928 bytesObrigado Digital Trauma !
fonte
Java 7, 137 caracteres (161 bytes)
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:
Você pode vê-lo em execução aqui: https://ideone.com/IKlnPY
fonte
Python, 83 bytes
fonte
Kotlin, 100 bytes
Uso bastante direto do Java SimpleDateFormat
fonte
SimpleDateFormat
(ieimport java.text.*;
)?MATLAB / oitava, 42 bytes
Cria uma função anônima chamada
ans
que é chamada com uma string representando a data:ans('201604')
.Demo Online
Esta solução usa
datenum
para converter a data de entrada em um número de data de série e, em seguida,datestr
com a especificação de saída predefinida demmmyy
(12
) para gerar a representação de sequência no formato necessário. Finalmente, usamosupper
para alterá-lo para,MMMYY
uma vez que o mês em maiúsculas não é uma opção de saída.fonte
05AB1E,
514241 bytesExplicação
Experimente online
9 bytes salvos graças à compactação de strings, cortesia de @Adnan
fonte
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35B
em vez de"JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
salva 9 bytes.JavaScript,
87848079 bytesPara 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:
fonte
APR16
MAR16
APR16
, mas o terceiro caso de teste mostra apenasDEC
para mim.Julia,
575653 bytesEsta é 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
DateTime
objeto usando o construtor type e uma string de formato. Observe que o singlem
na 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.format
função doBase.Dates
submódulo. A stringuyy
obté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 precisamosuppercase
.Experimente online! (inclui todos os casos de teste)
fonte
C,
147145112 bytesDemonstração online
Obrigado ugoren !
fonte
#include
, definem
como um parâmetro -main(m)
,%.3s
formato salva a terminação nula."%4s%2d"
para"%4s%d"
.main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}
muito menorJavaScript ES6,
7766 bytesEconomizou 11 bytes graças a @ Bálint!
Get é a data extraindo a string retornada pela
Date
classe. depois capitaliza e adiciona o ano.Versão ES5:
fonte
(Date(0,a[4]- -a[5])+"").substr(4,3)
a[4]- -a[5]
. O que havia de erradoa[4]+a[5]-1
?new Date(0,a[4]+a[5]-1)+""
=>new Date(0,a[4]+a[5]-1)+0
C #,
9487 bytes7 bytes salvos usando a sintaxe C # 6.
Experimente on-line
fonte
C(string s)=>...
Japonês,
3534 bytesLigação.
Utiliza a mesma técnica da minha resposta JavaScript .
fonte
Java 8,
154113 bytesExplicação:
Experimente online.
fonte
java.text.SimpleDateFormat
.import java.text.*;
tem 19 bytes e duas vezesjava.text.
na frente de ambosSimpleDateFormat
tem 20 bytes. Portanto, aumentaria em 1 byte em vez de diminuí-lo..*;
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 paraimport java.text.*;
..Oracle SQL, 49 bytes
Os dados devem ser inseridos em uma tabela chamada
T
com uma colunaN
do tipoVARCHAR2(6)
,CHAR(6)
ou, apenas se todos os anos são> 1000,NUMBER
Uso:
fonte
begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print n
e 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.Microsoft SQL Server, 57 bytes
A
Upper
funçã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:
fonte
Pitão, 45 bytes
Experimente online!
Explicação:
A cadeia compactada contém
"JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
. Os doisJAN
s são para que eu possa indexá-lo pseudo-um-indexado.EDIT: Corrigido o erro que estava mexendo com o TIO
fonte
R , 65 bytes
Experimente online!
Pega a entrada como uma string, aproveita a constante
month.abb
. Usa módulo esubstr
para extrair valores relevantes.fonte
:
para converter parainteger
!el
- 1 byte a menos.J, 70 bytes
Uso
Explicação
fonte
Pitão, 39 bytes
Hexdump:
Suíte de teste.
fonte
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 aascii_upcase
função.))Execução de amostra (opção
-R
usada apenas nesta amostra para passar em todos os casos de teste.)Teste on-line: (A passagem de -R pela URL não é suportada - portanto, a entrada passou como literal da string JSON. A passagem da
-r
URL não é suportada - verifique você mesmo Raw Output.)fonte
Fator,
8278 bytesExplicado:
fonte
PHP, 78 bytes
O "problema do ano 2038" pode ocorrer em alguns computadores, como aqui . Mas não em outros, como aqui .
fonte
Swift 2.2, 149 bytes
Tentando diminuir isso que Kotlin ... É uma pena
NSDateFormatter
que não tenha um inicializador que defina seu valordateFormat
.NSDateFormatter
também não possui umdateFormat
valor padrão , causando perdas adicionais.Swift 3, 136 bytes
Graças à remoção do
NS
prefixo 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:
fonte
R,
154150114112 bytesColoca 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:
Ungolfed:
EDITAS: substituiu nomes duplicados por variáveis; me consertou sendo estúpido. -2 bytes, tornando a função anônima (obrigado, gato).
fonte
a=
para uma função anônimaa=
? Algo assim:(function(m) {a=3;m*a})(10)
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ó.RStudio with R 3.2.3 (2015-12-10)
I getError in i(o, b) : invalid format '%06d'; use format %s for character objects
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!