Votre tâche consiste à sortir un seul numéro; le nombre de semaines ISO à l'intersection d'une plage de dates donnée. Pour citer Wikipedia:, An average year is exactly 52.1775 weeks long
mais il ne s'agit pas de la moyenne.
L'entrée se compose de deux dates ISO séparées par des espaces:
0047-12-24 2013-06-01
La date de fin n'est jamais antérieure à la date de début. Nous utiliserons le calendrier grégorien extrapolé pour plus de simplicité.
Cas de test:
Format: input -> output
2015-12-31 2016-01-01 -> 1 (both are within week 53 of 2015)
2016-01-03 2016-01-04 -> 2 (the 3rd is within week 53, and the 4th is in week 1)
2015-12-24 2015-12-24 -> 1 (this single day is of course within a single week)
Votre solution doit gérer les dates entre 0001-01-01
et 9999-12-31
.
Weeks start with Monday.
Réponses:
Rubis,
898886 octetsUne solution très primitive: étant donné la première date
a
et la deuxième dateb
, incrémentera
, vérifier si elle est un lundi (si oui, nous avons « reconduits » à une nouvelle semaine), et arrêter une foisa
estb
.Prend l'entrée au format exact spécifié dans la question: une seule chaîne séparée par des espaces. (La façon dont il analyse l'entrée est fantaisiste: il utilise l'opérateur "splat" de Ruby
*
. Cet opérateur "développe" un tableau ou un énumérable, doncTime.gm *[2013, 06, 01]
devientTime.gm 2013, 06, 01
.)Importé d'une discussion de commentaire:
Juste pour éviter toute confusion future quant à savoir si cela gère correctement les limites de l'année ... selon Wikipedia , toutes les semaines commencent toujours le lundi et se terminent le dimanche.
Pour quelques astuces plus sophistiquées, elles sont toutes équivalentes:
la source
a==b
para<b
?VBA, 125 octets
Attend 2 entrées de fonction comme chaînes
Je suis sûr que cela peut être joué au golf. Ceci est en boucle tous les jours entre les 2 dates et incrémente le compteur chaque fois que la date ISO change.
DatePart("ww",f+i,2,2)
est le numéro de semaine ISO en VBA, les 2 premières moyennesMonday (complies with ISO standard 8601, section 3.17)
. puis deuxième 2 signifieWeek that has at least four days in the new year (complies with ISO standard 8601, section 3.17)
140 octets avec entrée unique
la source
R, 76 octets
Après l'entretien avec @Doorknob, c'est finalement aussi simple que de compter les lundis.
seq
permet de créer un vecteur de dates (de chaque jour entre deux dates) et strftime le transforme en `` numéro du jour de la semaine '', compte maintenant le nombre de fois où il est 1 pour obtenir le nombre de fois où vous avez changé de semaine et ajoutez 1 à prendre en compte la semaine précédente.Une autre approche en boucle:
R, 85 octets
la source
Mathematica
135 79 96 8474 octetsConformément à la suggestion de @ Doorknob, cette
génère toutes les dates de la plage
compte le nombre de lundis (
ISOWeekDay
== "1") dansDateRange
(à l'exclusiond
), etajoute
1
au total.la source