此代码中唯一错误的是返回:P
你怎么能在一年中显示那里的星期五13号?
def unlucky_days(year)
require 'date'
start_date = Date.new(year)
end_date = Date.new(year+1)
my_fridays = [4]
thirteen = "13"
result = (start_date..end_date).to_a.select {|k| my_fridays.include?(k.wday) && thirteen.include?(k.strftime('%d'))}
result.length
end
答案 0 :(得分:4)
我写道:
require 'date'
(1..12).count { |month| Date.new(year, month, 13).friday? }
答案 1 :(得分:2)
您的代码在几点上是错误的。
- 星期五是工作日5号,而不是4号。
- 为什么
[4].include?(n)
而不只是n==4
?- 醇>
"13".include?("#{n}")
不仅奇怪而且不正确,因为它为1和3以及13返回true。
你可以通过查看十二月十三日并计算星期五的数量来减少蛮力水平,而不是查看所有365或366天,看看它们中的哪一个都是13日和星期五,如@ tokland的回答,转载于此:
def unlucky_days(year)
(1..12).count { |month| Date.new(year, month, 13).friday? }
end
或者,由于只有14种可能性,您也可以使用预建表:
# number of Friday the 13ths in a given year is given by
# UnluckyDays[weekday of Jan 1][0 if common, 1 if leap]
UnluckyDays = [ [2,3], [2,2], [2,1], [1,2], [3,2], [1,1], [1,1] ]
def unlucky_days(year)
UnluckyDays[Date.new(year,1,1).wday][Date.leap?(year) ? 1 : 0 ]
end
答案 2 :(得分:2)
+1来@ MarkReed的评论。另外,为什么在某个范围内调用.to_a
,以及为什么在Date class in Ruby已有.day
和.friday
等方法时使用变量?我将如何做到这一点:
def unlucky_days(year)
s = Date.new(year, 1, 1)
e = Date.new(year, 12, 31)
((s...e).select {|d| d.friday? && d.day == 13 }).count
end
答案 3 :(得分:1)
这是@Tokland答案的变体。
require 'date'
def count_em(year)
d = Date.new(year, 1, 13) << 1
12.times.count { (d >>= 1).friday? }
end
(2010..2016).each { |y| puts "%d Friday the 13ths in %s" % [count_em(y), y] }
# 1 Friday the 13ths in 2010
# 1 Friday the 13ths in 2011
# 3 Friday the 13ths in 2012
# 2 Friday the 13ths in 2013
# 1 Friday the 13ths in 2014
# 3 Friday the 13ths in 2015
# 1 Friday the 13ths in 2016
如果这个计算(或类似的计算)经常完成并且性能很重要,可以构建两个哈希值,一个用于闰年,另一个用于非闰年,用键表示第一天的星期几年度下降和价值这些年份的星期五13日。