Converta o formato de data abreviada em data longa em inglês no menor número possível de bytes.
Entrada
A entrada será na forma de uma string com formato yyyy-mm-dd
,, com preenchimento zero opcional para todos os valores. Você pode assumir que isso é sintaticamente correto, mas não necessariamente uma data válida. Os valores negativos do ano não precisam ser suportados.
Resultado
Você deve converter a data no formato de data longa em inglês (por exemplo 14th February 2017
). O preenchimento zero aqui não é permitido.
Se a data for inválida (por exemplo 2011-02-29
), isso deve ser reconhecido de alguma forma. Lançar uma exceção é permitido.
Mais exemplos podem ser vistos abaixo.
Casos de teste
"1980-05-12" -> 12th May 1980
"2005-12-3" -> 3rd December 2005
"150-4-21" -> 21st April 150
"2011-2-29" -> (error/invalid)
"1999-10-35" -> (error/invalid)
code-golf
date
conversion
GarethPW
fonte
fonte
03rd
vez de3rd
2016-2-29
?Respostas:
PostgreSQL, 61 caracteres
Instrução preparada, recebe entrada como parâmetro.
Exemplo de execução:
fonte
Python 3.6,
137129 bytesExperimente online!
fonte
%-d
é a versão sem preenchimento%d
que você pode usar na formatação da string em vez de{g[2]}
. Além disso,12
deve tornar-se12th
, não12nd
(os números de 10-19 não seguem as mesmas regras de 1-9 e 20+)f
seqüências de caracteresJavaScript (ES6),
142140 bytesSaídas
NaNth Invalid Date
para datas inválidas.O código para números ordinais foi adaptado a partir desta resposta .
Mostrar snippet de código
fonte
Python 3.6 , 154 bytes
Experimente online! (Defina o fluxo de entrada e depois execute.)
Graças a boas sugestões dos comentaristas abaixo.
fonte
int(x)
efor
na lista comp.(('st','nd','rd')[b%10-1]if b<4 or 20<b<24 else'th')
em vez de seu condicional atual para -3 bytes.(3<b<21)+(23<b<31)
para -1 byte. Experimente online!PHP, 87 bytes
Execute como tubo
-F
ou teste-o online . Sempre imprime um ano de 4 dígitos; falha há anos> 9999.sem verificação de validade, 35 bytes:
fonte
Bash + coreutils,
11578Experimente online .
fonte
f=thstndrd; $d"${f:t/10-1?t%10<4?t%10*2:0:0:2} %B %Y"
.C #,
147143 bytesGuardado 4 bytes graças a @The_Lone_Devil.
fonte
t.Day
comd
uma economia de 4 byte?mIRC versão 7.49 (197 bytes)
fonte
Ruby ,
104103102 + 8 =112111110 bytesUsa
-rdate -p
sinalizadores de programa.-1 byte de manatwork.
Experimente online!
fonte
d<4||d>20?"..stndrd"[d%10*2,2]:"th"
26
tentará acessar índices12..13
na string de pesquisa, que está fora dos limites e, portanto, retornanil
. Assim, o uso do ternário faz comd<4||d>20?"..stndrd"[d%10*2,2]||"th":"th"
que seja mais longo em 2 bytes."th"
→:th
.C # (.NET Core) ,
167197 bytesExperimente online!
+30 bytes para
using System;
DateTime.Parse()
fonte
!
by-byte de -1. E você pode alterar&&
para&
para -3 bytes. Além disso, uma vez que você usas.Day
7 vezes, ele salva alguns bytes para criar um valor temporário para ele:s=>{var t=s.Day;return s.Equals(DateTime.MinValue)?"":t+((t%10==1&t!=11)?"st":(t%10==2&t!=12)?"nd":(t%10==3&t!=13)?"rd":"th")+" "+s.ToString("MMMM")+" "+s.Year;}
using System;
ou qualificar totalmente oDateTime
objeto.DateTime.MinValue
é1-1-1
assim que eu acho que você não precisa dessa verificação. O que também tornaria irrelevante meu argumento anterior.DateTime
e analisando fora do método não é aceitável, você deve fazer todo o trabalho dentro do método. Ou adicione um método extra para dividir o trabalho.Excel, 212 bytes
Se você o dividir em pedaços a cada e comercial, você obtém as seguintes peças:
ABS()
extrai o número do dia dos dois últimos caracteres da sequência. Como isso pode incluir um hífen,ABS
converte-o em positivo.IF((ABS-12)<2,"th",SWITCH())
adiciona o ordinal. O-12
bit é porque 11, 12 e 13 não seguem a regra normal e todos eles recebemth
em vez dest
,nd
erd
. Isso corrige isso.SWITCH
função está disponível apenas no Excel 2016 e posterior. ( Origem ) É mais curto do queCHOOSE
neste caso, pois pode retornar um valor se nenhuma correspondência for encontrada, enquantoCHOOSE
requer entrada numérica e deve ter um retorno correspondente para cada valor possível.TEXT(MID()*30," mmmm ")
extrai o nome do mês.MID()
extrai o número do mês como uma sequência e multiplicar por 30 retorna um número. O Excel vê esse número como uma data (1900-01-30, 1900-02-29, 1900-03-30, etc.) e oTEXT()
formata como um nome de mês com um espaço nas duas extremidades. 28 e 29 também teriam obras, mas 30 parecem "mais agradáveis".LEFT()
extrai o número do ano.Agora, considerando tudo isso, teria sido muito mais fácil se os casos de teste estivessem todos em um período que o Excel possa manipular como uma data real: 1900-01-01 a 9999-12-31. A grande vantagem é que a data inteira é formatada de uma só vez. Essa solução é 133 bytes :
O outro grande obstáculo foi ter que incluir o ordinal. Sem isso, a solução é de apenas 34 bytes :
fonte
Swift 3: 298 bytes
Experimente online!
fonte
# Language, N bytes
. Seria bom se você pudesse adicionar um também.T-SQL, 194 bytes
A entrada é via coluna de texto i na tabela preexistente t , de acordo com nossos padrões de IO .
Funciona para datas de 1º de janeiro de 0001 a 31 de dezembro de 9999. O ano é produzido com pelo menos 3 dígitos (por exemplo 150AD).
Datas inválidas resultarão no seguinte erro feio:
Configurações de idioma / cultura padrão diferentes podem alterar esse comportamento. Se você deseja uma saída de erro ligeiramente mais elegante (NULL), adicione 4 bytes alterando
PARSE()
paraTRY_PARSE()
.Formato e explicação:
O
DATE
tipo de dados introduzido no SQL 2008 permite um intervalo muito maior do queDATETIME
entre 1º de janeiro de 0001 e 31 de dezembro de 9999.Algumas datas muito precoces podem ser analisadas incorretamente nas minhas configurações de localidade nos EUA ("01-02-03" se torna "2 de janeiro de 2003"); portanto, eu antecipei alguns zeros extras para saber que o primeiro valor é o ano.
Depois disso, é apenas uma
CASE
declaração confusa para adicionar o sufixo ordinal ao dia. Irritantemente, oFORMAT
comando SQL não tem como fazer isso automaticamente.fonte
q / kdb + 210 bytes, não concorrente
Solução:
Exemplos:
Explicação:
Este é um desafio horrível, pois não há formatação de data, portanto, tenho que criar meses do zero (95 bytes) e gerar o sufixo.
A solução ungolfed está abaixo, basicamente divida a string de entrada e depois se junte novamente após adicionarmos o sufixo e mudar o mês.
Notas:
As datas em q só retornam a ~ 1709, portanto, não tenho uma maneira trivial de validar a data, portanto essa é uma entrada não concorrente ... O melhor que posso fazer é verificar se o dia é> 31 ou mês é > 12 e retorne 0.
fonte