院卒新人サラリーマンのメモ代わり

備忘としてのメモを記載

魔法陣

魔法陣を解く
順列をすべて作ってから、魔法陣を満たすかチェックしてる。
対称解、枝切りなどは何も行っていない。
単純な全探索。

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