PowerShell v3 +, 99 95 bayt
Kaba kuvvet yaklaşımı -
param($y)(1..12|%{$m=$_;2,3,5,7,11,13,17,19,23,29,31|?{(date "$m-$_-$y").DayofWeek-eq3}}).Count
Girişini Alır $y
gelen, döngüler 1
için 12
içine geçici olarak ay, mağazalar $m
, sonra gelen her asal üzerinde döngüler 2
için 31
. Bunların her biri için, o Get-Date
günün belirli bir kısmını inşa ediyoruz , sonra sadece DayOfWeek
-eq
ual olanları seçiyoruz 3
(yani Çarşamba). Bir diziyi formüle etmek için hepsinin bir parens içinde olmasını sağlar ve bunları alır .Count
.
Alternatif olarak, matematiksel yaklaşım -
PowerShell v3 +, 105 bayt
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)
Kaba kuvvet yaklaşımından daha uzun bir saç olmak için rüzgâr alıyor, ancak başkalarına faydalı olabileceğinden onu buraya dahil ediyorum.
Yine $y
yıl olarak girdi alıyor . Bu kez, yılın ilk gününe göre kesinlikle matematik işlemleri gerçekleştiriyoruz. Öncelikle haftanın hangi gününü hesaplıyoruz ve $a
daha sonra kullanmak üzere saklıyoruz. Bu bize ilk dizine endekslenir, bu da bize genellikle doğru olan sayıyı verir. Potansiyel bir artık yıl olup olmadığına, Pazar mı, salı, çarşamba mı yoksa perşembe mi olduğuna ve yılın ne olduğuna bağlı olarak ikinci bir endeksi eklemek zorundayız.
Bu, aşağıdaki gözlemlere dayanmaktadır. İlk sütun 1 Ocak haftanın günü, ikincisi ise normal çıktı. Yıl, orta sayılardan biri değilse, o zaman bunun yerine parenlerdeki sayıdır. Son sütun% 5 endekslemenin nasıl çalıştığını açıklar.
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
Not: Bu varsayımların en-us
her ikisi de, kültür / tarih bilgileri için geçerli PowerShell ayarıdır. Tarih formatlaması ve DayOfWeek
sayının diğer kültür varyantları için uygun şekilde ayarlanması gerekebilir.