O ano solar é de 365 dias, 5 horas, 48 minutos, 45 segundos e 138 milissegundos, de acordo com este vídeo . Com o atual calendário gregoriano, as regras para os anos bissextos são as seguintes:
if year is divisible by 400, LEAP YEAR
else if year is divisible by 100, COMMON YEAR
else if year is divisible by 4, LEAP YEAR
else, COMMON YEAR
Infelizmente, esse método é desativado em um dia a cada 3216 anos.
Um método possível de reformar o calendário é a seguinte regra:
if year is divisible by 128, COMMON YEAR
else if year is divisible by 4, LEAP YEAR
else, COMMON YEAR
Isso tem o benefício de não exigir que alteremos nossos calendários novamente por mais 625.000 anos, mais ou menos.
Digamos que o mundo inteiro decida que, a partir de agora, usamos esse sistema a cada quarto ano é um ano bissexto, exceto a cada 128 anos, alterando nossos calendários da seguinte forma:
YEAR GREGORIAN 128-YEAR
2044 LEAP LEAP
2048 LEAP COMMON
2052 LEAP LEAP
...
2096 LEAP LEAP
2100 COMMON LEAP
2104 LEAP LEAP
...
2296 LEAP LEAP
2300 COMMON LEAP
2304 LEAP COMMON
2308 LEAP LEAP
Como isso afetaria nossos algoritmos do dia da semana?
O desafio
- Dada uma data do ano 2000 ao ano 100000, encontre o dia da semana nesse novo calendário.
- Qualquer formato de entrada e saída é permitido, desde que você especifique claramente quais formatos você está usando.
- Este é um código de golfe, então tente tornar suas soluções o mais golfistas possível!
Casos de teste
"28 February 2048" -> "Friday"
"March 1, 2048" -> "Sat"
(2100, 2, 29) -> 0 # 0-indexed with Sunday as 0
"2100-02-29" -> 7 # 1-indexed with Sunday as 7
"28 Feb. 2176" -> "Wednesday"
"1-Mar-2176" -> "Th"
"28/02/100000" -> "F" # DD/MM/YYYYYY
"Feb. 29, 100000" -> 6 # 1-indexed with Sunday as 7
"03/01/100000" -> 1 # MM/DD/YYYYYY and 1-indexed with Sunday as 1
Sugestões e comentários sobre o desafio são bem-vindos. Boa sorte e bom golfe!
Respostas:
C (gcc) , 60 bytes
Experimente online!
Modificação simples do método de Sakamoto . Recebe entrada como argumentos inteiros na ordem
month, day, year
e gera o número do dia (indexado 0 no domingo).fonte
"-bed=pen+mad."
peça faz?char
ainda representa um número, para que você possa fazermod 7
diretamente.Wolfram Language (Mathematica) ,
575553 bytesExperimente online!
Toma três entradas: o ano, o mês e o dia, nessa ordem. Por exemplo, se você salvar a função acima como
fun
,fun[2048,2,28]
informa o dia da semana de 28 de fevereiro de 2048.Como funciona
A fórmula
m=#~Mod~128;6+Mod[(9#-m)/8-6Clip@m,28]
converte o ano em um ano equivalente (um ano exatamente com os mesmos dias da semana) entre 6 dC e 33 dC. Para fazer isso, subtraímos um deslocamento e depois pegamos o ano mod 28; mas a compensação muda a cada 128 anos, e nos anos divisíveis por 128, temos que fazer um ajuste adicional porque o ano equivalente não deve ser um ano bissexto.De qualquer forma, uma vez feito isso, procuramos o mês e o dia nesse ano equivalente usando o built-in
DayName
.fonte
Python 2 , 67 bytes
Experimente online!
int("..."[m])
pode ser substituído porord("-bed=pen+mad."[m])
.fonte
JavaScript,
6559 bytesUsa o método de Sakamoto. Dá0=Sunday, 1=Monday, 2=Tuesday...
-2 bytes graças a Misha Lavrov
-4 bytes graças a Arnauld
fonte
~~y
pode ser mudado paray
. Você não receberá um ano fracionário na entrada, certo? Mas admito que não sou fluente em JavaScript.+y+(y>>2)-(y>>7)
?Na verdade , 37 bytes
Esta é uma porta da modificação do algoritmo de Sakamoto por notjagan , mas com alguns truques baseados em pilha, conforme descrito abaixo. O formato de entrada é
day, year, month
. O formato de saída é0-indexed with Sunday as 0
. Sugestões de golfe são bem-vindas! Experimente online!Explicação
fonte
Geléia ,
32313028 bytesOutra maneira de modificar o algoritmo de Sakamoto por notjagan, mas com um número de base 250 no lugar de
032503514624
(não precisa do extra0
porque o Jelly é indexado em 1). O formato de entrada émonth, year, day
. O formato de saída é0-based with Sunday as 0
. Sugestões de golfe são muito bem-vindas, pois a maneira como os links foram difíceis de organizar e ainda podem ser jogáveis. Experimente online!Edit: -1 byte usando deslocamento de bits em vez de divisão inteira. -1 byte de reorganizar o início e o formato de entrada. -2 bytes graças a Erik the Outgolfer e caird coinheringaahing.
Explicação
fonte