วันพุธที่สำคัญ


22

วันพุธที่สำคัญ

งานของคุณคือการนับจำนวนวันพุธที่ตรงกับวันสำคัญของเดือนในปีใดปีหนึ่ง ตัวอย่างเช่น7-13-16เป็นวันพุธที่ดี เพื่อความสอดคล้องใช้ปฏิทินเกรโกเรียนสำหรับวันที่ทั้งหมด

อินพุต

ข้อมูลเข้าสู่โปรแกรม / ฟังก์ชั่นของคุณจะเป็นปี (เช่น2016) และยืดหยุ่นได้ ปีจะเป็นจำนวนเต็มระหว่าง1912และ2233รวม

เอาท์พุต

ผลผลิตมีความยืดหยุ่นและควรเป็นจำนวนวันพุธที่สำคัญ (เช่น18)

เกณฑ์การให้คะแนน

นี่คือสั้นที่สุดในหน่วยไบต์!

กรณีทดสอบ

อินพุต -> เอาต์พุต
--------------------
1912 -> 19
1914 -> 16
1984 -> 17
1996 -> 19
2063 -> 19
2150 -> 16
2199 - > 18
2233 -> 18

คำตอบ:


7

MATL , 38 36 34 ไบต์

FT+"@llI$YO]q&:t8XO!s9\~)9#1$ZOZps

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด (ใช้เวลาสองสามวินาที)

คำอธิบาย

FT+     % Input year implicitly. Add [0 1] element-wise. Gives array with input year
        % and next year
"       % For each of those two years
  @     %   Push year
  ll    %   Push 1 twice. This indicates January 1.
  I$YO  %   Convert year, month, day to serial date number
]       % End for each. We now have the serial date number for January 1 of the input
        % year and that of the following year
q       % Subtract 1 to the latter, to yield December 31 of the input year
&:      % Inclusive range between those two numbers. This gives an array of serial date
        % numbers for the whole input year
t       % Push another copy of that array
8XO     % Convert to date string with format 8. This gives weekday as "Mon", "Tue" etc.
        % The result is a 3-column 2D char array, where each row is a day
!s      % Transpose, sum of each column. 'Wed' gives 288 (sum of ASCII codes)
9\~     % 288 gives 0 modulo 9, and is the only weekday to do so. So we compute modulo 9
        % and negate. This gives true for Wednesdays, false for the rest
)       % Apply as logical index into the array of serial date numbers
9#1$ZO  % Array of month numbers corresponding to those serial date numbers
Zp      % Array that contains true for prime numbers, false for the rest
s       % Sum of array. Display implicitly

ฉันเชื่อว่า MATL ไม่สามารถเอาชนะความท้าทายตามวันที่ได้ เราควรสร้าง DATL ซึ่งได้รับการปรับให้เหมาะสมเพื่อจัดการกับความท้าทายตามวันที่
Suever

@Suever ฮ่าฮ่าชื่อที่ดี
Luis Mendo

20

Python 2, 95 93 68 67 ไบต์

lambda y:0x10ea2c8dbb06c5619/5**((y+((y-22)/99-y/2002)*16)%28)%5+16

ขอบคุณ @Josay สำหรับการลงเล่น 1 ไบต์!

ทดสอบบนIdeone


3
คุณสามารถบันทึก 1 ถ่านกับแทน0x10ea2c8dbb06c5619 19501370182350951961
SylvainD

ฉันเข้าใจความคิดของbig_constant//5**long_expressionแต่คุณมาบนโลกด้วยวิธีคงที่และการแสดงออกที่ว่า? มันบ้า: D
Sherlock9

2
ค่าคงที่เป็นตารางการค้นหาอย่างง่ายโดยใช้ฐาน 5 หลัก แต่แปลงเป็นฐาน 10 ดังนั้นตัวเลขจะถูกแยกเป็นตัวเลขแทนที่จะใช้ดัชนีสตริง การแสดงออกดูเหมือนปฏิทินถาวรสำหรับฉัน (ปัญหาจะง่ายเกินไปหาก จำกัด เพียงปีจากปี 1901 ถึง 2099 เนื่องจากคำตอบซ้ำทุก ๆ 28 ปีภายในช่วงเวลานั้นดังนั้นมันจะเป็นเพียงกรณีของการทำ mod ปี 28 และค้นหาในตาราง )
Neil

13

Brain-Flak , 6588 , 2310 , 2308 , 2290 bytes

อย่างแรกเลยฉันไม่ได้เขียนโปรแกรมนี้เกือบ 100% ซึ่งอาจเห็นได้จากโปรแกรมขนาดใหญ่ ที่สุดของรหัสนี้ถูกเขียนโดยฉันเอง Brain-Flak กอล์ฟอัลกอริทึม พร้อมกับสคริปต์ python เพิ่มเติมที่ฉันเขียนเพื่อให้มันถูกทิศทาง

ลองออนไลน์!

({}<(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()()())){}{}){})[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])()())[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])())()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())>[(((((((((()()()()())){}{}){}){}){}){}[()]){}){}){}]){({}[()]<{}>)}{}({}<{{}}>)

ในขณะที่โปรแกรมนี้ค่อนข้างยาวสำหรับการตีกอล์ฟ แต่มันค่อนข้างสั้นสำหรับ Brain-Flak ขณะนี้สถิติโลกสำหรับการแบ่งจำนวนเต็มมีมากกว่า 1,000 ไบต์

คำอธิบาย

อัลกอริทึมนั้นค่อนข้างง่าย เนื่องจากมีจำนวนปี จำกัด (321) เพียงกดคำตอบในลำดับย้อนกลับภายใต้อินพุตและใช้อัลกอริทึมการค้นหาเพื่อค้นหาคำตอบที่ถูกต้อง ในขณะที่ hardcoding ความเป็นไปได้ทั้งหมด 321 อาจดูเหมือนไม่มีประสิทธิภาพกับงานที่ซับซ้อนเช่นเดียวกับภาษานี้และเป็นความลับที่เป็นความลับเป็นสมองสะเก็ดมันอาจเป็นทางออกที่ดีที่สุด (ฉันวางแผนที่จะค้นหาในสัปดาห์ที่จะถึง)

เนื่องจากตัวเลข 321 ส่วนใหญ่โดยเฉลี่ยอยู่ที่ 18 และพวกเขาแตกต่างกันเล็กน้อยจากปีต่อปีแทนที่จะผลักดันตัวเลขทั้งหมดเป็นรายบุคคลฉันผลักดันปีแรก (2233) ตามปกติแล้วจึงทำซ้ำและเปลี่ยนค่าเล็กน้อยสำหรับแต่ละปี หลังจาก. วิธีนี้แทนที่จะจ่ายเพื่อผลักดัน ~ 18 ตลอด 321 ปีฉันจ่ายเพื่อผลัก ~ 2 ทุกปี

เมื่อคำตอบทั้งหมดถูกผลักออกไปมันจะลบ 1912 ออกจากอินพุต({}[(((((((((()()()()())){}{}){}){}){}){}[()]){}){}){}])(นี่อาจจะไม่ดีนักฉันเขียนออพติไมเซอร์ใหม่เพื่อข้ามค่าบางอย่างที่ฉันเชื่อว่าจะไม่ดีที่สุดเพราะหมายเลข hardcoding เป็นกระบวนการเอ็กซ์โพเนนเชียล ใช้เวลาสองสามวัน)

จากนั้นจะลบองค์ประกอบหนึ่งจากองค์ประกอบแรกแล้วดึงองค์ประกอบที่สองออกมาจนกระทั่งผลลัพธ์เป็นศูนย์, {({}[()]<{}>)}.

มันผุดศูนย์, และองค์ประกอบทั้งหมดที่อยู่ด้านล่างองค์ประกอบด้านบน{}({}<{{}}>)


วิธีทั่วไปในการเล่นกอล์ฟหมายเลขคืออะไร?
Neil

แนวคิดง่าย ๆ คือถ้าคุณมีตัวเลขที่มีปัจจัย n และ m คุณกด n m-1 ครั้งแล้วป๊อป m-1 ครั้ง การกดครั้งแรกจะประเมินเป็น n และแต่ละป๊อปจะประเมินว่าเป็น n เพิ่มเติมโดยทำให้ (1 + m-1) (n) ซึ่งเหมือนกันกับ mn สิ่งนี้เกิดขึ้นซ้ำ ๆ เพราะเพื่อที่จะผลักดันเราต้องตีกอล์ฟเช่นกัน เนื่องจากวิธีการนี้ใช้ไม่ได้ผลกับจำนวนเฉพาะเราจึงมองไปรอบ ๆ เพื่อดูว่ามีจำนวนที่มีประสิทธิภาพมากขึ้นในบริเวณใกล้เคียงหรือไม่และถ้าอย่างนั้นเราจึงแสดงสิ่งนี้เป็นผลรวมของจำนวนนั้นและความแตกต่าง
ตัวช่วยสร้างข้าวสาลี

ฉันเห็น ... ขอตัวเลขสองตัวnและmที่มีความยาวkและlฉันคิดว่าn+mจะมีความยาวk+l? เกี่ยวกับn*mอะไร
Neil

n*mจะเป็นหรือk+4m-4 l+4n-4นี่เป็นเพราะการคูณถูกฮาร์ดโค้ด ครั้งแรกที่เราผลักดันn m-1ครั้ง ในการทำเช่นนี้เราจำเป็นต้องมีkสัญลักษณ์เพื่อแสดงnและ2m-2สัญลักษณ์แสดงการผลัก (แต่ละการกดคือ 2 สัญลักษณ์) จากนั้นเราก็ป๊อปอัพm-1ทำให้เราต้อง2m-2เสียค่าใช้จ่ายเพิ่มเติม k+4m-4ผลรวมนี้ เรายังสามารถคูณm*n(สมบัติการสลับที่) l+4n-4ที่จะได้รับ ผลลัพธ์จะสั้นลงของทั้งสอง
ข้าวสาลี Wizard

1
ดีว่าที่จริงแล้ว+1ค่าใช้จ่าย 2, *2ค่าใช้จ่าย 4, *3ค่าใช้จ่ายที่ 8 *4ค่าใช้จ่าย 12 ซึ่งมีราคาแพงกว่า*2*2จึงไม่คุ้มค่า (จากตัวเลขด้านล่างที่ 1000 พบเพียง 10 ที่ไม่ได้ใช้*2: 1, 2, 3 , 4, 5, 9, 15, 27, 45, 135) สำหรับปี 1912 สิ่งที่ดีที่สุดที่ฉันทำได้คือ((((((1+1+1)*2+1)*2*2+1)*2+1)*2+1)*2+1)*2*2*2มีความยาว 52
Neil

7

Bash + ยูทิลิตี้ทั่วไป, 39

ncal $1|grep W|factor|egrep -c ': \S+$'

ใช้ปีอินพุตเป็นพารามิเตอร์บรรทัดคำสั่ง โดยทั่วไปจะส่งข้อความเช่นนี้ไปยัง STDERR - ฉันคิดว่านี่ถูกกฎหมายตามmeta-answer นี้ :

factor: We is not a valid positive integer

หากคุณต้องการระงับเอาต์พุต STDERR อย่างชัดเจนคุณสามารถทำได้แทนด้วยคะแนน43 :

ncal $1|grep W|factor 2>-|egrep -c ': \S+$'

โปรดทราบว่าสิ่งนี้จะถือว่าเป็นภาษาอังกฤษหรือภาษา C / POSIX มันใช้งานได้ไม่ดีนักgd_GB.utf8โดยที่ชื่อทุกวันย่อมาDiจาก
Toby Speight

6

อ็อกเทฟ 86 ไบต์

สิ่งนี้ไม่เร็วด้วยการยืดใด ๆ แต่นั่นไม่ใช่เป้าหมายของโค๊ดกอล์ฟใช่ไหม?

function r=p(y)r=0;for(i=698346:7:815953)d=datevec(i);r+=d(1)==y*isprime(d(3));end;end

Octave สามารถติดตามวันที่ด้วย "date number" - จำนวนวันที่ผ่านไปเมื่อวันที่ 1 มกราคม, 0 คือวันที่ 1 โดยการวัดนี้ 3 มกราคม 1912 (วันพุธแรกในชุดของเรา) คือวันที่ 698,346 เริ่มต้นที่นั่นและวนซ้ำทุกวันที่ 7 (วันพุธทั้งหมด) จนถึงสิ้นปี 2233 และบวก 1 ถ้าปีนั้นเป็นปีเป้าหมายและเดือนนั้นเป็นวันสำคัญ


5

Python 2.7, 166 , 165 , 150 ไบต์

from datetime import*
y=input()
d,c=date(y,1,1),0
while d.year==y:n=d.day;c+=n>1<2==d.weekday()>0<all(n%x for x in range(2,n));d+=timedelta(1)
print c

มีห้องพักสำหรับการปรับปรุงอย่างแน่นอนที่นี่ ฉันค่อนข้างใหม่กับการเล่นกอล์ฟในหลาม สิ่งนี้ใช้datetimeโมดูล มันวนลูปตลอดทั้งวันในปีบวกหนึ่งเข้ากับตัวสะสมถ้ามันตรงกับเกณฑ์ จากนั้นพิมพ์ผลลัพธ์ การยกของหนักส่วนใหญ่อยู่ในโมดูลดังนั้นโค้ดจึงค่อนข้างบาง

หนึ่งไบต์บันทึกขอบคุณที่มอร์แกน Thrappและ 15 ไบต์บันทึกไว้โดยPietu1998


1
คุณสามารถบันทึกหนึ่งไบต์โดยการเปลี่ยนไปn%x==0 n%x<1
Morgan Thrapp

2
-1ไม่จำเป็นต้องเป็นrangeดัชนีสิ้น 's เป็นพิเศษ นอกจากนี้คุณสามารถแปลงfilterเป็นเครื่องกำเนิด [0for x in range(2,n)if n%x<1]
PurkkaKoodari

คุณสามารถใช้any(...)หรือแทนall(...) not filter(...)
kennytm

1
โดยการรวมการเปรียบเทียบที่ถูกล่ามโซ่และallคุณสามารถบันทึกทั้งพวง c+=n>1<2==d.weekday()>0<all(n%x for x in range(2,n))
PurkkaKoodari

3

J, 44 ไบต์

+/@(valdate*3=weekday)@,.&(,/(>:,"0/p:)i.12)

ฉันเพิ่งค้นพบว่า J มี builtins สำหรับจัดการวันที่

การใช้

คำสั่งพิเศษใช้สำหรับการจัดรูปแบบอินพุต / เอาท์พุตหลายรายการ

   f =: +/@(valdate*3=weekday)@,.&(,/(>:,"0/p:)i.12)
   (,.f"0) 1912 1914 1984 1996 2063 2150 2199 2233
1912 19
1914 16
1984 17
1996 19
2063 19
2150 16
2199 18
2233 18

คำอธิบาย

+/@(valdate*3=weekday)@,.&(,/(>:,"0/p:)i.12)  Input: year
                                       i.12   The range [0, ..., 11]
                              >:              Increment each to get the months [1, ..., 12]
                                    p:        Get the first 12 primes [2, ..., 37]
                                ,"0/          Make a table between each month and prime
                           ,/                 Join the rows
                       ,.&                    Prepend the year to each
                                              The date format is YYYY MM DD
            3=weekday                         Check if each date occurs on Wednesday
    valdate*                                  and is a valid date
+/@                                           Count the number of true values and return

1

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แล้ว loops กว่าทุกที่สำคัญจากการ2 31สำหรับแต่ละคนเราสร้างGet-Dateวันหนึ่ง ๆ ขึ้นมาจากนั้นเลือกเฉพาะวันที่มีDayOfWeek -equal ถึง3(เช่นวันพุธ) สรุปว่าทั้งหมดใน parens เพื่อกำหนดอาร์เรย์และใช้.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 มกราคมคือที่สองคือผลลัพธ์ปกติ เว้นแต่ปีเป็นหนึ่งในตัวเลขกลางแล้วมันเป็นตัวเลขที่อยู่ใน parens แทน คอลัมน์สุดท้ายอธิบายการทำงานของการจัดทำดัชนี% 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หมายเลขอาจต้องมีการปรับเปลี่ยนตามความแตกต่างของวัฒนธรรมอื่น ๆ



1

JavaScript ES6, 187 182 181 179 ไบต์

179 สลับในการ for-loop สำหรับ while-loop

z=y=>{D=new Date("1/3/1912");N=0;a=()=>D.getFullYear();b=()=>D.getDate();c=()=>D.setDate(b()+7);for(;a()<=y;c())N+=y-a()?0:-1<[2,3,5,7,11,13,17,19,23,29,31].indexOf(b());return N}

181 การ บีบอัดส่วนที่สาม

z=y=>{D=new Date("1/3/1912");N=0;a=()=>D.getFullYear();b=()=>D.getDate();c=()=>D.setDate(b()+7);while(a()<=y){N+=y-a()?0:-1<[2,3,5,7,11,13,17,19,23,29,31].indexOf(b());c()}return N}

182 รวมวงทั้งสองเข้าด้วยกัน

z=y=>{D=new Date("1/3/1912");N=0;a=()=>D.getFullYear();b=()=>D.getDate();c=()=>D.setDate(b()+7);while(a()<=y){N+=a()==y?-1<[2,3,5,7,11,13,17,19,23,29,31].indexOf(b()):0;c()}return N}

187

z=y=>{D=new Date("1/3/1912");N=0;a=()=>D.getFullYear();b=()=>D.getDate();c=()=>D.setDate(b()+7);while(a()<y)c();for(;a()==y;c())N+=-1<[2,3,5,7,11,13,17,19,23,29,31].indexOf(b());return N}

ฉันไม่คิดว่าสิ่งนี้จะนับตามที่คุณให้ครั้งแรกวันพุธแรกของปีเฉพาะในตัวอย่างนี้ ความท้าทายของ OP ระบุว่าต้องใช้ปีเป็นพารามิเตอร์เดียว ... ความพยายามที่ยิ่งใหญ่แม้ว่า ...
WallyWest

"ข้อมูลเข้าสู่โปรแกรม / ฟังก์ชั่นของคุณจะใช้เวลาหนึ่งปี" แต่สิ่งที่คุณกำลังชี้ให้เห็นก็คือ ฉันใช้วันพุธแรกของปี 1912 เป็นเมล็ดเนื่องจากมันเป็นหรืออยู่ก่อนทุกวันพุธในช่วงเวลาที่กำหนดโดย OP แต่ฉันก็สามารถใช้วิธีใดก็ได้ในวันพุธโดยง่ายจากปี 1911 หรือก่อนหน้าเพื่อหว่านเมล็ด ข้อมูลเข้าสู่ฟังก์ชั่นของฉันยังคงเป็นปีและฟังก์ชั่นยังคงคำนวณจำนวนวันพุธที่สำคัญในปีใดก็ตามในกรอบเวลาที่แนะนำโดย OP ดังนั้นฉันไม่แน่ใจว่าวิธีนี้ไม่เหมาะกับความท้าทาย
Pandacoder

โอ้ขอโทษ ... ผมไม่ทราบที่แรกที่คุณกำลังใช้ที่เป็นองค์ประกอบเพาะ ... ความคิดที่ดี ... โดยเฉพาะการพิจารณาวิธีการแก้ปัญหาของคุณเต้นเหมืองโดยประมาณ 30 .. ;)
WallyWest

1
ขอบคุณ ฉันได้แรงบันดาลใจจากการใช้ Brain-Flak ของ Eamon Olive ซึ่งจริงๆแล้วมีคำตอบทั้งหมดที่ตั้งโปรแกรมไว้ล่วงหน้าตามคำอธิบายของเขา
Pandacoder

1

แบตช์ 248 ไบต์

@set/ad=0,l=1,n=20
@for /l %%i in (1913,1,%1)do @set/ad=(d+l+1)%%7,l=!(%%i%%4)-!(%%i%%100)+!(%%i%%400)
@goto %l%%d%
:03
:06
@set/an-=1
:12
:13
:16
@set/an-=1
:01
:04
:14
@set/an-=1
:00
:05
:10
:15
@set/an-=1
:02
:11
@echo %n%

คำอธิบาย: dเป็นวันของสัปดาห์ด้วย0สำหรับวันจันทร์ซึ่งสะดวก 1 มกราคม 1912 lเป็นธงไม่ว่าปีเป็นปีอธิกสุรทิน1สำหรับปี 1912 จากนั้นเราวนซ้ำจากปี 1913 เป็นปีอินพุตอัปเดตวันที่ สัปดาห์และคำนวณธงปีอธิกสุรทินในขณะที่เราไป ในที่สุดเราใช้ธงปีอธิกสุรทินและวันในสัปดาห์เพื่อจัดทำดัชนีสิ่งที่เป็นคำสั่งสวิตช์ขนาดใหญ่ที่มีประสิทธิภาพเพื่อพิจารณาnจำนวนวันพุธที่สำคัญ การตั้งค่าnเป็น 20 และลดลงเมื่อตก แต่มีราคาถูกกว่าการใช้ตรรกะการควบคุมการไหล แต่ผลที่สุดคือถ้าวันที่ 1 มกราคมของปีที่ไม่ก้าวกระโดดคือวันพฤหัสบดีหรือวันอาทิตย์มี 16 วันพุธเป็นต้นสำหรับกรณีอื่น ๆ .


1

JavaScript ES6 206 203 199 197 195 183 182 179

ไม่ใช่ที่สั้นที่สุด แต่ดีที่สุดที่ฉันสามารถทำได้ตอนนี้ ... ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ...

p=n=>--d-1?n%d&&p(n):1;v=Date;D=(x,y)=>new v(x.setDate(x.getDate()-y));W=a=>eval('for(Z=0,z=D(w=new v(a,11,31),(w.getDay()+4)%7);z>new v(a,0,1);)Z+=~~p(d=z.getDate()),z=D(z,7);Z')

การเปลี่ยนแปลง:

  1. การเปลี่ยนแปลงองค์ประกอบที่ประกอบไปด้วยจาก: 3>=x?3-x:10-xเป็น6-(x+10)%7, การบันทึก: 3 การเปลี่ยนแปลงไปยังตำแหน่งประกาศ;
  2. ผสานx=w.getDay();z=D(w,6-(x+10)%7)กับz=D(w,6-(w.getDay()+10)%7), บันทึก: 4
  3. เปลี่ยนZ=0จากการforวนซ้ำเป็นการประกาศวันที่และz=D(w,6-(x+10)%7)เปลี่ยนเป็นการforวนซ้ำเป็นระเบียบประหยัด: 2
  4. เลื่อนw=new Date(a,Z=0,1)การประกาศเป็นforลูปรวมกับwการประกาศที่มีอยู่แล้วประหยัด: 2
  5. เขียนใหม่ฟังก์ชั่นการค้นพบที่สำคัญเป็นฟังก์ชั่นการทดสอบที่สำคัญประหยัด: 12
  6. เปลี่ยน+!!เป็น~~ลดและยังคงแปลงp(d=1)จากNaNเป็น0อนุญาตให้ฟังก์ชั่นการทดสอบนายกรัฐมนตรียังคงทำงานอยู่ประหยัด: 1
  7. ย้ายฟังก์ชั่นพิเศษทั้งหมดออกจากฟังก์ชั่นการโทรหลักWกำหนดforลูปใหม่- ย้อนกลับจากวันที่ 31 ธันวาคมเขียนDateวัตถุเป็นตัวแปรแยกจากนั้นเขียนforลูปอีกครั้งในการevalโทร ประหยัด 3

@PandaCoder ฉันกำลังตามใจคุณอยู่


1

R, 149 147 ไบต์

y=function(x){s=strftime;b=ISOdate
a=seq(b(x,1,1),t=b(x,12,31),b='d')
length(a[s(a,'%u')==3&trimws(s(a,'%e'))%in%c(2,3,5,7,11,13,17,19,23,29,31)])}

ทดสอบบนIdeone


0

Groovy, 126

Groovy ไม่มีการตรวจสอบความถูกต้องหมายเลขเฉพาะต้องสร้างด้วย

{n->p={x->x<3||(2..Math.sqrt(x)).every{x%it}};(new Date("1/1/$n")..new Date("12/31/$n")).collect{it[7]==4&&p(it[5])?it:0}-[0]}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.