閏年でない年を考えます。
1/1 => 1,
1/2 => 2,
…
1/31 => 31,
2/1 => 32,
…
12/31 => 365
と対応させることにします。
さて、日付の足し算を
(365 を 法として、2 + 365 = 2 なので)
1/2 + 12/31 = 1/2
とします。
このような計算をしたとき、
普通の分数計算
(結果は、約分するものとし、
整数Nの分数表示は N/1 とします。)
と一致する組合せはあるでしょうか?
(上記例では、1/2 + 12/31 = 55/62 ≠ 1/2 です。)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
ほとんど無いかと思ったら、意外とありますね。
lang
1GANTAN = Time.mktime(2015,1,1) 2days = (0...365).map { |i| GANTAN + i*24*3600 } 3 4days.repeated_combination(2) do |x,y| 5 if Rational(x.mon,x.day)+Rational(y.mon,y.day) == (x.yday+y.yday)%365 6 puts [x.strftime("%m/%d"),y.strftime("%m/%d")].join(",") 7 end 8end 9#=> 1001/01,01/01 1102/01,12/04 1202/02,12/03 1303/06,11/02 1404/06,09/27 1504/22,09/11 1606/01,08/08
追記:
問題を読み誤っていたかも。こういうことか?
lang
1GANTAN = Time.mktime(2015,1,1) 2days = (0...365).map { |i| GANTAN + i*24*3600 } 3 4days.repeated_combination(2) do |x,y| 5 z1 = days[(x.yday+y.yday)%365-1] 6 z2 = Rational(x.mon,x.day)+Rational(y.mon,y.day) 7 if z1.mon == z2.numerator and z1.day == z2.denominator 8 puts [x.strftime("%m/%d"),y.strftime("%m/%d")].join(",") 9 end 10end 11#=> 1201/28,02/28 1301/30,06/30 1401/31,07/31 1503/03,07/02 1604/06,09/27 1704/22,09/11 1807/07,09/27 1908/06,09/27 2009/12,10/24 2110/10,12/28 2210/15,11/24 2310/30,12/04 2412/06,12/30
投稿2015/05/23 14:20
編集2015/05/24 06:06総合スコア84538
0
1 年の何日目 -> 月/日 の文字表示
1 年の何日目 -> Rational(月 , 日)
を引く Hash をつくり、あとは、組み合わせをループで回して探すようにしてみました。
lang
1def makeHash 2 days = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31].freeze 3 tmpstr = {} 4 tmpval = {} 5 x = 0 6 (1 .. 12).each do |m| 7 (1 .. days[m]).each do |d| 8 x += 1 9 tmpstr[x] = "#{m}/#{d}" 10 tmpval[x] = Rational(m, d) 11 end 12 end 13 tmpstr[0] = "12/31" 14 tmpval[0] = Rational(1,1) 15 [tmpstr.freeze, tmpval.freeze] 16end 17 18MD_STR, MD_VAL= makeHash() 19ans = [] 20 21(1..365).each do |d1| 22 (d1..365).each do |d2| 23 sum_md = MD_STR[(d1 + d2) % 365] 24 if (MD_VAL[d1] + MD_VAL[d2]).to_s == sum_md 25 ans << "#{MD_STR[d1]} + #{MD_STR[d2]} = #{sum_md}" 26 end 27 end 28end 29 30puts ans 31puts "cont = #{ans.size}"
実行結果
1/28 + 2/28 = 3/28 1/30 + 6/30 = 7/30 1/31 + 7/31 = 8/31 3/3 + 7/2 = 9/2 4/6 + 9/27 = 1/1 4/22 + 9/11 = 1/1 7/7 + 9/27 = 4/3 8/6 + 9/27 = 5/3 9/12 + 10/24 = 7/6 10/10 + 12/28 = 10/7 10/15 + 11/24 = 9/8 10/30 + 12/4 = 10/3 12/6 + 12/30 = 12/5 cont = 13
投稿2015/05/24 00:14
総合スコア22324
0
otn さんの回答を参考にしました。
日付の重複組合せでなく、「何日目か」の重複組合せに変えてみました。
lang
1require 'date' 2 3md0 = Date.new(2013, 12, 31) 4(1..365).to_a.repeated_combination(2){|i, j| 5 x, y, z = md0 + i, md0 + j, md0 + i + j 6 z0 = Rational(x.mon,x.day) + Rational(y.mon, y.day) 7 # Rational(x.mon,x.day) + Rational(y.mon, y.day) == Rational(z.mon, z.day)ではダメ 8 if z.mon == z0.numerator && z.day == z0.denominator 9 puts [x.strftime("%m/%d"), y.strftime("%m/%d")].join(",") 10 end 11}
(注意)
365 を法にしているので、
md0 から md0 + 365 + 365 の間に
2/29 が含まれないように md0 を選びました。
投稿2015/05/24 07:28
編集2015/05/24 07:38総合スコア233
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。