とある王国では 4 で割って余りが 1 になる年に開催される祭があります。
とある王国では暦が独特であり、以下のような暦になっています。
・1 年には 1 月から 13 月までの 13 ヶ月がある。
・偶数月の日数は 15 日である。
・奇数月の日数は 13 日である。
とある王国の国民たちはこの祭が大好きでいつも、次に開催される日を楽しみにしています。
あなたも、祭を楽しみにしているので、次の開催日まであと何日あるのか早く知りたいです。
そこで、あなたには、現在の日付と次の祭の開催日が与えられるので、次の祭までの日数を計算するプログラムを作ってもらいます。
ただし、今年の祭は開催されないことはわかっており、今日の日付はカウントされません。
入力例 1 の場合、以下のようになります。
2000 年から見て、一番近い開催年は 2001 年です。2000 年 12 月 10 日から、 2001 年 1 月 10 日までの日数は 5 + 13 + 10 = 28 で 28 日となります。
コード例
# 変数への格納と余りが1の年(開催年 == opening_y)を炙り出すための材料となる「starting_y」を作成する
starting_y_origin,starting_m,starting_d = gets.chomp.split(" ").map(&:to_i)
opening_m,opening_d = gets.chomp.split(" ").map(&:to_i)
starting_y = starting_y_origin
# この時にはまだ謎に包まれているopening_yを炙り出す
# 二つの分岐を作るが、最終的に格納される変数は同じ
if starting_y_origin % 4 == 0
opening_y = starting_y_origin + 1
else
loop do
starting_y += 1
break if starting_y % 4 == 1
opening_y = starting_y + 1
end
end
if starting_m.odd?
rest_days_sm = (13 - starting_d)
this_year_days = ((starting_m..13).to_a.count{|m| m.odd? == true} -1)*13 + ((starting_m..13).to_a.count{|m| m.even? == true})*15 + rest_days_sm
else
rest_days_sm = (15- starting_d)
this_year_days = ((starting_m..13).to_a.count{|m| m.odd? == true})*13 + ((starting_m..13).to_a.count{|m| m.even? == true}-1)*15 + rest_days_sm
end
if opening_m.odd?
op_year_days = ((1..opening_m).to_a.count{|m| m.odd? == true} -1)*13 +((1..opening_m).to_a.count{|m| m.even? == true})*15 + opening_d
else
op_year_days = ((1..opening_m).to_a.count{|m| m.odd? == true})*13 + ((1..opening_m).to_a.count{|m| m.even? == true} -1)*15 + opening_d
end
if (opening_y - (starting_y_origin)) == 1
puts this_year_days + op_year_days
else
puts (15*6 + 13*7)*((opening_y - starting_y_origin) - 1) + this_year_days + op_year_days
end