Ruby 将两个数组相加,其中数组的第一个值与第二个数组的第一个值相加100次?

Ruby 将两个数组相加,其中数组的第一个值与第二个数组的第一个值相加100次?,ruby,arrays,Ruby,Arrays,我不能对我要解决的问题掉以轻心。我想制作一个数组来收集100年内月初的所有天数(以数字表示)(称为start\u days\u of\u month)。为此,我有两个数组,用于正常年份和闰年,如下所示: beginnings= [0,31,59,90,120,151,181,212,243,273,304,334] # jan = 31, feb =jan + 28, mar = jan + feb + 31, etc. leap_beginnings = beginnings.collect

我不能对我要解决的问题掉以轻心。我想制作一个数组来收集100年内月初的所有天数(以数字表示)(称为
start\u days\u of\u month
)。为此,我有两个数组,用于正常年份和闰年,如下所示:

beginnings= [0,31,59,90,120,151,181,212,243,273,304,334] # jan = 31, feb =jan + 28, mar = jan + feb + 31, etc.
leap_beginnings = beginnings.collect { |i| i > 32 ? i += 1 : i }
这里,开始是一个月的开始,闰年的开始是一个月的开始(即,对于
leap\u开始
,在第二个月之后,
开始的每个月增加1天)

现在我有了从1900年初到2000年底的年份。我想做的是将起始区域的值从头到尾添加到
起始日/月/月的数组中,但是当年份可以被4整除(闰年)时,我想将
闰年开始的值添加到数组中


如何将两个数组相互添加,其中数组的第一个值添加到第二个数组的第一个值,而新数组是输出(
开始月份天数
),然后我可以将其再次用作第一个值?(重复100年,这样输出的是一个数字数组,其中包含100年期内一个月的所有开始日期。)

你可以这样做:
leap\u beginnings=beginnings.map.with_index{n,i |(i>1)?n+1:n}
。我不认为1900年是闰年,但2000年是。你需要检查一下。@CarySwoveland true,在原文中(欧拉计划)排除了1900问题。谢谢你的帮助。这样更漂亮。添加数组部分必须可以基于if语句。嗯,我试图在一个例子中弄清楚我到底想做什么。如果
a
b
是两个数组,
a.zip(b)。map{m,n|m+n}
应该这样做。您可以始终拥有
a[0]+=31,但我会更仔细地看这个问题。你读过@spickermann的答案吗?他通常提供了很好的建议。@user2609980:我更新了我的答案以解决这个问题。在我不理解的偏移部分中,你在其中计算最大值和一个or运算符,后面是一个0。你能详细说明一下吗?(仍在学习语言的基础!;-)如果内存可用,
def leap_year(n)n%4==0&(n%400==0 | n%100!=0)end
@Cary你是对的。看看问题的原因。无论如何,我不理解偏移部分…非常重要。另一个问题是每次添加0时,它不应该是0,但应该是31(12月)。非常感谢您的回答非常有帮助!@user2609980:偏移背后的想法是,次年一个月的一天数与今年的一天数加上前年的天数相同。因为数组不包含去年12月的天数(仅12月初)必须添加31。数组可能为空而不是继续0。对于
reduce
读取:
0
tot
的初始值,
i
是数组中的当前元素。在每个循环中
366
365
被添加到
tot
。我会将循环更改为
(365..number of_天)。每个{| i | sundays。如果i%7==0,则按(i)}
。但注释不是讨论代码的好地方。在github上提出新问题或打开pull请求。
beginnings = [0,31,59,90,120,151,181,212,243,273,304,334] # jan = 31, feb =jan + 28, mar = jan + feb + 31, etc.
leap_beginnings = beginnings.map.with_index {|n,i| (i > 1) ? n+1 : n }

def leap_year?(n)
  n % 4 == 0 && (n % 400 == 0 || n % 100 != 0)
end

def offset(array)
  if array.size == 0
    0
  else
    array.max + 31    # because december
  end
end

starting_days_of_month = []

(1900..2000).each_with_index do |year, index|
  days = leap_year?(year) ? leap_beginnings : beginnings

  starting_days_of_month += days.map { |day| day + offset(starting_days_of_month) }
end

puts starting_days_of_month