PowerShell v3 +, 99 95 байт
Метод грубой силы -
param($y)(1..12|%{$m=$_;2,3,5,7,11,13,17,19,23,29,31|?{(date "$m-$_-$y").DayofWeek-eq3}}).Count
Принимает входные данные $y
, циклы от 1
до 12
, временно сохраняет месяц в $m
, а затем циклы по каждому простому числу от 2
до 31
. Для каждого из них мы строим Get-Date
определенный день, а затем выбираем только те, которые имеют DayOfWeek
-eq
значение 3
(т.е. среда). Инкапсулирует это все в паренсе, чтобы сформулировать массив, и берет .Count
его.
Альтернативно, математический подход -
PowerShell v3 +, 105 байт
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)
Получается, что это всего лишь волосы длиннее, чем подход грубой силы, но я включил это здесь, поскольку это может быть полезно для других.
Снова принимает данные $y
как год. На этот раз мы выполняем строго математические операции в первый день года. Сначала мы вычисляем, какой это день недели, и сохраняем его $a
для последующего использования. Это индексирует в первый массив, который возвращает нам число, которое обычно является правильным. Мы должны добавить к этому второй индекс, основанный на том, является ли это потенциальным високосным годом, будь то воскресенье, вторник, среда или четверг, и на основе того, какой это год.
Это основано на следующем наблюдении. Первый столбец - это день недели 1 января, второй - обычный вывод. Если год не является одним из средних чисел, то вместо этого это число в скобках. Последний столбец описывает, как работает индексирование% 5.
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
Примечание. Оба предположения en-us
являются текущими настройками PowerShell для информации о культуре / дате. Форматирование даты и DayOfWeek
число, возможно, должны быть скорректированы соответственно для других вариантов культуры.