fork download
  1. #!ruby
  2.  
  3. =begin
  4. お題
  5. 立方体の2色の塗り分けの全種類を展開図で示せ
  6.  
  7. MAP
  8. 0
  9. 1 2 3 4
  10. 5
  11.  
  12. 予想
  13. 全白,全黒 各1通り
  14. 白5黒1,白1黒5 各1通り
  15. 白4黒2 2通り 隣り合う,向かい合う
  16. 白2黒4 2通り 隣り合う,向かい合う
  17. 白3黒3 ? (2通りらしい)
  18. =end
  19.  
  20. DefMap = [
  21. 0b000001,
  22. 0b000010,
  23. 0b000100,
  24. 0b001000,
  25. 0b010000,
  26. 0b100000
  27. ]
  28.  
  29. def rotZ( zahyo )
  30. wrk = zahyo[1]
  31. zahyo[1] = zahyo[2]
  32. zahyo[2] = zahyo[3]
  33. zahyo[3] = zahyo[4]
  34. zahyo[4] = wrk
  35. zahyo
  36. end
  37.  
  38. def rotX( zahyo )
  39. wrk = zahyo[0]
  40. zahyo[0] = zahyo[2]
  41. zahyo[2] = zahyo[5]
  42. zahyo[5] = zahyo[4]
  43. zahyo[4] = wrk
  44. zahyo
  45. end
  46.  
  47. def rotY( zahyo )
  48. wrk = zahyo[0]
  49. zahyo[0] = zahyo[1]
  50. zahyo[1] = zahyo[5]
  51. zahyo[5] = zahyo[3]
  52. zahyo[3] = wrk
  53. zahyo
  54. end
  55.  
  56. def turn( cvmap, num )
  57. mBit = 1
  58. wrk = 0
  59. 6.times{|idx|
  60. wrk |= cvmap[idx] if (num & mBit) != 0
  61. mBit <<= 1
  62. }
  63. wrk
  64. end
  65.  
  66. def prMap( num )
  67. cw = num.to_s(2).gsub(/0/,'').size
  68. puts "#{cw}/#{6-cw}"
  69.  
  70. str = ("%06b" % num).reverse.tr('01',"□■")
  71. puts str[0]
  72. puts str[1..4]
  73. puts str[5]
  74. end
  75.  
  76. def uniPush( cvMapList, datas )
  77. cvMapList << datas unless cvMapList.index( datas )
  78. end
  79.  
  80. #
  81. cvmap = []
  82. cvmap << DefMap.dup
  83. # 確たる根拠のない回転組み合わせ
  84. cv1 = DefMap.dup
  85. 4.times{
  86. uniPush( cvmap, cv1 )
  87. cv2 = cv1.dup
  88. 4.times{
  89. uniPush( cvmap, cv2 )
  90. cv3 = cv2.dup
  91. 3.times{
  92. uniPush( cvmap, rotZ( cv3 ) )
  93. }
  94. cv3 = cv2.dup
  95. 3.times{
  96. uniPush( cvmap, rotX( cv3 ) )
  97. }
  98. rotY( cv2 )
  99. }
  100. cv2 = cv1.dup
  101. 4.times{
  102. uniPush( cvmap, cv2 )
  103. cv3 = cv2.dup
  104. 3.times{
  105. uniPush( cvmap, rotY( cv3 ) )
  106. }
  107. cv3 = cv2.dup
  108. 3.times{
  109. uniPush( cvmap, rotX( cv3 ) )
  110. }
  111. rotZ( cv2 )
  112. }
  113. rotX( cv1 )
  114. }
  115.  
  116.  
  117. solMap = []
  118. 0b1000000.times{|num|
  119. uni = true
  120. cvmap.each{|cv|
  121. if solMap.index( turn(cv,num) )
  122. uni = false
  123. break
  124. end
  125. }
  126. solMap << num if uni
  127. }
  128.  
  129. solMapSort = solMap.sort_by{|x| x.to_s(2).gsub(/0/,'').size } # '1'bit数でソート
  130. solMapSort.each{|num|
  131. prMap( num )
  132. puts
  133. # puts "%06b" % num
  134. }
  135. puts "\n#{solMap.size}通り"
  136.  
Success #stdin #stdout 0.02s 5904KB
stdin
Standard input is empty
stdout
0/6
□
□□□□
□

1/5
■
□□□□
□

2/4
■
■□□□
□

2/4
□
■□■□
□

3/3
■
■■□□
□

3/3
■
■□■□
□

4/2
■
■■■□
□

4/2
□
■■■■
□

5/1
■
■■■■
□

6/0
■
■■■■
■


10通り