Twoim zadaniem jest wyprowadzenie jednego numeru; liczba tygodni ISO, które przecina dany zakres dat. Cytując Wikipedię: An average year is exactly 52.1775 weeks long
ale nie chodzi tu o średnią.
Dane wejściowe składają się z dwóch rozdzielonych spacjami dat ISO:
0047-12-24 2013-06-01
Data końcowa nigdy nie jest wcześniejsza niż data początkowa. Dla uproszczenia użyjemy ekstrapolowanego kalendarza gregoriańskiego.
Przypadki testowe:
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)
Twoje rozwiązanie powinno obsługiwać daty od 0001-01-01
i 9999-12-31
.
Weeks start with Monday.
Odpowiedzi:
Rubin,
898886 bajtówTo bardzo prymitywne rozwiązanie: biorąc pod uwagę pierwszą datę
a
i drugą datęb
, przyrosta
, sprawdź, czy jest to poniedziałek (jeśli tak, to mamy „przeniesiona” do nowego tygodnia), a kończy się z chwiląa
jestb
.Pobiera dane wejściowe w dokładnym formacie określonym w pytaniu: pojedynczy ciąg oddzielony spacjami. (Sposób, w jaki analizuje dane wejściowe, jest fantazyjny: używa operatora Ruby „splat”
*
. Ten operator „rozszerza” tablicę lub wylicza, więcTime.gm *[2013, 06, 01]
staje sięTime.gm 2013, 06, 01
.)Zaimportowane z dyskusji na komentarzu:
Aby uniknąć przyszłego pomyłki z tym, czy poprawnie obsługuje to granice roku - według Wikipedii wszystkie tygodnie zaczynają się zawsze w poniedziałek, a kończą w niedzielę.
W przypadku niektórych bardziej fantazyjnych sztuczek wszystkie są równoważne:
źródło
a==b
przeza<b
?VBA, 125 bajtów
Oczekiwane są 2 wejścia funkcji jako ciągi
Jestem pewien, że można grać w golfa. To zapętla się codziennie między 2 datami i zwiększa licznik za każdym razem, gdy zmienia się data ISO.
DatePart("ww",f+i,2,2)
to numer tygodnia ISO w VBA, który oznacza 2 pierwszeMonday (complies with ISO standard 8601, section 3.17)
. wtedy drugie 2 oznaczaWeek that has at least four days in the new year (complies with ISO standard 8601, section 3.17)
140 bajtów z pojedynczym wejściem
źródło
R, 76 bajtów
Po rozmowie z @Doorknob jest to w końcu tak proste, jak liczenie poniedziałków.
seq
zezwól na utworzenie wektora dat (każdego dnia między dwiema datami) i strftime przekształć go w „numer dnia w tygodniu”, teraz zlicza czasy 1, aby uzyskać liczbę zmian tygodnia i dodaj 1 do weź pod uwagę poprzedni tydzień.Kolejne podejście do zapętlania:
R, 85 bajtów
źródło
Mathematica
135 79 96 8474 bajtyJest to zgodne z sugestią @ Doorknob
generuje wszystkie daty w zakresie
zlicza liczbę poniedziałków (
ISOWeekDay
== „1”) wDateRange
(z wyłączeniemd
), idodaje
1
do całości.źródło