質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • Ruby

    7304questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

普通の分数計算と日付の計算が一致することはあるか?

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 775

manman

score 257

閏年でない年を考えます。
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 です。)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

ほとんど無いかと思ったら、意外とありますね。
GANTAN = Time.mktime(2015,1,1)
days = (0...365).map { |i| GANTAN + i*24*3600 }

days.repeated_combination(2) do |x,y|
  if Rational(x.mon,x.day)+Rational(y.mon,y.day) == (x.yday+y.yday)%365
    puts [x.strftime("%m/%d"),y.strftime("%m/%d")].join(",")
  end
end
#=>
01/01,01/01
02/01,12/04
02/02,12/03
03/06,11/02
04/06,09/27
04/22,09/11
06/01,08/08

追記:
問題を読み誤っていたかも。こういうことか?
GANTAN = Time.mktime(2015,1,1)
days = (0...365).map { |i| GANTAN + i*24*3600 }

days.repeated_combination(2) do |x,y|
  z1 = days[(x.yday+y.yday)%365-1]
  z2 = Rational(x.mon,x.day)+Rational(y.mon,y.day)
  if z1.mon == z2.numerator and z1.day == z2.denominator
    puts [x.strftime("%m/%d"),y.strftime("%m/%d")].join(",")
  end
end
#=>
01/28,02/28
01/30,06/30
01/31,07/31
03/03,07/02
04/06,09/27
04/22,09/11
07/07,09/27
08/06,09/27
09/12,10/24
10/10,12/28
10/15,11/24
10/30,12/04
12/06,12/30

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

1 年の何日目 -> 月/日 の文字表示
1 年の何日目 -> Rational(月 , 日) 
を引く Hash をつくり、あとは、組み合わせをループで回して探すようにしてみました。

def makeHash
  days = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31].freeze
  tmpstr = {}
  tmpval = {}
  x = 0
  (1 .. 12).each do |m|
    (1 .. days[m]).each do |d|
      x += 1
      tmpstr[x] = "#{m}/#{d}"
      tmpval[x] = Rational(m, d)
    end
  end
  tmpstr[0] = "12/31"
  tmpval[0] = Rational(1,1)
  [tmpstr.freeze, tmpval.freeze]
end

MD_STR, MD_VAL= makeHash()
ans = []

(1..365).each do |d1|
  (d1..365).each do |d2|
    sum_md = MD_STR[(d1 + d2) % 365]
    if (MD_VAL[d1] + MD_VAL[d2]).to_s == sum_md
      ans << "#{MD_STR[d1]} + #{MD_STR[d2]} = #{sum_md}"
    end
  end
end

puts ans
puts "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 17:19

    解のうち、4/6 + 9/27 = 1/1, 4/22 + 9/11 = 1/1 の二つが気にいりました。

    キャンセル

  • 2015/05/24 18:03

    "4/22 + 9/11 = 1/1" は 面白いですね。

    キャンセル

0

otn さんの回答を参考にしました。
日付の重複組合せでなく、「何日目か」の重複組合せに変えてみました。

require 'date'

md0 = Date.new(2013, 12, 31)
(1..365).to_a.repeated_combination(2){|i, j|
  x, y, z = md0 + i, md0 + j, md0 + i + j 
  z0 = Rational(x.mon,x.day) + Rational(y.mon, y.day)
  # Rational(x.mon,x.day) + Rational(y.mon, y.day) == Rational(z.mon, z.day)ではダメ
  if z.mon == z0.numerator && z.day == z0.denominator
    puts [x.strftime("%m/%d"), y.strftime("%m/%d")].join(",")
  end
}
(注意)
365 を法にしているので、
md0 から md0 + 365 + 365 の間に
2/29 が含まれないように md0 を選びました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7304questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。