fork download
  1. =begin
  2.  
  3. 286 デフォルトの名無しさん 2020/04/24(金) 20:56:21.49 ID:pA5GOauV
  4.  
  5. お題
  6. XORゲートは4つのNANDゲートで構成できることが知られている
  7. この構成方法をプログラムで探索せよ
  8.  
  9. i番目のNANDゲートの入力を(ai,bi)、出力をciとする
  10. XORゲートの入力を(X,Y)、出力をZとする
  11.  
  12. 出力例
  13. X->a1
  14. Y->b1
  15. X->a2
  16. c1->b2
  17. Y->a3
  18. c1->b3
  19. c2->a4
  20. c3->b4
  21. c4->Z
  22.  
  23. =end
  24.  
  25. # 自由度は入力の接続先。出力のどれかと必ず接続する。
  26. # 入力同士は接続できる (同じ出力に接続できる)
  27. # 出力同士は接続できない
  28. # どこにもつながらない出力は無いはず
  29. # 出力 X,Y, c1,c2,c3,c4 0..5
  30. # 入力 a1,b1, a2,b2, a3,b3, a4,b4 ab[0..7]
  31. # c1..4 いずれか -> Z
  32.  
  33. $ans = 0
  34. NandPiece = 4
  35. Ntbl = %w{ X Y c1 c2 c3 c4 }
  36.  
  37. def print_map2( ab, z )
  38. puts [ab.map{|n| Ntbl[n]}, "c#{z+1}"].join(' ')
  39. end
  40.  
  41. def print_map( ab, z )
  42. chAB = %w{ a b }
  43. ab.each_with_index{|n,i|
  44. m, a = i.divmod(2)
  45. puts " %3s -> %s%d" % [ Ntbl[n], chAB[a], m+1 ]
  46. }
  47. puts " c#{z+1} -> Z\n\n"
  48. end
  49.  
  50. def check( ab )
  51. return false unless ab.index(0) && ab.index(1) # X,Y 入力を使わない物は枝刈り
  52. cnum = [0] * NandPiece # 出力ビットテーブル f(x,y) -> c_
  53. pass2 = []
  54. # pass1
  55. oc = [ 0, 0 ] # 出力値 x,y,c1..c4
  56. fc = [ true, true ] # 出力確定フラグ x,y,c1..c4
  57. nn = NandPiece # 未確定数
  58. pass2 = []
  59. NandPiece.times{
  60. NandPiece.times{|cn|
  61. next if fc[ cn+2 ]
  62. a, b = ab[2*cn], ab[2*cn+1]
  63. next unless fc[a] && fc[b]
  64. oc[ cn+2 ] = (oc[a] & oc[b]) ^ 1 # nand
  65. fc[ cn+2 ] = true
  66. nn -= 1
  67. pass2 << cn
  68. }
  69. break if nn == 0
  70. }
  71. return false unless nn == 0 # 枝刈り
  72. NandPiece.times{|n| cnum[n] = oc[n+2] }
  73. # pass2
  74. 1.upto(3){|i|
  75. oc = [ i[1], i[0] ]
  76. pass2.each{|cn|
  77. oc[ cn+2 ] = (oc[ab[2*cn]] & oc[ab[2*cn+1]]) ^ 1
  78. }
  79. NandPiece.times{|n| cnum[n] = (cnum[n] << 1) | oc[n+2] }
  80. }
  81.  
  82. cn = cnum.index( 0b0110 ) # xor パターン検索
  83. return false unless cn
  84.  
  85. $ans += 1
  86. print_map2( ab, cn )
  87. end
  88.  
  89. ab = [ 0,0, 0,0, 0,0, 0,0 ]
  90.  
  91. def solve( ab, n = 0 )
  92. return if n > 7
  93. solve( ab, n + 1 )
  94. check( ab ) if n == 7
  95. ab[n] += 1
  96. ab[n] += 1 if n >> 1 == ab[n] - 2 # 出力は入力につなげない (一段のループだけチェック)
  97. if ab[n] > 5
  98. ab[n] = 0
  99. return
  100. end
  101. solve( ab, n )
  102. end
  103.  
  104. #####################################################################
  105.  
  106. solve( ab )
  107. puts "Done. #{$ans}"
  108.  
Success #stdin #stdout 1.51s 6872KB
stdin
Standard input is empty
stdout
X Y X c1 Y c1 c2 c3 c4
X Y X c1 Y c1 c3 c2 c4
X Y X c1 c1 Y c2 c3 c4
X Y X c1 c1 Y c3 c2 c4
X Y X c1 c2 c4 Y c1 c3
X Y X c1 c2 c4 c1 Y c3
X Y X c1 c4 c2 Y c1 c3
X Y X c1 c4 c2 c1 Y c3
X Y Y c1 X c1 c2 c3 c4
X Y Y c1 X c1 c3 c2 c4
X Y Y c1 c1 X c2 c3 c4
X Y Y c1 c1 X c3 c2 c4
X Y Y c1 c2 c4 X c1 c3
X Y Y c1 c2 c4 c1 X c3
X Y Y c1 c4 c2 X c1 c3
X Y Y c1 c4 c2 c1 X c3
X Y c1 X Y c1 c2 c3 c4
X Y c1 X Y c1 c3 c2 c4
X Y c1 X c1 Y c2 c3 c4
X Y c1 X c1 Y c3 c2 c4
X Y c1 X c2 c4 Y c1 c3
X Y c1 X c2 c4 c1 Y c3
X Y c1 X c4 c2 Y c1 c3
X Y c1 X c4 c2 c1 Y c3
X Y c1 Y X c1 c2 c3 c4
X Y c1 Y X c1 c3 c2 c4
X Y c1 Y c1 X c2 c3 c4
X Y c1 Y c1 X c3 c2 c4
X Y c1 Y c2 c4 X c1 c3
X Y c1 Y c2 c4 c1 X c3
X Y c1 Y c4 c2 X c1 c3
X Y c1 Y c4 c2 c1 X c3
X Y c3 c4 X c1 Y c1 c2
X Y c3 c4 X c1 c1 Y c2
X Y c3 c4 Y c1 X c1 c2
X Y c3 c4 Y c1 c1 X c2
X Y c3 c4 c1 X Y c1 c2
X Y c3 c4 c1 X c1 Y c2
X Y c3 c4 c1 Y X c1 c2
X Y c3 c4 c1 Y c1 X c2
X Y c4 c3 X c1 Y c1 c2
X Y c4 c3 X c1 c1 Y c2
X Y c4 c3 Y c1 X c1 c2
X Y c4 c3 Y c1 c1 X c2
X Y c4 c3 c1 X Y c1 c2
X Y c4 c3 c1 X c1 Y c2
X Y c4 c3 c1 Y X c1 c2
X Y c4 c3 c1 Y c1 X c2
X c2 X Y Y c2 c1 c3 c4
X c2 X Y Y c2 c3 c1 c4
X c2 X Y c1 c4 Y c2 c3
X c2 X Y c1 c4 c2 Y c3
X c2 X Y c2 Y c1 c3 c4
X c2 X Y c2 Y c3 c1 c4
X c2 X Y c4 c1 Y c2 c3
X c2 X Y c4 c1 c2 Y c3
X c2 Y X Y c2 c1 c3 c4
X c2 Y X Y c2 c3 c1 c4
X c2 Y X c1 c4 Y c2 c3
X c2 Y X c1 c4 c2 Y c3
X c2 Y X c2 Y c1 c3 c4
X c2 Y X c2 Y c3 c1 c4
X c2 Y X c4 c1 Y c2 c3
X c2 Y X c4 c1 c2 Y c3
X c3 Y c3 X Y c1 c2 c4
X c3 Y c3 X Y c2 c1 c4
X c3 Y c3 Y X c1 c2 c4
X c3 Y c3 Y X c2 c1 c4
X c3 c1 c4 X Y Y c3 c2
X c3 c1 c4 X Y c3 Y c2
X c3 c1 c4 Y X Y c3 c2
X c3 c1 c4 Y X c3 Y c2
X c3 c3 Y X Y c1 c2 c4
X c3 c3 Y X Y c2 c1 c4
X c3 c3 Y Y X c1 c2 c4
X c3 c3 Y Y X c2 c1 c4
X c3 c4 c1 X Y Y c3 c2
X c3 c4 c1 X Y c3 Y c2
X c3 c4 c1 Y X Y c3 c2
X c3 c4 c1 Y X c3 Y c2
X c4 Y c4 c1 c2 X Y c3
X c4 Y c4 c1 c2 Y X c3
X c4 Y c4 c2 c1 X Y c3
X c4 Y c4 c2 c1 Y X c3
X c4 c1 c3 Y c4 X Y c2
X c4 c1 c3 Y c4 Y X c2
X c4 c1 c3 c4 Y X Y c2
X c4 c1 c3 c4 Y Y X c2
X c4 c3 c1 Y c4 X Y c2
X c4 c3 c1 Y c4 Y X c2
X c4 c3 c1 c4 Y X Y c2
X c4 c3 c1 c4 Y Y X c2
X c4 c4 Y c1 c2 X Y c3
X c4 c4 Y c1 c2 Y X c3
X c4 c4 Y c2 c1 X Y c3
X c4 c4 Y c2 c1 Y X c3
Y X X c1 Y c1 c2 c3 c4
Y X X c1 Y c1 c3 c2 c4
Y X X c1 c1 Y c2 c3 c4
Y X X c1 c1 Y c3 c2 c4
Y X X c1 c2 c4 Y c1 c3
Y X X c1 c2 c4 c1 Y c3
Y X X c1 c4 c2 Y c1 c3
Y X X c1 c4 c2 c1 Y c3
Y X Y c1 X c1 c2 c3 c4
Y X Y c1 X c1 c3 c2 c4
Y X Y c1 c1 X c2 c3 c4
Y X Y c1 c1 X c3 c2 c4
Y X Y c1 c2 c4 X c1 c3
Y X Y c1 c2 c4 c1 X c3
Y X Y c1 c4 c2 X c1 c3
Y X Y c1 c4 c2 c1 X c3
Y X c1 X Y c1 c2 c3 c4
Y X c1 X Y c1 c3 c2 c4
Y X c1 X c1 Y c2 c3 c4
Y X c1 X c1 Y c3 c2 c4
Y X c1 X c2 c4 Y c1 c3
Y X c1 X c2 c4 c1 Y c3
Y X c1 X c4 c2 Y c1 c3
Y X c1 X c4 c2 c1 Y c3
Y X c1 Y X c1 c2 c3 c4
Y X c1 Y X c1 c3 c2 c4
Y X c1 Y c1 X c2 c3 c4
Y X c1 Y c1 X c3 c2 c4
Y X c1 Y c2 c4 X c1 c3
Y X c1 Y c2 c4 c1 X c3
Y X c1 Y c4 c2 X c1 c3
Y X c1 Y c4 c2 c1 X c3
Y X c3 c4 X c1 Y c1 c2
Y X c3 c4 X c1 c1 Y c2
Y X c3 c4 Y c1 X c1 c2
Y X c3 c4 Y c1 c1 X c2
Y X c3 c4 c1 X Y c1 c2
Y X c3 c4 c1 X c1 Y c2
Y X c3 c4 c1 Y X c1 c2
Y X c3 c4 c1 Y c1 X c2
Y X c4 c3 X c1 Y c1 c2
Y X c4 c3 X c1 c1 Y c2
Y X c4 c3 Y c1 X c1 c2
Y X c4 c3 Y c1 c1 X c2
Y X c4 c3 c1 X Y c1 c2
Y X c4 c3 c1 X c1 Y c2
Y X c4 c3 c1 Y X c1 c2
Y X c4 c3 c1 Y c1 X c2
Y c2 X Y X c2 c1 c3 c4
Y c2 X Y X c2 c3 c1 c4
Y c2 X Y c1 c4 X c2 c3
Y c2 X Y c1 c4 c2 X c3
Y c2 X Y c2 X c1 c3 c4
Y c2 X Y c2 X c3 c1 c4
Y c2 X Y c4 c1 X c2 c3
Y c2 X Y c4 c1 c2 X c3
Y c2 Y X X c2 c1 c3 c4
Y c2 Y X X c2 c3 c1 c4
Y c2 Y X c1 c4 X c2 c3
Y c2 Y X c1 c4 c2 X c3
Y c2 Y X c2 X c1 c3 c4
Y c2 Y X c2 X c3 c1 c4
Y c2 Y X c4 c1 X c2 c3
Y c2 Y X c4 c1 c2 X c3
Y c3 X c3 X Y c1 c2 c4
Y c3 X c3 X Y c2 c1 c4
Y c3 X c3 Y X c1 c2 c4
Y c3 X c3 Y X c2 c1 c4
Y c3 c1 c4 X Y X c3 c2
Y c3 c1 c4 X Y c3 X c2
Y c3 c1 c4 Y X X c3 c2
Y c3 c1 c4 Y X c3 X c2
Y c3 c3 X X Y c1 c2 c4
Y c3 c3 X X Y c2 c1 c4
Y c3 c3 X Y X c1 c2 c4
Y c3 c3 X Y X c2 c1 c4
Y c3 c4 c1 X Y X c3 c2
Y c3 c4 c1 X Y c3 X c2
Y c3 c4 c1 Y X X c3 c2
Y c3 c4 c1 Y X c3 X c2
Y c4 X c4 c1 c2 X Y c3
Y c4 X c4 c1 c2 Y X c3
Y c4 X c4 c2 c1 X Y c3
Y c4 X c4 c2 c1 Y X c3
Y c4 c1 c3 X c4 X Y c2
Y c4 c1 c3 X c4 Y X c2
Y c4 c1 c3 c4 X X Y c2
Y c4 c1 c3 c4 X Y X c2
Y c4 c3 c1 X c4 X Y c2
Y c4 c3 c1 X c4 Y X c2
Y c4 c3 c1 c4 X X Y c2
Y c4 c3 c1 c4 X Y X c2
Y c4 c4 X c1 c2 X Y c3
Y c4 c4 X c1 c2 Y X c3
Y c4 c4 X c2 c1 X Y c3
Y c4 c4 X c2 c1 Y X c3
c2 X X Y Y c2 c1 c3 c4
c2 X X Y Y c2 c3 c1 c4
c2 X X Y c1 c4 Y c2 c3
c2 X X Y c1 c4 c2 Y c3
c2 X X Y c2 Y c1 c3 c4
c2 X X Y c2 Y c3 c1 c4
c2 X X Y c4 c1 Y c2 c3
c2 X X Y c4 c1 c2 Y c3
c2 X Y X Y c2 c1 c3 c4
c2 X Y X Y c2 c3 c1 c4
c2 X Y X c1 c4 Y c2 c3
c2 X Y X c1 c4 c2 Y c3
c2 X Y X c2 Y c1 c3 c4
c2 X Y X c2 Y c3 c1 c4
c2 X Y X c4 c1 Y c2 c3
c2 X Y X c4 c1 c2 Y c3
c2 Y X Y X c2 c1 c3 c4
c2 Y X Y X c2 c3 c1 c4
c2 Y X Y c1 c4 X c2 c3
c2 Y X Y c1 c4 c2 X c3
c2 Y X Y c2 X c1 c3 c4
c2 Y X Y c2 X c3 c1 c4
c2 Y X Y c4 c1 X c2 c3
c2 Y X Y c4 c1 c2 X c3
c2 Y Y X X c2 c1 c3 c4
c2 Y Y X X c2 c3 c1 c4
c2 Y Y X c1 c4 X c2 c3
c2 Y Y X c1 c4 c2 X c3
c2 Y Y X c2 X c1 c3 c4
c2 Y Y X c2 X c3 c1 c4
c2 Y Y X c4 c1 X c2 c3
c2 Y Y X c4 c1 c2 X c3
c2 c3 X c4 Y c4 X Y c1
c2 c3 X c4 Y c4 Y X c1
c2 c3 X c4 c4 Y X Y c1
c2 c3 X c4 c4 Y Y X c1
c2 c3 Y c4 X c4 X Y c1
c2 c3 Y c4 X c4 Y X c1
c2 c3 Y c4 c4 X X Y c1
c2 c3 Y c4 c4 X Y X c1
c2 c3 c4 X Y c4 X Y c1
c2 c3 c4 X Y c4 Y X c1
c2 c3 c4 X c4 Y X Y c1
c2 c3 c4 X c4 Y Y X c1
c2 c3 c4 Y X c4 X Y c1
c2 c3 c4 Y X c4 Y X c1
c2 c3 c4 Y c4 X X Y c1
c2 c3 c4 Y c4 X Y X c1
c2 c4 X c3 X Y Y c3 c1
c2 c4 X c3 X Y c3 Y c1
c2 c4 X c3 Y X Y c3 c1
c2 c4 X c3 Y X c3 Y c1
c2 c4 Y c3 X Y X c3 c1
c2 c4 Y c3 X Y c3 X c1
c2 c4 Y c3 Y X X c3 c1
c2 c4 Y c3 Y X c3 X c1
c2 c4 c3 X X Y Y c3 c1
c2 c4 c3 X X Y c3 Y c1
c2 c4 c3 X Y X Y c3 c1
c2 c4 c3 X Y X c3 Y c1
c2 c4 c3 Y X Y X c3 c1
c2 c4 c3 Y X Y c3 X c1
c2 c4 c3 Y Y X X c3 c1
c2 c4 c3 Y Y X c3 X c1
c3 X Y c3 X Y c1 c2 c4
c3 X Y c3 X Y c2 c1 c4
c3 X Y c3 Y X c1 c2 c4
c3 X Y c3 Y X c2 c1 c4
c3 X c1 c4 X Y Y c3 c2
c3 X c1 c4 X Y c3 Y c2
c3 X c1 c4 Y X Y c3 c2
c3 X c1 c4 Y X c3 Y c2
c3 X c3 Y X Y c1 c2 c4
c3 X c3 Y X Y c2 c1 c4
c3 X c3 Y Y X c1 c2 c4
c3 X c3 Y Y X c2 c1 c4
c3 X c4 c1 X Y Y c3 c2
c3 X c4 c1 X Y c3 Y c2
c3 X c4 c1 Y X Y c3 c2
c3 X c4 c1 Y X c3 Y c2
c3 Y X c3 X Y c1 c2 c4
c3 Y X c3 X Y c2 c1 c4
c3 Y X c3 Y X c1 c2 c4
c3 Y X c3 Y X c2 c1 c4
c3 Y c1 c4 X Y X c3 c2
c3 Y c1 c4 X Y c3 X c2
c3 Y c1 c4 Y X X c3 c2
c3 Y c1 c4 Y X c3 X c2
c3 Y c3 X X Y c1 c2 c4
c3 Y c3 X X Y c2 c1 c4
c3 Y c3 X Y X c1 c2 c4
c3 Y c3 X Y X c2 c1 c4
c3 Y c4 c1 X Y X c3 c2
c3 Y c4 c1 X Y c3 X c2
c3 Y c4 c1 Y X X c3 c2
c3 Y c4 c1 Y X c3 X c2
c3 c2 X c4 Y c4 X Y c1
c3 c2 X c4 Y c4 Y X c1
c3 c2 X c4 c4 Y X Y c1
c3 c2 X c4 c4 Y Y X c1
c3 c2 Y c4 X c4 X Y c1
c3 c2 Y c4 X c4 Y X c1
c3 c2 Y c4 c4 X X Y c1
c3 c2 Y c4 c4 X Y X c1
c3 c2 c4 X Y c4 X Y c1
c3 c2 c4 X Y c4 Y X c1
c3 c2 c4 X c4 Y X Y c1
c3 c2 c4 X c4 Y Y X c1
c3 c2 c4 Y X c4 X Y c1
c3 c2 c4 Y X c4 Y X c1
c3 c2 c4 Y c4 X X Y c1
c3 c2 c4 Y c4 X Y X c1
c3 c4 X Y X c2 Y c2 c1
c3 c4 X Y X c2 c2 Y c1
c3 c4 X Y Y c2 X c2 c1
c3 c4 X Y Y c2 c2 X c1
c3 c4 X Y c2 X Y c2 c1
c3 c4 X Y c2 X c2 Y c1
c3 c4 X Y c2 Y X c2 c1
c3 c4 X Y c2 Y c2 X c1
c3 c4 Y X X c2 Y c2 c1
c3 c4 Y X X c2 c2 Y c1
c3 c4 Y X Y c2 X c2 c1
c3 c4 Y X Y c2 c2 X c1
c3 c4 Y X c2 X Y c2 c1
c3 c4 Y X c2 X c2 Y c1
c3 c4 Y X c2 Y X c2 c1
c3 c4 Y X c2 Y c2 X c1
c4 X Y c4 c1 c2 X Y c3
c4 X Y c4 c1 c2 Y X c3
c4 X Y c4 c2 c1 X Y c3
c4 X Y c4 c2 c1 Y X c3
c4 X c1 c3 Y c4 X Y c2
c4 X c1 c3 Y c4 Y X c2
c4 X c1 c3 c4 Y X Y c2
c4 X c1 c3 c4 Y Y X c2
c4 X c3 c1 Y c4 X Y c2
c4 X c3 c1 Y c4 Y X c2
c4 X c3 c1 c4 Y X Y c2
c4 X c3 c1 c4 Y Y X c2
c4 X c4 Y c1 c2 X Y c3
c4 X c4 Y c1 c2 Y X c3
c4 X c4 Y c2 c1 X Y c3
c4 X c4 Y c2 c1 Y X c3
c4 Y X c4 c1 c2 X Y c3
c4 Y X c4 c1 c2 Y X c3
c4 Y X c4 c2 c1 X Y c3
c4 Y X c4 c2 c1 Y X c3
c4 Y c1 c3 X c4 X Y c2
c4 Y c1 c3 X c4 Y X c2
c4 Y c1 c3 c4 X X Y c2
c4 Y c1 c3 c4 X Y X c2
c4 Y c3 c1 X c4 X Y c2
c4 Y c3 c1 X c4 Y X c2
c4 Y c3 c1 c4 X X Y c2
c4 Y c3 c1 c4 X Y X c2
c4 Y c4 X c1 c2 X Y c3
c4 Y c4 X c1 c2 Y X c3
c4 Y c4 X c2 c1 X Y c3
c4 Y c4 X c2 c1 Y X c3
c4 c2 X c3 X Y Y c3 c1
c4 c2 X c3 X Y c3 Y c1
c4 c2 X c3 Y X Y c3 c1
c4 c2 X c3 Y X c3 Y c1
c4 c2 Y c3 X Y X c3 c1
c4 c2 Y c3 X Y c3 X c1
c4 c2 Y c3 Y X X c3 c1
c4 c2 Y c3 Y X c3 X c1
c4 c2 c3 X X Y Y c3 c1
c4 c2 c3 X X Y c3 Y c1
c4 c2 c3 X Y X Y c3 c1
c4 c2 c3 X Y X c3 Y c1
c4 c2 c3 Y X Y X c3 c1
c4 c2 c3 Y X Y c3 X c1
c4 c2 c3 Y Y X X c3 c1
c4 c2 c3 Y Y X c3 X c1
c4 c3 X Y X c2 Y c2 c1
c4 c3 X Y X c2 c2 Y c1
c4 c3 X Y Y c2 X c2 c1
c4 c3 X Y Y c2 c2 X c1
c4 c3 X Y c2 X Y c2 c1
c4 c3 X Y c2 X c2 Y c1
c4 c3 X Y c2 Y X c2 c1
c4 c3 X Y c2 Y c2 X c1
c4 c3 Y X X c2 Y c2 c1
c4 c3 Y X X c2 c2 Y c1
c4 c3 Y X Y c2 X c2 c1
c4 c3 Y X Y c2 c2 X c1
c4 c3 Y X c2 X Y c2 c1
c4 c3 Y X c2 X c2 Y c1
c4 c3 Y X c2 Y X c2 c1
c4 c3 Y X c2 Y c2 X c1
Done. 384