#!ruby
=begin
お題
立方体の2色の塗り分けの全種類を展開図で示せ
MAP
0
1 2 3 4
5
予想
全白,全黒 各1通り 「2色の塗り分け」だから一色のみは除外
白5黒1,白1黒5 各1通り
白4黒2 2通り 隣り合う,向かい合う
白2黒4 2通り 隣り合う,向かい合う
白3黒3 ? (2通りらしい)
=end
DefMap = [
0b000001,
0b000010,
0b000100,
0b001000,
0b010000,
0b100000
]
def rotZ( zahyo )
zahyo = [ zahyo[0], zahyo[2], zahyo[3], zahyo[4], zahyo[1], zahyo[5] ]
end
def rotX( zahyo )
zahyo = [ zahyo[2], zahyo[1], zahyo[5], zahyo[3], zahyo[0], zahyo[4] ]
end
def rotY( zahyo )
zahyo = [ zahyo[1], zahyo[5], zahyo[2], zahyo[0], zahyo[4], zahyo[3] ]
end
def turn( cvmap, num )
mBit = 1
wrk = 0
6.times{|idx|
wrk |= cvmap[idx] if (num & mBit) != 0
mBit <<= 1
}
wrk
end
def prMap( num )
# cw = num.to_s(2).gsub(/0/,'').size
# puts "#{cw}/#{6-cw}"
str = ("%06b" % num).reverse.tr('01',"□■")
puts str[0]
puts str[1..4]
puts str[5]
end
def uniPush( cvMapList, datas )
return false if cvMapList.index( datas )
cvMapList << datas
true
end
# 回転パターンの列挙(のはず)
def cvMake( cvmap, cv )
cv0 = rotX( cv.dup )
cvMake( cvmap, cv0 ) if uniPush( cvmap, cv0 )
cv0 = rotY( cv.dup )
cvMake( cvmap, cv0 ) if uniPush( cvmap, cv0 )
cv0 = rotZ( cv.dup )
cvMake( cvmap, cv0 ) if uniPush( cvmap, cv0 )
end
cvmap = []
cvmap << DefMap.dup
cvMake( cvmap, DefMap )
solMap = []
1.upto( 0b11111 ){|num| # 000000排除, 最上位bitは 0 固定 (二色に拘束)
uni = true
cvmap.each{|cv|
next unless solMap.index( turn(cv,num) )
uni = false
break
}
solMap << num if uni
}
solMap.sort_by!{|x| x.to_s(2).gsub(/0/,'').size } # '1'bit数でソート
solMap.each{|num|
prMap( num )
puts
# puts "%06b" % num
}
puts "\n#{solMap.size}通り"
IyFydWJ5Cgo9YmVnaW4K44GK6aGMCueri+aWueS9k+OBrjLoibLjga7loZfjgorliIbjgZHjga7lhajnqK7poZ7jgpLlsZXplovlm7PjgafnpLrjgZsgCgpNQVAKCTAKCTEgMiAzIDQKCTUKCuS6iOaDswoJ5YWo55m9LOWFqOm7kgkJ5ZCEMemAmuOCignjgIwy6Imy44Gu5aGX44KK5YiG44GR44CN44Gg44GL44KJ5LiA6Imy44Gu44G/44Gv6Zmk5aSWCgnnmb016buSMSznmb0x6buSNQnlkIQx6YCa44KKCgnnmb006buSMgky6YCa44KKIOmao+OCiuWQiOOBhizlkJHjgYvjgYTlkIjjgYYKCeeZvTLpu5I0CTLpgJrjgoog6Zqj44KK5ZCI44GGLOWQkeOBi+OBhOWQiOOBhgoJ55m9M+m7kjMJ77yfCSgy6YCa44KK44KJ44GX44GEKQo9ZW5kCgpEZWZNYXAgPSBbCgkwYjAwMDAwMSwKCTBiMDAwMDEwLAoJMGIwMDAxMDAsCgkwYjAwMTAwMCwKCTBiMDEwMDAwLAoJMGIxMDAwMDAKXQoKZGVmIHJvdFooIHphaHlvICkKCXphaHlvID0gWyB6YWh5b1swXSwgemFoeW9bMl0sIHphaHlvWzNdLCB6YWh5b1s0XSwgemFoeW9bMV0sIHphaHlvWzVdIF0KZW5kCgpkZWYgcm90WCggemFoeW8gKQoJemFoeW8gPSBbIHphaHlvWzJdLCB6YWh5b1sxXSwgemFoeW9bNV0sIHphaHlvWzNdLCB6YWh5b1swXSwgemFoeW9bNF0gXQplbmQKCmRlZiByb3RZKCB6YWh5byApCgl6YWh5byA9IFsgemFoeW9bMV0sIHphaHlvWzVdLCB6YWh5b1syXSwgemFoeW9bMF0sIHphaHlvWzRdLCB6YWh5b1szXSBdCmVuZAoKZGVmIHR1cm4oIGN2bWFwLCBudW0gKQoJbUJpdCA9IDEKCXdyayA9IDAKCTYudGltZXN7fGlkeHwKCQl3cmsgfD0gY3ZtYXBbaWR4XQlpZiAobnVtICYgbUJpdCkgIT0gMAoJCW1CaXQgPDw9IDEKCX0KCXdyawplbmQKCmRlZiBwck1hcCggbnVtICkKIwljdyA9IG51bS50b19zKDIpLmdzdWIoLzAvLCcnKS5zaXplCiMJcHV0cyAiI3tjd30vI3s2LWN3fSIKCglzdHIgPSAoIiUwNmIiICUgbnVtKS5yZXZlcnNlLnRyKCcwMScsIuKWoeKWoCIpCglwdXRzIHN0clswXQoJcHV0cyBzdHJbMS4uNF0KCXB1dHMgc3RyWzVdCmVuZAoKZGVmIHVuaVB1c2goIGN2TWFwTGlzdCwgZGF0YXMgKQoJcmV0dXJuIGZhbHNlCWlmIGN2TWFwTGlzdC5pbmRleCggZGF0YXMgKQoJY3ZNYXBMaXN0IDw8IGRhdGFzCgl0cnVlCmVuZAoKIyDlm57ou6Ljg5Hjgr/jg7zjg7Pjga7liJfmjJko44Gu44Gv44GaKQpkZWYgY3ZNYWtlKCBjdm1hcCwgY3YgKQoJY3YwID0gcm90WCggY3YuZHVwICkKCWN2TWFrZSggY3ZtYXAsIGN2MCApCWlmIHVuaVB1c2goIGN2bWFwLCBjdjAgKQoJY3YwID0gcm90WSggY3YuZHVwICkKCWN2TWFrZSggY3ZtYXAsIGN2MCApCWlmIHVuaVB1c2goIGN2bWFwLCBjdjAgKQoJY3YwID0gcm90WiggY3YuZHVwICkKCWN2TWFrZSggY3ZtYXAsIGN2MCApCWlmIHVuaVB1c2goIGN2bWFwLCBjdjAgKQplbmQKCgljdm1hcCA9IFtdCgljdm1hcCA8PCBEZWZNYXAuZHVwCgljdk1ha2UoIGN2bWFwLCBEZWZNYXAgKQoKCXNvbE1hcCA9IFtdCgkxLnVwdG8oIDBiMTExMTEgKXt8bnVtfAkJIyAwMDAwMDDmjpLpmaQsIOacgOS4iuS9jWJpdOOBryAwIOWbuuWumiAo5LqM6Imy44Gr5ouY5p2fKQoJCXVuaSA9IHRydWUKCQljdm1hcC5lYWNoe3xjdnwKCQkJbmV4dAl1bmxlc3Mgc29sTWFwLmluZGV4KCB0dXJuKGN2LG51bSkgKQoJCQl1bmkgPSBmYWxzZQoJCQlicmVhawoJCX0KCQlzb2xNYXAgPDwgbnVtCWlmIHVuaQoJfQoKCXNvbE1hcC5zb3J0X2J5IXt8eHwgeC50b19zKDIpLmdzdWIoLzAvLCcnKS5zaXplIH0JIyAnMSdiaXTmlbDjgafjgr3jg7zjg4gKCXNvbE1hcC5lYWNoe3xudW18CgkJcHJNYXAoIG51bSApCgkJcHV0cwojCQlwdXRzICIlMDZiIiAlIG51bQoJfQoJcHV0cyAiXG4je3NvbE1hcC5zaXplfemAmuOCiiIK