Ваша задача - вывести одно число; количество недель ISO, в которые пересекается данный диапазон дат. Процитирую Википедию:, An average year is exactly 52.1775 weeks long
но это не о среднем.
Ввод состоит из двух разделенных пробелами дат ISO:
0047-12-24 2013-06-01
Дата окончания никогда не предшествует дате начала. Мы будем использовать экстраполированный григорианский календарь для простоты.
Тестовые случаи:
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)
Ваше решение должно обрабатывать даты между 0001-01-01
и 9999-12-31
.
Weeks start with Monday.
Ответы:
Рубин,
898886 байтОчень примитивное решение: учитывая первую дату
a
и вторую датуb
, приращениеa
, проверьте, не понедельник ли это (если так, мы «перенесли» на новую неделю), и остановитесь один разa
,b
.Принимает данные в точном формате, указанном в вопросе: одна строка через пробел. (То, как он анализирует входные данные, является причудливым: он использует оператор "splat" в Ruby
*
. Этот оператор "расширяет" массив или перечисляет его, поэтомуTime.gm *[2013, 06, 01]
становитсяTime.gm 2013, 06, 01
.)Импортировано из комментария обсуждения:
Просто чтобы избежать путаницы в будущем с правильной обработкой границ года - согласно Википедии , все недели всегда начинаются в понедельник и заканчиваются в воскресенье.
Для некоторых более причудливых уловок все они эквивалентны:
источник
a==b
наa<b
?VBA, 125 байт
Ожидается 2 входа функции в виде строк
Уверен, это можно сыграть в гольф. Это происходит циклически, хотя каждый день между двумя датами и увеличивает счетчик каждый раз, когда изменяется дата ISO.
DatePart("ww",f+i,2,2)
это номер недели ISO в VBA, означает первые 2Monday (complies with ISO standard 8601, section 3.17)
. тогда второе 2 означаетWeek that has at least four days in the new year (complies with ISO standard 8601, section 3.17)
140 байт с одним входом
источник
R, 76 байт
После разговора с @Doorknob это, наконец, так же просто, как считать понедельники.
seq
Позволяет создать вектор дат (каждого дня между двумя датами) и преобразовать strftime в «номер дня в неделе», теперь считает количество раз, равное 1, чтобы получить количество раз, которое вы изменили неделю, и добавить 1 к принять во внимание предыдущую неделю.Другой подход зацикливания:
R 85 байт
источник
Mathematica
135 79 96 8474 байтаВ соответствии с предложением @ Doorknob, это
генерирует все даты в диапазоне
считает количество понедельников (
ISOWeekDay
== "1") вDateRange
(исключаяd
), идобавляет
1
к общему.источник