PowerShell v3 +, 99 95 bytes
Abordagem da força bruta -
param($y)(1..12|%{$m=$_;2,3,5,7,11,13,17,19,23,29,31|?{(date "$m-$_-$y").DayofWeek-eq3}}).Count
Pega entrada $y
, faz um loop de 1
para 12
, armazena o mês temporariamente em e $m
, em seguida, faz um loop em todos os primos de 2
para 31
. Para cada um deles, construímos um Get-Date
dia específico e, em seguida, selecionamos apenas aqueles com DayOfWeek
-eq
ual para 3
(ou seja, quarta-feira). Encapsula que tudo em um parens para formular uma matriz e leva a .Count
mesma.
Alternativamente, abordagem matemática -
PowerShell v3 +, 105 bytes
param($y)(16,19,18,20,16,18,19)[($a=(date "1-1-$y").DayOfWeek)]+(1,-3,0,1,2)[$y%5]*($a-in0,2,3,4)*!($y%4)
Acabará sendo apenas um fio de cabelo mais longo do que a abordagem da força bruta, mas eu o incluo aqui, pois pode ser benéfico para os outros.
Mais uma vez assume a entrada $y
como o ano. Desta vez, estamos realizando estritamente operações matemáticas com base no primeiro dia do ano. Primeiro calculamos o dia da semana e os armazenamos $a
para uso posterior. Isso indexa a primeira matriz, o que nos dá o número normalmente correto. Temos que acrescentar a isso um segundo índice, com base no potencial ano bissexto, seja domingo, terça, quarta ou quinta-feira, e com base no que é o ano.
Isso é baseado na seguinte observação. A primeira coluna é o dia da semana em 1º de janeiro e a segunda é a saída usual. A menos que o ano seja um dos números do meio, é o número em parênteses. A coluna final descreve como a indexação% 5 funciona.
Jan-1 -> # ... Except if $y= (then it's this number) | $y % 5 =
Sun -> 16 ... 1928 1956 1984 etc. (17) | 3
Mon -> 19
Tue -> 18 ... 1924 1952 1980 etc. (20) | 4
Wed -> 20 ... 1936 1964 1992 etc. (17) | 1
Thur -> 16 ... 1920 1948 1976 etc. (17) | 0
Fri -> 18
Sat -> 19
Nota: Ambos assumem que en-us
é a configuração atual do PowerShell para informações de cultura / data. A formatação e o DayOfWeek
número da data podem precisar ser ajustados de acordo com outras variantes de cultura.