Convertissez le format de date courte en date longue en anglais en aussi peu d'octets que possible.
Contribution
L'entrée sera sous la forme d'une chaîne de format yyyy-mm-dd
, avec un remplissage nul en option pour toutes les valeurs. Vous pouvez supposer que c'est syntaxiquement correct, mais pas nécessairement une date valide. Les valeurs d'année négatives n'ont pas besoin d'être prises en charge.
Production
Vous devez convertir la date au format anglais de date longue (par exemple 14th February 2017
). Le remplissage nul ici n'est pas autorisé.
Si la date n'est pas valide (par exemple 2011-02-29
), cela doit être reconnu d'une manière ou d'une autre. Le lancement d'une exception est autorisé.
Plus d'exemples peuvent être vus ci-dessous.
Cas de test
"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
la source
la source
03rd
au lieu de3rd
2016-2-29
?Réponses:
PostgreSQL, 61 caractères
Instruction préparée, prend l'entrée comme paramètre.
Exemple d'exécution:
la source
Python 3.6,
137129 octetsEssayez-le en ligne!
la source
%-d
est la version sans rembourrage%d
que vous pouvez utiliser dans votre mise en forme de chaîne au lieu de{g[2]}
. En outre,12
devrait devenir12th
non12nd
(les nombres de 10 à 19 ne suivent pas les mêmes règles que 1-9 et 20+)f
cordesJavaScript (ES6),
142140 octetsSorties
NaNth Invalid Date
pour des dates non valides.Le code des nombres ordinaux a été adapté de cette réponse .
Afficher l'extrait de code
la source
Python 3.6 , 154 octets
Essayez-le en ligne! (Définissez le flux d'entrée, puis exécutez.)
Merci aux bonnes suggestions des commentateurs ci-dessous.
la source
int(x)
etfor
dans votre liste de composition.(('st','nd','rd')[b%10-1]if b<4 or 20<b<24 else'th')
au lieu de votre conditionnelle actuelle pour -3 octets.(3<b<21)+(23<b<31)
pour -1 octet. Essayez-le en ligne!PHP, 87 octets
Exécuter en tant que pipe avec
-F
ou tester en ligne . Imprime toujours une année à 4 chiffres; échoue pendant des années> 9999.pas de contrôle de validité, 35 octets:
la source
Bash + coreutils,
11578Essayez-le en ligne .
la source
f=thstndrd; $d"${f:t/10-1?t%10<4?t%10*2:0:0:2} %B %Y"
.C #,
147143 octets4 octets enregistrés grâce à @The_Lone_Devil.
la source
t.Day
pard
une sauvegarde de 4 octets?mIRC version 7.49 (197 octets)
la source
Ruby ,
104103102 + 8 =112111110 octetsUtilise
-rdate -p
les indicateurs de programme.-1 octet de manatwork.
Essayez-le en ligne!
la source
d<4||d>20?"..stndrd"[d%10*2,2]:"th"
26
va essayer d'accéder aux index12..13
dans la chaîne de recherche, qui est hors limites, et revient doncnil
. Ainsi, l'utilisation du ternaire le rendd<4||d>20?"..stndrd"[d%10*2,2]||"th":"th"
, qui est plus long de 2 octets."th"
→:th
.C # (.NET Core) ,
167197 octetsEssayez-le en ligne!
+30 octets pour
using System;
DateTime.Parse()
la source
!
for -1 byte. Et vous pouvez changer la&&
à&
de -3 octets. De plus, comme vous l'utilisezs.Day
7 fois, il enregistre quelques octets pour créer une valeur temporaire pour lui: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 qualifier entièrement l'DateTime
objet.DateTime.MinValue
est1-1-1
donc je ne pense pas que vous avez besoin que l' enregistrement. Ce qui rendrait également mon point précédent non pertinent.DateTime
et analyser en dehors de la méthode n'est pas acceptable, vous devez faire tout le travail à l'intérieur de la méthode. Ou ajoutez une méthode supplémentaire pour diviser le travail.Excel, 212 octets
Si vous le divisez en morceaux à chaque esperluette, vous obtenez ces pièces:
ABS()
extrait le numéro du jour des deux derniers caractères de la chaîne. Comme cela peut inclure un trait d'union, leABS
convertit en positif.IF((ABS-12)<2,"th",SWITCH())
ajoute l'ordinal. Le-12
bit est parce que 11, 12 et 13 ne suivent pas la règle normale et ils obtiennent tousth
au lieu dest
,nd
etrd
. Cela corrige cela.SWITCH
fonction est uniquement disponible dans Excel 2016 et versions ultérieures. ( Source ) Il est plus court queCHOOSE
dans ce cas car il peut renvoyer une valeur si aucune correspondance n'est trouvée alors qu'ilCHOOSE
nécessite une entrée numérique et doit avoir un retour correspondant pour chaque valeur possible.TEXT(MID()*30," mmmm ")
extrait le nom du mois.MID()
extrait le numéro du mois sous forme de chaîne et multiplier par 30 renvoie un nombre. Excel voit ce nombre comme une date (1900-01-30, 1900-02-29, 1900-03-30, etc.) et leTEXT()
formate comme un nom de mois avec un espace aux deux extrémités. 28 et 29 auraient également fonctionné mais 30 semble "plus joli".LEFT()
extrait le numéro de l'année.Maintenant, étant donné tout cela, il aurait été beaucoup plus facile si les cas de test se trouvaient tous dans une plage de dates qu'Excel peut gérer comme une date réelle: 1900-01-01 à 9999-12-31. Le gros avantage est que la date entière est formatée à la fois. Cette solution est de 133 octets :
L'autre grand obstacle devait inclure l'ordinal. Sans cela, la solution ne fait que 34 octets :
la source
Swift 3: 298 octets
Essayez-le en ligne!
la source
# Language, N bytes
. Ce serait bien si vous pouviez en ajouter un aussi.T-SQL, 194 octets
L'entrée se fait via la colonne de texte i dans le tableau préexistant t , selon nos normes IO .
Fonctionne pour les dates du 1er janvier 0001 au 31 décembre 9999. L'année est sortie avec au moins 3 chiffres (par exemple 150AD).
Des dates non valides entraîneront l'erreur laide suivante:
Différents paramètres de langue / culture par défaut peuvent modifier ce comportement. Si vous voulez une sortie d'erreur légèrement plus gracieuse (NULL), ajoutez 4 octets en changeant
PARSE()
enTRY_PARSE()
.Format et explication:
Le
DATE
type de données introduit dans SQL 2008 permet une plage beaucoup plus large queDATETIME
, du 1er janvier 0001 au 31 décembre 9999.Certaines dates très précoces peuvent être mal analysées avec mes paramètres de localité aux États-Unis (le "01-02-03" devient le "2 janvier 2003"), j'ai donc ajouté quelques zéros supplémentaires pour qu'il sache que la première valeur est l'année.
Après cela, c'est juste une
CASE
déclaration désordonnée pour ajouter le suffixe ordinal à la journée. De façon ennuyeuse, laFORMAT
commande SQL n'a aucun moyen de le faire automatiquement.la source
q / kdb + 210 octets, non concurrents
Solution:
Exemples:
Explication:
C'est un défi horrible car il n'y a pas de formatage de date, donc je dois créer des mois à partir de zéro (95 octets) ainsi que générer le suffixe.
La solution non golfée est ci-dessous, divise essentiellement la chaîne d'entrée, puis se réunit à nouveau après avoir ajouté le suffixe et changé le mois.
Remarques:
Les dates en q ne remontent qu'à ~ 1709, donc je n'ai pas de moyen trivial de valider la date, donc c'est une entrée non concurrente ... Le mieux que je puisse faire est de vérifier si le jour est> 31 ou le mois est > 12 et retournez 0.
la source