PowerShell v3 +, 99 95 bajtów
Podejście brutalnej siły -
param($y)(1..12|%{$m=$_;2,3,5,7,11,13,17,19,23,29,31|?{(date "$m-$_-$y").DayofWeek-eq3}}).Count
Pobiera dane wejściowe $y
, pętle od 1
do 12
, tymczasowo zapisuje miesiąc $m
, a następnie zapętla każdą liczbę pierwszą od 2
do 31
. Dla każdego z nich konstruujemy jeden Get-Date
z tego konkretnego dnia, a następnie wybieramy tylko te z DayOfWeek
-eq
ual do 3
(tj. Środa). Hermetyzuje to wszystko w parens, aby sformułować tablicę, i bierze .Count
je.
Alternatywnie podejście matematyczne -
PowerShell v3 +, 105 bajtów
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)
Skończyło się na tym, że włosy były tylko dłuższe niż podejście brutalnej siły, ale włączam to tutaj, ponieważ może być korzystne dla innych.
Ponownie przyjmuje dane $y
jako rok. Tym razem wykonujemy operacje matematyczne ściśle w oparciu o pierwszy dzień roku. Najpierw obliczamy, który to dzień tygodnia, i zapamiętujemy go $a
do wykorzystania później. To indeksuje do pierwszej tablicy, która daje nam zwykle prawidłową liczbę. Musimy dodać do tego drugi indeks oparty na tym, czy jest to potencjalny rok przestępny, czy jest to niedziela, wtorek, środa lub czwartek, i na podstawie tego, jaki jest rok.
Jest to oparte na poniższej obserwacji. Pierwsza kolumna to dzień tygodnia 1 stycznia, druga to zwykłe wyjście. O ile rok nie jest jedną ze środkowych liczb, to jest to liczba w parenach. Ostatnia kolumna opisuje działanie indeksowania% 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
Uwaga: w obu przypadkach założono, że en-us
jest to bieżące ustawienie programu PowerShell dla informacji o kulturze / dacie. Formatowanie daty i DayOfWeek
liczby mogą wymagać odpowiedniego dostosowania w przypadku innych wariantów kultury.