2016年1月30日土曜日

160130

Ruby


引き算魔方陣

Excel VBA でパズルを解こう プログラムで脳トレに挑戦
という本に引き算魔方陣の問題が載っていた。

例えば、
2 1 4
3 5 7
6 9 8
がある。
これを[2, 1, 4, 3, 5, 7, 6, 9, 8] と表すこととし、
他の引き算魔方陣も出力してみた。

# -*- coding: cp932 -*-

def f(i, j, ary)
  ary[i] + ary[j] - ary[(i + j) / 2]
end

ary = []
(1..9).to_a.permutation(9){|p|
  i = f(0, 2, p)
  # 縦横斜めの各列で、両端の数字の合計から真ん中の数字を引いた値がどれも同じ
  if i == f(3, 5, p)
    if i == f(6, 8, p)
      if i == f(0, 6, p)
        if i == f(1, 7, p)
          if i == f(2, 8, p)
            if i == f(0, 8, p)
              if i == f(2, 6, p)
                ary << p
              end
            end
          end
        end
      end
    end
  end
}
p ary
puts "#{ary.size}通りある。"

出力結果
[[2, 1, 4, 3, 5, 7, 6, 9, 8], [2, 3, 6, 1, 5, 9, 4, 7, 8], [4, 1, 2, 7, 5, 3, 8, 9, 6], [4, 7, 8, 1, 5, 9, 2, 3, 6], [6, 3, 2, 9, 5, 1, 8, 7, 4], [6, 9, 8, 3, 5, 7, 2, 1, 4], [8, 7, 4, 9, 5, 1, 6, 3, 2], [8, 9, 6, 7, 5, 3, 4, 1, 2]]
8通りある。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。