Escreva uma função ou programa que aceite uma data (como uma string no YYYY-MM-DD
formato) como entrada e retorne um valor verdadeiro se essa data for "alfabética" e um valor falsey se não for.
Uma data alfabética é uma data cujo mês, dia e ano estão em ordem alfabética quando expressos como uma sequência de caracteres (e quando considerados especificamente na ordem M - D - Y). Por exemplo, 26 de setembro de 2018 é uma data alfabética:
September 26th 2018 -> September twenty-sixth two thousand eighteen
September
Twenty-sixth
Two thousand eighteen
Outra maneira de pensar nesse desafio: "os elementos de uma determinada data são lexicamente classificados?"
Notas:
- 2018 é representado como "dois mil e dezoito", não "vinte e dezoito" ou "dois zero um oito". Por outro exemplo, o ano de 1456 seria representado como "mil quatrocentos e cinquenta e seis", não "catorze e cinquenta e seis".
- 26 é representado como "vigésimo sexto", não "vinte e seis".
- Cada elemento da data é considerado como um todo. É por isso que 2018 não falha automaticamente, embora o "e" nos dezoito venha antes do "t" em dois.
As seguintes datas não são alfabéticas:
- 2 de setembro de 2018 (o "segundo" deve estar à frente de "setembro")
- 30 de abril de 4000 ("quatro mil" deve estar à frente de "trigésimo")
Regras adicionais:
- Você receberá a data como uma string, formatada como
YYYY-MM-DD
. O ano sempre terá quatro dígitos e o mês e o dia sempre terão dois dígitos cada. O preenchimento zero não é representado na conversão de cadeia (por exemplo, '2000-01-01' é 'primeiro de janeiro de dois mil' como seria de esperar). - Você pode presumir que as datas sempre serão válidas (no dia 30 de fevereiro, no dia 1 de Smarch) e que o valor do ano será positivo (sem datas BC), mas a data poderá estar distante no futuro ("nos
doisanos nove mil..."). - Você deve retornar um valor verdadeiro ou falso, não necessariamente um booleano
True
ouFalse
. Se você fizer isso em JavaScript e querem voltar'0'
e0
isso é bom. Claro, se você quiser retornar um booleano, sinta-se à vontade. - As brechas padrão são proibidas.
- Isto é
code-golf
Mais exemplos de datas alfabéticas
- 2066-01-02 (segundo de janeiro de dois mil e sessenta e seis)
- 1000-04-08 (oitavo de abril, mil)
- 6000-08-01 (primeiro de agosto, seis mil)
Mais exemplos de datas não alfabéticas
- 1066-01-02 (segundo de janeiro, mil e sessenta e seis)
- 1000-04-07 (sétimo de abril, mil)
- 8000-08-01 (oito de agosto, oito mil)
Respostas:
05AB1E ,
666258 bytesExperimente on-line ou verifique todos os exemplos mencionados no desafio .
Explicação:
Consulte esta minha dica do 05AB1E (seção Como compactar listas inteiras? ) Para entender por que
•88ΛηΣλšëÇñ0é≠>sîä&ζp°Lć®-αÅ®`•21в
é[7,3,7,0,7,7,7,0,13,10,10,0,4,12,17,6,4,17,15,2,9,17,2,19,17,6,4,17,15,2,9,19,19,19,19,19,19,19,19,19,19,17,17,11,20,18,5,5,16,14,1,8]
eŽqT32в
é[12,31,9]
.Explicação geral adicional:
A função de classificação irá classificar os três tipos (dia, mês, ano), ao mesmo tempo, onde vamos retornar um valor truthy somente se
M < D < Y
(onde estesD
,M
eY
são os valores que já recuperados a partir das listas comprimido).Por que essas três listas mencionadas acima? Se colocarmos todas as palavras em ordem, categorizadas por tipo, teremos a seguinte ordem:
Se analisarmos cada tipo individualmente e sua ordem original (mil, dois mil etc. por anos; janeiro, fevereiro etc. por meses; e primeiro, segundo etc. por dias), os números de classificação mencionados acima serão nestas ordens:
fonte
JavaScript (ES6), 101 bytes
Guardado 4 bytes graças a @Shaggy
Retorna ou .0 1
Experimente online! ou Teste todas as datas! (inclui algumas entradas inválidas)
Quão?
Cada mês, cada dia e cada ano são mapeados para um ID em ( , e respectivamente), de acordo com a tabela a seguir. Depois testamos se temos e .[0..10] M D Y M<D D<Y
A última parte da cadeia de pesquisa para as IDs dia é ligeiramente compactado usando
${6e12-12}
, que se expande para5999999999988
(19 ° a 31 r ).fonte
m=
foi, é claro, completamente inútil. Obrigado. :)