2008-12-05 (Fri)Ruby練習問題
send more money
- send + more = money を満たすそれぞれ異なる 0 以上 9以下の数 s, e, n, d, m, o, r, y を求めよ。(ただし s, m は 0 でない)
8重forで解いてみる
for s in 1..9 for e in 0..9 next if s == e for n in 0..9 next if s == n or e == n for d in 0..9 next if s == d or e == d or n == d for m in 1..9 next if s == m or e == m or n == m or d == m for o in 0..9 next if s == o or e == o or n == o or d == o or m == o for r in 0..9 next if s == r or e == r or n == r or d == r or m == r or o == r for y in 0..9 next if s == y or e == y or n == y or d == y or m == y or o == y or r == y send = s * 1000 + e * 100 + n * 10 + d more = m * 1000 + o * 100 + r * 10 + e money = m * 10000 + o * 1000 + n * 100 + e * 10 + y if send + more == money p send.to_s + "+" + more.to_s + "=" + money.to_s #=> "9567+1085=10652" end end end end end end end end end
9秒くらいかかった。
Prinyさんは Array#permutation で解いてみたようです。
ご指摘ありがとうございます。
修正しました。
>cuzicさん
コメントありがとうございます。
「制約緩和法」は初耳です。かなりハイレベルのアルゴリズムだそうですね。
http://d.hatena.ne.jp/rubikitch/20081209/1228823996
答えのコード、ありがとうございます。
やはり皆さんpermutationを使ってますね。