LoginSignup
0
0

More than 3 years have passed since last update.

お祭りの日付

Posted at

とある王国では 4 で割って余りが 1 になる年に開催される祭があります。
とある王国では暦が独特であり、以下のような暦になっています。

・1 年には 1 月から 13 月までの 13 ヶ月がある。
・偶数月の日数は 15 日である。
・奇数月の日数は 13 日である。

とある王国の国民たちはこの祭が大好きでいつも、次に開催される日を楽しみにしています。
あなたも、祭を楽しみにしているので、次の開催日まであと何日あるのか早く知りたいです。

そこで、あなたには、現在の日付と次の祭の開催日が与えられるので、次の祭までの日数を計算するプログラムを作ってもらいます。
ただし、今年の祭は開催されないことはわかっており、今日の日付はカウントされません。

入力例 1 の場合、以下のようになります。

スクリーンショット 2021-04-04 22.34.25.png

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
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0