Skip to content

Instantly share code, notes, and snippets.

@esehara
Created August 8, 2016 08:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save esehara/ea06f45983adfc576c5ed04c77924255 to your computer and use it in GitHub Desktop.
Save esehara/ea06f45983adfc576c5ed04c77924255 to your computer and use it in GitHub Desktop.
魔方陣グルグル
class Mahou
DIMENSION = 7
def self.column_check a, b
0.upto(DIMENSION - 1) do |i|
sum = 0
0.upto(DIMENSION - 1) do |j|
sum += a[j][i]
end
raise "縦の行: #{j + 1} が #{sum} なので定和性を満しません" if sum != b
end
0.upto(DIMENSION - 1) do |i|
sum = a[i].inject(:+)
raise "横の行: #{i + 1} が #{sum} なので定和性を満しません" if sum != b
end
sum = 0
0.upto(DIMENSION - 1) do |i|
sum += a[i][i]
end
raise "左上からの対角線が #{sum} なので定和性を満しません" if sum != b
sum = 0
0.upto(DIMENSION - 1) do |i|
sum += a[i][DIMENSION - 1 - i]
end
raise "右上からの対角線が #{sum} なので定和性を満しません" if sum != b
end
def self.uniq? m
m.flatten.size == m.flatten.uniq.size
end
def self.format_print m
l = "---" * DIMENSION + "-"
puts l
m.each do |n|
n.each do |e|
print "|"
printf "%02d", e
end
puts "|"
puts l
end
end
def self.simple
a = simple_a
b = simple_b
m = Array.new(DIMENSION) { Array.new (DIMENSION) }
a.each_with_index do |i, j|
i.each_with_index do |k, n|
m[j][n] = (k - 1) * DIMENSION + b[j][n]
end
end
const_sum = (DIMENSION * ((DIMENSION ** 2) +1) / 2)
format_print m
column_check m, const_sum
raise "同じ要素が含まれています" if !uniq? m
end
def self.simple_a
seed = [*1..DIMENSION]
delete_elem = (DIMENSION + 1) / 2
seed.delete(delete_elem)
seed.shuffle!
seed.insert(delete_elem - 1, delete_elem)
a = Array.new(DIMENSION) { seed.clone }
r = delete_elem
0.upto(DIMENSION - 1) do |x|
r -= 1
a[x].rotate!(r)
r = DIMENSION - 1 if r < 0
end
return a
end
def self.simple_b
b = Array.new(DIMENSION) { Array.new(DIMENSION) }
raw_seed = [*1..DIMENSION].shuffle
0.upto(DIMENSION - 1) { |i| b[i][i] = raw_seed[i] }
seed = raw_seed.reverse * DIMENSION
0.upto(DIMENSION - 1) do |x|
point = seed.index(raw_seed[x])
start = x
1.upto(DIMENSION) do |y|
b[start][x] = seed[point]
point += 1
start += 1
start = 0 if start >= b.size
end
end
return b
end
end
Mahou.simple
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment