ひとつのサイコロを特定の方向から見たばあい、その「見かけ」は全部で何とおりあるのでしょうか。
Ruby で解いてみました。コード。
table = {E: [3, 2, 6, 1, 5, 4], N: [5, 1, 3, 4, 6, 2], S: [2, 6, 3, 4, 1, 5], W: [4, 2, 1, 6, 5, 3], R: [1, 4, 2, 5, 3, 6], L: [1, 3, 5, 2, 4, 6]} table1 = {} table.each_key {|k| table1[k] = table[k].map(&:pred)} throw = ->(dice) { memo = [dice] stack = [dice] while (dice1 = stack.shift) [:E, :N, :S, :W, :R, :L].each do |c| next_dice = Array.new(6, 0) dice1.each_with_index do |d, i| next_dice[table1[c.to_sym][i]] = d end next if memo.include?(next_dice) memo << next_dice stack << next_dice end end p memo puts memo.size } throw.([1, 2, 3, 4, 5, 6])
転がり方は上の図の N, S, E, W の方向の他、真上から見た左回転(L)と右回転(R)があります。いったん出た「見かけ」は変数 memo に入れておき、重複しないようにしています。幅優先探索で求めています。
結果。
[[1, 2, 3, 4, 5, 6], [4, 2, 1, 6, 5, 3], [2, 6, 3, 4, 1, 5], [5, 1, 3, 4, 6, 2], [3, 2, 6, 1, 5, 4], [1, 3, 5, 2, 4, 6], [1, 4, 2, 5, 3, 6], [6, 2, 4, 3, 5, 1], [2, 3, 1, 6, 4, 5], [5, 4, 1, 6, 3, 2], [4, 1, 5, 2, 6, 3], [4, 6, 2, 5, 1, 3], [6, 5, 3, 4, 2, 1], [3, 6, 5, 2, 1, 4], [2, 4, 6, 1, 3, 5], [3, 1, 2, 5, 6, 4], [5, 3, 6, 1, 4, 2], [1, 5, 4, 3, 2, 6], [2, 1, 4, 3, 6, 5], [5, 6, 4, 3, 1, 2], [6, 4, 5, 2, 3, 1], [6, 3, 2, 5, 4, 1], [3, 5, 1, 6, 2, 4], [4, 5, 6, 1, 2, 3]] 24
24とおりですか。
これはプログラミングで解かなくてもわかりますね。例えば上面を考えてそれは 6とおりあり、真上から見ての回転でそれぞれにつき 4とおりですから、6×4 = 24 とおりか。
なお、上のコードは N, S, E, W, R, L のすべての転がし方を考えていますが、じつは例えば E と N の 2種類の転がし方だけで同じ結果を得ることができます。