魔法陣
魔法陣を解く
順列をすべて作ってから、魔法陣を満たすかチェックしてる。
対称解、枝切りなどは何も行っていない。
単純な全探索。
rejectって書いた覚えないなって思ったらselect notのことか。
フォーマッター使うと勝手に変換されるのか
def magicSquare # 1-9の順列作る per = makePermu([1, 2, 3, 4, 5, 6, 7, 8, 9], 9) # 魔法陣を満たすかチェック per.select { |el| checkMS(el) } end def makePermu(arr, n, acc = []) return [acc] if acc.length == n # すでに含まれてる要素を取り除く newArr = arr.reject { |el| acc.include?(el) } newArr.reduce([]) do |acc2, el| acc2 + permu(newArr, n, [*acc, el]) end end def checkMS(arr) # 斜め val = arr[0] + arr[4] + arr[8] val2 = arr[2] + arr[4] + arr[6] nanameCheck = val == val2 # 横 yokoCheck = (0..2).all? do |num| val == arr[0 + num * 3] + arr[1 + num * 3] + arr[2 + num * 3] end # 縦 tateCheck = (0..2).all? do |num| val == arr[0 + num] + arr[3 + num] + arr[6 + num] end if nanameCheck && yokoCheck && tateCheck return true else return false end end