#!ruby
=begin
お題
立方体の2色の塗り分けの全種類を展開図で示せ
MAP
0
1 2 3 4
5
予想
全白,全黒 各1通り
白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 )
wrk = zahyo[1]
zahyo[1] = zahyo[2]
zahyo[2] = zahyo[3]
zahyo[3] = zahyo[4]
zahyo[4] = wrk
zahyo
end
def rotX( zahyo )
wrk = zahyo[0]
zahyo[0] = zahyo[2]
zahyo[2] = zahyo[5]
zahyo[5] = zahyo[4]
zahyo[4] = wrk
zahyo
end
def rotY( zahyo )
wrk = zahyo[0]
zahyo[0] = zahyo[1]
zahyo[1] = zahyo[5]
zahyo[5] = zahyo[3]
zahyo[3] = wrk
zahyo
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 )
cvMapList << datas unless cvMapList.index( datas )
end
#
cvmap = []
cvmap << DefMap.dup
# 確たる根拠のない回転組み合わせ
cv1 = DefMap.dup
4.times{
uniPush( cvmap, cv1 )
cv2 = cv1.dup
4.times{
uniPush( cvmap, cv2 )
cv3 = cv2.dup
3.times{
uniPush( cvmap, rotZ( cv3 ) )
}
cv3 = cv2.dup
3.times{
uniPush( cvmap, rotX( cv3 ) )
}
rotY( cv2 )
}
cv2 = cv1.dup
4.times{
uniPush( cvmap, cv2 )
cv3 = cv2.dup
3.times{
uniPush( cvmap, rotY( cv3 ) )
}
cv3 = cv2.dup
3.times{
uniPush( cvmap, rotX( cv3 ) )
}
rotZ( cv2 )
}
rotX( cv1 )
}
solMap = []
0b1000000.times{|num|
uni = true
cvmap.each{|cv|
if solMap.index( turn(cv,num) )
uni = false
break
end
}
solMap << num if uni
}
solMapSort = solMap.sort_by{|x| x.to_s(2).gsub(/0/,'').size } # '1'bit数でソート
solMapSort.each{|num|
prMap( num )
puts
# puts "%06b" % num
}
puts "\n#{solMap.size}通り"
IyFydWJ5Cgo9YmVnaW4K44GK6aGMCueri+aWueS9k+OBrjLoibLjga7loZfjgorliIbjgZHjga7lhajnqK7poZ7jgpLlsZXplovlm7PjgafnpLrjgZsgCgpNQVAKCTAKCTEgMiAzIDQKCTUKCuS6iOaDswoJ5YWo55m9LOWFqOm7kgkJ5ZCEMemAmuOCigoJ55m9Nem7kjEs55m9Mem7kjUJ5ZCEMemAmuOCigoJ55m9NOm7kjIJMumAmuOCiiDpmqPjgorlkIjjgYYs5ZCR44GL44GE5ZCI44GGCgnnmb0y6buSNAky6YCa44KKIOmao+OCiuWQiOOBhizlkJHjgYvjgYTlkIjjgYYKCeeZvTPpu5IzCe+8nwkoMumAmuOCiuOCieOBl+OBhCkKPWVuZAoKRGVmTWFwID0gWwoJMGIwMDAwMDEsCgkwYjAwMDAxMCwKCTBiMDAwMTAwLAoJMGIwMDEwMDAsCgkwYjAxMDAwMCwKCTBiMTAwMDAwCl0KCmRlZiByb3RaKCB6YWh5byApCgl3cmsgICAgICA9IHphaHlvWzFdCgl6YWh5b1sxXSA9IHphaHlvWzJdCgl6YWh5b1syXSA9IHphaHlvWzNdCgl6YWh5b1szXSA9IHphaHlvWzRdCgl6YWh5b1s0XSA9IHdyawoJemFoeW8KZW5kCgpkZWYgcm90WCggemFoeW8gKQoJd3JrICAgICAgPSB6YWh5b1swXQoJemFoeW9bMF0gPSB6YWh5b1syXQoJemFoeW9bMl0gPSB6YWh5b1s1XQoJemFoeW9bNV0gPSB6YWh5b1s0XQoJemFoeW9bNF0gPSB3cmsKCXphaHlvCmVuZAoKZGVmIHJvdFkoIHphaHlvICkKCXdyayAgICAgID0gemFoeW9bMF0KCXphaHlvWzBdID0gemFoeW9bMV0KCXphaHlvWzFdID0gemFoeW9bNV0KCXphaHlvWzVdID0gemFoeW9bM10KCXphaHlvWzNdID0gd3JrCgl6YWh5bwplbmQKCmRlZiB0dXJuKCBjdm1hcCwgbnVtICkKCW1CaXQgPSAxCgl3cmsgPSAwCgk2LnRpbWVze3xpZHh8CgkJd3JrIHw9IGN2bWFwW2lkeF0JaWYgKG51bSAmIG1CaXQpICE9IDAKCQltQml0IDw8PSAxCgl9Cgl3cmsKZW5kCgpkZWYgcHJNYXAoIG51bSApCgljdyA9IG51bS50b19zKDIpLmdzdWIoLzAvLCcnKS5zaXplCglwdXRzICIje2N3fS8jezYtY3d9IgoKCXN0ciA9ICgiJTA2YiIgJSBudW0pLnJldmVyc2UudHIoJzAxJywi4pah4pagIikKCXB1dHMgc3RyWzBdCglwdXRzIHN0clsxLi40XQoJcHV0cyBzdHJbNV0KZW5kCgpkZWYgdW5pUHVzaCggY3ZNYXBMaXN0LCBkYXRhcyApCgljdk1hcExpc3QgPDwgZGF0YXMJdW5sZXNzIGN2TWFwTGlzdC5pbmRleCggZGF0YXMgKQplbmQKCiMKCWN2bWFwID0gW10KCWN2bWFwIDw8IERlZk1hcC5kdXAKIyDnorrjgZ/jgovmoLnmi6Djga7jgarjgYTlm57ou6LntYTjgb/lkIjjgo/jgZsKCWN2MSA9IERlZk1hcC5kdXAKCTQudGltZXN7CgkJdW5pUHVzaCggY3ZtYXAsIGN2MSApCgkJY3YyID0gY3YxLmR1cAoJCTQudGltZXN7CgkJCXVuaVB1c2goIGN2bWFwLCBjdjIgKQoJCQljdjMgPSBjdjIuZHVwCgkJCTMudGltZXN7CgkJCQl1bmlQdXNoKCBjdm1hcCwgcm90WiggY3YzICkgKQoJCQl9CgkJCWN2MyA9IGN2Mi5kdXAKCQkJMy50aW1lc3sKCQkJCXVuaVB1c2goIGN2bWFwLCByb3RYKCBjdjMgKSApCgkJCX0KCQkJcm90WSggY3YyICkKCQl9CgkJY3YyID0gY3YxLmR1cAoJCTQudGltZXN7CgkJCXVuaVB1c2goIGN2bWFwLCBjdjIgKQoJCQljdjMgPSBjdjIuZHVwCgkJCTMudGltZXN7CgkJCQl1bmlQdXNoKCBjdm1hcCwgcm90WSggY3YzICkgKQoJCQl9CgkJCWN2MyA9IGN2Mi5kdXAKCQkJMy50aW1lc3sKCQkJCXVuaVB1c2goIGN2bWFwLCByb3RYKCBjdjMgKSApCgkJCX0KCQkJcm90WiggY3YyICkKCQl9CgkJcm90WCggY3YxICkKCX0KCgoJc29sTWFwID0gW10KCTBiMTAwMDAwMC50aW1lc3t8bnVtfAoJCXVuaSA9IHRydWUKCQljdm1hcC5lYWNoe3xjdnwKCQkJaWYgc29sTWFwLmluZGV4KCB0dXJuKGN2LG51bSkgKQoJCQkJdW5pID0gZmFsc2UKCQkJCWJyZWFrCgkJCWVuZAoJCX0KCQlzb2xNYXAgPDwgbnVtCWlmIHVuaQoJfQoKCXNvbE1hcFNvcnQgPSBzb2xNYXAuc29ydF9ieXt8eHwgeC50b19zKDIpLmdzdWIoLzAvLCcnKS5zaXplIH0JIyAnMSdiaXTmlbDjgafjgr3jg7zjg4gKCXNvbE1hcFNvcnQuZWFjaHt8bnVtfAoJCXByTWFwKCBudW0gKQoJCXB1dHMKIwkJcHV0cyAiJTA2YiIgJSBudW0KCX0KCXB1dHMgIlxuI3tzb2xNYXAuc2l6ZX3pgJrjgooiCg==