Sua tarefa é produzir um único número; o número de semanas ISO em que um determinado período cruza. Para citar a Wikipedia:, An average year is exactly 52.1775 weeks long
mas não se trata da média.
A entrada consiste em duas datas ISO separadas por espaço:
0047-12-24 2013-06-01
A data final nunca é anterior à data de início. Usaremos o calendário gregoriano extrapolado para simplificar.
Casos de teste:
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)
Sua solução deve lidar com datas entre 0001-01-01
e 9999-12-31
.
Weeks start with Monday.
Respostas:
Ruby,
898886 bytesUma solução muito primitivo: dada a primeira data
a
ea segunda datab
, incrementoa
, cheque se é uma segunda-feira (em caso afirmativo, que já "virou" para uma nova semana), e parar uma vez quea
éb
.Recebe a entrada no formato exato especificado na pergunta: uma única sequência separada por espaço. (A maneira como analisa a entrada é sofisticada: usa o operador "splat" de Ruby
*
. Este operador "expande" uma matriz ou um número enumerável,Time.gm *[2013, 06, 01]
tornando - se assimTime.gm 2013, 06, 01
.)Importado de uma discussão de comentário:
Apenas para evitar futuras confusões sobre se isso lida corretamente com os limites do ano - acordo com a Wikipedia , todas as semanas sempre começam na segunda-feira e terminam no domingo.
Para alguns truques mais sofisticados, todos são equivalentes:
fonte
a==b
pora<b
?VBA, 125 bytes
Esperando 2 entradas de função como strings
Certeza que isso pode ser jogado no golfe. Isso ocorre todos os dias entre as 2 datas e incrementa o contador toda vez que a data ISO é alterada.
DatePart("ww",f+i,2,2)
é o número da semana ISO no VBA, os 2 primeiros meiosMonday (complies with ISO standard 8601, section 3.17)
. então o segundo 2 significaWeek that has at least four days in the new year (complies with ISO standard 8601, section 3.17)
140 bytes com entrada única
fonte
R, 76 bytes
Depois da conversa com o @Doorknob, é finalmente tão fácil quanto contar as segundas-feiras.
seq
permitir criar um vetor de datas (de cada dia entre duas datas) e strftime transformá-lo no 'número do dia da semana', agora conta as vezes que é 1 para obter o número de vezes que você mudou a semana e adicionar 1 a leve em conta a semana anterior.Outra abordagem em loop:
R, 85 bytes
fonte
Mathematica
135 79 96 8474 bytesConsistente com a sugestão de @ Doorknob, este
gera todas as datas no intervalo
conta o número de segundas-feiras (
ISOWeekDay
== "1") noDateRange
(excluindod
) eadiciona
1
ao total.fonte