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номер може потребувати відповідного коригування для інших варіантів культури.