Un autre problème de manipulation de date: P
Tâche
Écrivez un programme ou une fonction qui calcule la différence entre deux dates données par un utilisateur.
Entrée sortie
Semblable à la précédente , les entrées sont deux YYYYMMDD
s, séparées par un espace , une virgule
,
ou un signe moins -
.
Exemple de valeurs d'entrée:
20100101-20010911
20110620-20121223
19000101 20101010
33330101,19960229
00010101 99991231
La sortie est un entier, qui est la différence entre deux dates, en jours.
Par exemple, les 20110101-20100101
rendements des intrants 365
et les 33320229 17000101
rendements 596124
.
Vous pouvez tester les résultats ici ici . (Voir les commentaires de rintaun ci-dessous.) Si deux dates sont identiques, le programme devrait revenir 0
, si la date est valide (voir Score ).
Restriction
Bien sûr, vous ne devez utiliser aucun type de fonction / classe / ... lié à l'horodatage ou à la date, et vous devez utiliser le calendrier grégorien .
But
Si votre code ne respecte pas la restriction, alors score = -∞
.
La valeur par défaut bonus
est 1.
- Si votre code fonctionne quel que soit l'ordre des entrées (par exemple,
20100101,20110101
retourne365
ou-365
)bonus+=1
,. - Si votre code peut gérer l' année 0 ,
bonus+=0.5
. - Si votre code reconnaît un mois non valide (entre 1 ~ 12) / date (entre 1 ~ 31), comme
20109901
ou34720132
, et s'imprimeE
(& termine le programme ou renvoie quelque chose comme0
)bonus+=1
,. - Indépendamment de la règle ci-dessus, si votre code reconnaît des dates non valides, comme
20100230
,20100229
ou20111131
, et s'imprimeE
(& termine le programme ou renvoie quelque chose comme0
)bonus+=1
,. - Indépendamment des deux règles ci-dessus, si votre code reconnaît une chaîne d'entrée non valide, comme
20100101|20100202
ou2010010120100202
, et s'imprimeE
(& termine le programme ou renvoie quelque chose comme0
)bonus+=1
,.
score = floor(-4.2*code.length/bonus)
. Le code avec le score le plus élevé gagne. Si deux codes supérieurs ont le même score, alors les codes avec les gains de bonus les plus élevés. Si deux codes supérieurs ont à la fois le même score et le même bonus, alors les codes avec les votes les plus élevés l'emportent.
(En raison: lorsqu'il y a plus de 5 codes qui ont plus de +1
votes (ou égaux) .)
20040229
. : P365*4 + 2 + 2
= 1464. Merci pour l'information!Réponses:
Perl 5.14, score = -162
-163-181-196-214-167-213-234-p
optionCode
Calcule un numéro de jour julien modifié pour chaque date (en ignorant les ajustements liés à l'époque pour enregistrer la longueur du code) et soustrait les deux. (réf. "Julian Day" sur Wikipedia ).
/r
option sur les substitutions30+($m&1^$m>7)
la durée du mois pour obtenir le bonus de date invalide: la partie donne la durée de n'importe quel mois sauf février; le reste s'ajuste pour février dans une année ordinaire ou bissextileHypothèses
00000101-00010101
devrait donner 366, car 0 est un multiple entier de 400, et donc l'année 0 est une année bissextile.la source
20111300-20119999
retours2717
.PHP, score: -539,1
Code
Non golfé
Remarque
Calcule le nombre de jours en parcourant chaque date valide entre les deux fournies. C'est assez lent sur de plus grandes plages. Je suis sûr que ce n'est pas la meilleure façon de résoudre ce problème, mais je me suis impatienté, et c'est ce que j'ai fini avec. :)
De plus, je sais que le code "non golfé" n'est toujours pas très lisible, mais le réécrire complètement demanderait trop d'efforts.
la source
Ruby 1.9, score: -175
-186-191-199243250260caractèresLe code accepte l'entrée via stdin.
Remarques:
(!x[e]||e*f<1||f>x[e])
condition gère les bonus mois / jour / date invalides.33320229 17000101
résulte en596134
.la source
Python, Score: -478
Solution:
Je n'ai pas de version "non golfée" car c'est ainsi que je l'ai écrite. Je ne l'ai pas testé correctement, donc si vous trouvez un bug - veuillez commenter.
edit: j'espère avoir corrigé un bug signalé dans les commentaires et ajouté le déballage sous la forme de [a, b], [c, d] = [[1,2], [3,4]
la source
E
. ( Pour votre information,0>-1>12
,0>6>12
,0>13>12
retoursFalse
.)x<y<z
comparaison ou qu'il y en a unx if y else z
. J'ai essayé de le réparer.[x,z][y]
qui est plus court quex if y else z
, bien que cela ne fonctionne pas toujours car contrairement à l'expression si ce n'est pas paresseux.PHP, score: -516
caractères:
685676bonus: 5,5
la source
<?
au début pour s'exécuter, sinon il affiche simplement le code.