PowerShell v3 +, 99 95 byte
Pendekatan kekerasan -
param($y)(1..12|%{$m=$_;2,3,5,7,11,13,17,19,23,29,31|?{(date "$m-$_-$y").DayofWeek-eq3}}).Count
Mengambil input $y
, loop dari 1
ke 12
, menyimpan bulan sementara ke dalam $m
, kemudian loop setiap prime dari 2
ke 31
. Untuk masing-masing dari itu, kami membuat a Get-Date
dari hari itu, lalu memilih hanya mereka yang DayOfWeek
-eq
ual ke 3
(yaitu, Rabu). Meringkas bahwa semua dalam parens untuk merumuskan array, dan mengambilnya .Count
.
Atau, pendekatan matematika -
PowerShell v3 +, 105 byte
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)
Akhirnya menjadi hanya rambut lebih panjang dari pendekatan brute force, tapi saya memasukkannya di sini karena mungkin bermanfaat bagi orang lain.
Sekali lagi menerima input $y
sebagai tahun. Kali ini kami melakukan operasi matematika ketat berdasarkan pada hari pertama tahun ini. Kami pertama menghitung hari apa dalam minggu itu, dan menyimpannya $a
untuk digunakan nanti. Itu indeks ke dalam array pertama, yang memberi kita nomor yang biasanya benar. Kita harus menambahkan bahwa indeks kedua berdasarkan apakah itu tahun kabisat potensial, apakah itu hari Minggu, Selasa, Rabu, atau Kamis, dan berdasarkan tahun berapa itu.
Ini berdasarkan pengamatan berikut. Kolom pertama adalah hari apa pada minggu 1 Januari, yang kedua adalah output biasa. Kecuali jika tahun adalah salah satu angka tengah, maka itu adalah angka di parens. Kolom terakhir menjelaskan cara kerja pengindeksan% 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
Catatan: Kedua asumsi ini en-us
adalah pengaturan PowerShell saat ini untuk informasi budaya / tanggal. Pemformatan dan DayOfWeek
nomor tanggal mungkin perlu disesuaikan untuk varian budaya lainnya.