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число, возможно, должны быть скорректированы соответственно для других вариантов культуры.