O dia da semana e o mês do ano parecem receber muita atenção, mas ninguém parece se importar com a semana do ano. Acredito que é hora de mudar isso, portanto, seu trabalho é escrever um programa ou função que, quando determinada data, gera um número inteiro entre 1 e 53, correspondente à semana atual do ano.
Para os propósitos deste desafio, diremos que o primeiro domingo do ano marca o início do ano; portanto, o único caso em que 1º de janeiro é considerado a semana 1 é quando cai em um domingo.
- A entrada pode ser qualquer formato de data que não inclua explicitamente o número da semana (basta especificar o formato na sua resposta) para datas entre
1JAN1900
e31DEC2100
. - A saída é um número inteiro entre 1 e 53
- Você pode usar qualquer método padrão para fornecer entrada / saída.
Casos de teste
17MAY2017 -> 20
3JAN2013 -> 53
1JAN2017 -> 1
17MAY1901 -> 19
31DEC2100 -> 52
7JUL2015 -> 27
- Isso é código-golfe, portanto todas as regras padrão de golfe se aplicam e o código mais curto (em bytes) vence.
07/07/2015
)? Pode7JUL2015
ser07JUL2015
?7/7/2015
,2015-07-07
também são válidos.%U
: Como aponta o @J_Lard, é preciso ter cuidado se a semana 0 é a semana 52 ou 53 do ano anterior. É a semana 53 em 2001, 2007, 2013, 2018, 2024, 2029 e se repete em um ciclo de 28 anos. Outros anos é a semana 52.Respostas:
Ohm ,
1233 bytesEDIT : Corrigidos os casos de borda para "% U".
Assume que a entrada pode ser um carimbo de data / hora. Explicação para vir.
Experimente online!
fonte
MATL , 50 bytes
Obrigado a @Neil e @NickClifford por apontarem um erro, agora corrigido
Experimente online!Ou verifique todos os casos de teste .
Explicação
Isso usa as três funções de conversão de data / hora que existem no MATL:
XO
: converte data e hora em formato de string;YO
: converte data e hora em número de série;ZO
: converte data e hora em vetor de componentes.Determinar se a semana "0" deve se tornar 52 ou 53 foi caro, porque o MATL não pode definir funções que podem ser chamadas para reutilizar a
8XO!s310=s
peça. Reutilização por meio de loop com uma ramificação economiza apenas um byte e complica a explicação, provavelmente não vale a pena.Além disso, pode-se obter algo inserindo a data como uma matriz [ano, mês, dia]; mas eu não usaria as três funções de data :-)
Considere a entrada
'17MAY2017'
como um exemplo.fonte
%U
, mas eu só quero ter certeza.JavaScript (ES6),
8280 bytesToma entrada como
(year,month,day)
.fonte
JavaScript (Firefox 34+), 70 bytes
Funciona localizando o primeiro dia da semana que contém a data especificada e, em seguida, localizando o número da semana desse dia (que nunca é zero).
fonte
with
. Sempre +1 parawith
!Python 2,
7064 bytesEntrada =>
(year,month,day)
-6 bytes, graças a @ovs
fonte
JavaScript (somente Firefox), 77 bytes
Toma data como string: ie
Jan 1, 2017
fonte
PHP, 125 bytes
Experimente online!
PHP, 28 bytes
Versão para segunda-feira em vez de domingo
Experimente online!
fonte
C #,
138123121 bytesAcontece que há um construído para isso, embora seja bastante grande ...
fonte
Powershell, 260 + 8 = 268 bytes
+8 bytes por causa do
-DateTime
bandeiraAceita argumento como
"day month year"
formato.Não é especialista em PowerShell, não pode jogar golfe
Caso de teste
fonte