我希望能够从一年开始,并计算13日星期五的事件。蛮力解决方案简单明了。我有一些稍好的东西,但我毫不怀疑其他人可以为此提出一个优雅的算法。
也许有点棘手,我有兴趣给这个节目一个月,然后让它找到那个月的第一个星期五的第13年。
随意使用伪代码,但我希望人们会以您最喜欢的语言为代码示例投票。
答案 0 :(得分:10)
由于您的强力算法显然是直观的逐日迭代选项,您可能还没有考虑过Doomsday Algorithm。这将允许您简单地检查第13个星期五是否是星期五。据我所知,这是解决问题的最有效方法。
答案 1 :(得分:10)
任何以星期日开始的月份都会在十三号星期五举行。只有14种组合可能知道今年的第一天是哪一天(有或没有闰年,太阳坐)。你应该只计算一次并完成它。您只需要检查14 * 12个可能的月份,以及原因。
结果表元素(来自2009年,2010年):
[Thursday,false] => Feb, March, Nov
[Friday,false] => Aug
填写表格你有一个月的通用月份(31),2月(28)..然后用一周的每一天的种子迭代,注意从周日开始的月份,还有闰年和没有。非常直接,一旦完成,您可以与我们分享:)
答案 2 :(得分:3)
Here's some example PHP code经历一个范围内日期的非常直接的循环。我会修改这个来检查每个星期五的星期五,而不是像每个星期五那样检查13thness,就像他们在例子中那样。
答案 3 :(得分:2)
我注意到的一件事是,本月的第一个月是星期日,星期五是13日。您可以利用它来更容易计算。
答案 4 :(得分:1)
initialize startDate to 13th of the month given in the current year
while (true) {
if (startDate.dayOfWeek == Date.FRIDAY)
break;
else
startDate.year ++;
}
return startDate.year;
答案 5 :(得分:1)
我就是这样做的:
假设年份已知且为整数。
从1到12循环
使用循环索引,年份和当天的13创建日期
如果上面计算的星期几是星期五,请做好您的工作
如果你想从一个月和一年开始(你必须假定某种年份),你的算法就会变成
假设年份已知且为整数
假设月份已知且为整数
循环
创建日期,其中循环索引为年份,已知月份变量,当天为13
如果上周计算的是星期五,则返回日期,否则
其他增量年份为1
答案 6 :(得分:0)
我在Windows 10上使用PowerShell 7.1 x64,对此我也很感兴趣,尽管我的编程技能还不够先进,无法开发出独立且复杂的算法(无内置算法)来解决此问题,目前我可以这样做:
data
更新: 现在,我通过强行将year-month-13转换为天数,并获得Days Mod 7等于5的结果,我使用了Wikipedia上的所有高级算法:https://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week 我发现他们不能与PowerShell配合使用,不知道是我还是Wikipedia弄错了,无论如何这是我的脚本,我已经将脚本的结果与内置脚本和此脚本进行了比较,显示“ FC:没有遇到差异”:
$start=Read-Host "Input start year"
$end=Read-Host "Input end year"
$years=$start..$end
$blackfriday=@()
foreach ($year in $years) {
$blackfriday+=1..12 | foreach { [datetime]"$year-$_-13" } | where { $_.DayOfWeek -eq 'Friday'} | foreach {$_.tostring("yyyy, MMMM dd, dddd")}
}
$blackfriday