Sur mon site Web, les utilisateurs saisissent leur date de naissance dans le style xx.xx.xx
- trois nombres à deux chiffres séparés par des points. Malheureusement, j'ai oublié de dire aux utilisateurs quel format utiliser. Tout ce que je sais, c'est qu'une section est utilisée pour le mois, une pour la date et une pour l'année. L'année est définitivement au 20ème siècle (1900-1999), donc le format 31.05.75
signifie 31 May 1975
. En outre, je suppose que tout le monde utilise le calendrier grégorien ou julien.
Maintenant, je veux parcourir ma base de données pour nettoyer le gâchis. J'aimerais commencer par traiter avec les utilisateurs dont les dates sont les plus ambiguës, c'est-à-dire celles où la plage de dates possibles est la plus grande.
Par exemple, la date 08.27.53
signifie 27 August 1953
dans le calendrier grégorien ou julien. La date dans le calendrier julien est 13 jours plus tard, donc la plage est juste 13 days
.
En revanche, la notation 01.05.12
peut faire référence à de nombreuses dates possibles. Le premier est 12 May 1901 (Gregorian)
le dernier 1 May 1912 (Julian)
. La plage est 4020 days
.
Règles
- L'entrée est une chaîne au format
xx.xx.xx
, où chaque champ est composé de deux chiffres et complété par un zéro. - La sortie est le nombre de jours dans la plage.
- Vous pouvez supposer que l'entrée sera toujours une date valide.
- Vous ne pouvez utiliser aucune fonction de date ou de calendrier intégrée.
- Le code le plus court (en octets) gagne.
Cas de test
01.00.31
=>12
29.00.02
=>0
(La seule possibilité est29 February 1900 (Julian)
)04.30.00
=>13
06.12.15
=>3291
5, May 1975
censé l'être31st
? De plus, devons-nous tenir compte des années bissextiles?Réponses:
Pyth, 118 octets
Essayez-le en ligne: démonstration ou suite de tests .
Connaissance nécessaire des calendriers julien et grégorien
Le calendrier julien et grégorien sont assez similaires. Chaque calendrier divise une année en 12 mois, chacun contenant de 28 à 31 jours. Les jours exacts d'un mois sont
[31, 28/29 (depends on leap year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
. La seule différence entre les calendriers est leur définition d'une année bissextile. Dans le calendrier julien, toute année divisible par 4 est une année bissextile. Le calendrier grégorien est un peu plus spécifique. Toute année divisible par 4 est une année bissextile, sauf l'année divisible par 100 et non divisible par 400.Ainsi, au 20e siècle, une seule année est différente. L'année 1900, qui est une année bissextile dans le calendrier julien, mais pas une année bissextile dans le calendrier grégorien. Donc, la seule date qui existe dans un calendrier mais pas dans l'autre calendrier est le jour
29.02.1900
.En raison de la définition différente de l'année bissextile, il y a une différence entre une date dans le calendrier julien et le calendrier grégorien. Différence de 12 jours pour une date antérieure au
29.02.1900
, et de 13 jours pour les dates postérieures au29.02.1900
.Pseudo-code simplifié
Explication détaillée du code
La première partie
M++28@j15973358 4G&qG2!%H4
définit une fonctiong(G,H)
, qui calcule le nombre de jours du moisG
d'une annéeH
dans le calendrier julien.Et la partie suivante est juste la boucle for et les ifs. Notez que j'interprète
N
dans le format(month, year, day)
. Tout simplement parce qu'il enregistre quelques octets.la source
Perl 5 , 294 octets
Essayez-le en ligne!
298 octets lorsque les espaces, les nouvelles lignes et les commentaires sont supprimés.
Les lignes 1 à 4 initialisent (si ce n'est pas fait) les hachages
%g
et%j
où les valeurs sont les nombres de jours grégorien et julien en conséquence, du 1er janvier 1900 au 31 décembre 1999.La ligne 5 met la date d'entrée en $ 1, $ 2 et $ 3.
La ligne 9 répertorie les six permutations de ces trois numéros d'entrée.
La ligne 8 convertit ces six en deux nombres chacun, les nombres grégorien et julien, mais uniquement ceux qui sont des dates valides.
La ligne 7 s'en assure, elle filtre les numéros de jour inexistants.
La ligne 6 trie la liste des numéros de date valides du plus petit au plus grand.
La ligne 10 renvoie alors la différence entre le dernier et le premier (max et min), qui était la plage souhaitée.
la source