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