今年情人节恰逢世界末日。再次。
这末日规则很简洁,这里有一个 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 日:修复格式