今年情人節恰逢世界末日。再次。
這末日規則很簡潔,這裡有一個 JSL 片段來說明部分想法。
For( year = 1901, year <= 2099, year++, // 1900 was not a leap year and 2100 won't be
really =
Day Of Week( Date DMY( if(mod(year,4),3,4), 1, year ) ) == // 3rd day of January, 3 years out of 4
Day Of Week( Date DMY( if(mod(year,4),28,29), 2, year ) ) == // last day of February (29 on leap years)
Day Of Week( Date DMY( 14, 3, year ) ) == // PI-day
Day Of Week( Date DMY( 4, 4, year ) ) == // even months, same day, after February
Day Of Week( Date DMY( 6, 6, year ) ) == //
Day Of Week( Date DMY( 8, 8, year ) ) == //
Day Of Week( Date DMY( 10, 10, year ) ) == //
Day Of Week( Date DMY( 12, 12, year ) ) == //
Day Of Week( Date DMY( 7, 11, year ) ) == // familiar store name in US
Day Of Week( Date DMY( 11, 7, year ) ) == //
Day Of Week( Date DMY( 9, 5, year ) ) == // 9-to-5 working hours
Day Of Week( Date DMY( 5, 9, year ) ) == //
Day Of Week( Date DMY( 4, 7, year ) ) == // US Independence Day
Day Of Week( Date DMY( 26, 12, year ) ); // boxing day
If( !really, Show( year ) );
);
Write( "done\!n" );
Write( {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday"}[Day Of Week( Date DMY( 4, 4, 2015 ) )] );
該規則最酷的部分是全年(至少在 2 月之後)日期的令人難忘的模式,這些日期全年都在一周中的同一天。2015 年,世界末日是星期六; 4/4/2015、6/6/2015、8/8/2015、10/10/2015、12/12/2015 和 7/11、11/7、5/9 和 9/ 一樣都是星期六5. DMY 或 MDY。對我們來說幸運的是閏日在一年中出現得相當早,否則規則會更醜陋。
上面的 JSL 中使用 mod() 函數根據閏年選擇一月和二月的正確日期。請記住 2000 年是閏年,因為它可以被 400 整除,儘管大多數可以被 100 整除的年份不是閏年……因此是 for 循環的限制。
您可能想知道 JSL 中的 == 比較鏈,特別是如果您是熟悉幾乎所有其他編程語言的程序員。JMP 確實做到了這一點。例如(不要混搭<和> ),
1 < 2 < 3 < 4 < 5
1個
和
1 < 2 < 4 < 3 < 5
0
在上面的 JSL 中,== 鏈的結果被分配給真的;該值為 1,因此!真的test 為 0,JSL 從不打印年份,因為它們都通過了測試。如果將 1900 或 2100 添加到 for 循環,它們將打印出來,這不是因為世界末日規則是錯誤的,而是因為上面的 JSL 沒有在一月和二月選擇正確的日子。
最後的聲明也需要一點解釋:
寫({“星期日”、“星期一”、“星期二”、“星期三”、“星期四”、“星期五”、“星期六”}[星期幾(日期 DMY(4、4、2015))]);
週六
這是對 write() 函數的一次調用; {大括號}中的天數列表由[方括號]中的表達式下標。DayOfWeek 為星期日返回 1 ... 為星期六返回 7,無論提供什麼日期。4 月 4 日永遠是世界末日。
編輯 2017 年 9 月 30 日:修復格式