计算13日星期五的未来事件

时间:2009-02-13 16:06:06

标签: algorithm language-agnostic datetime

我希望能够从一年开始,并计算13日星期五的事件。蛮力解决方案简单明了。我有一些稍好的东西,但我毫不怀疑其他人可以为此提出一个优雅的算法。

也许有点棘手,我有兴趣给这个节目一个月,然后让它找到那个月的第一个星期五的第13年。

随意使用伪代码,但我希望人们会以您最喜欢的语言为代码示例投票。

7 个答案:

答案 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创建日期

      • 根据established algorithms

      • 确定星期几
      • 如果上面计算的星期几是星期五,请做好您的工作

如果你想从一个月和一年开始(你必须假定某种年份),你的算法就会变成

  • 假设年份已知且为整数

  • 假设月份已知且为整数

  • 循环

    • 创建日期,其中循环索引为年份,已知月份变量,当天为13

    • 根据established algorithms

    • 确定星期几
    • 如果上周计算的是星期五,则返回日期,否则

    • 其他增量年份为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