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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

Q&A

解決済

3回答

1280閲覧

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

manman

総合スコア233

Ruby

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

0グッド

1クリップ

投稿2015/05/23 10:52

編集2015/05/24 09:15

閏年でない年を考えます。
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ページで確認できます。

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
otn

総合スコア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

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manman

2015/05/24 08:19

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

2015/05/24 09:03

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

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
manman

総合スコア233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問