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. # どこにもつながらない出力は無いはず
  30. # 出力 X,Y, c1,c2,c3,c4 0..5
  31. # 入力 a1,b1, a2,b2, a3,b3, a4,b4 ab[0..7]
  32. # c1..4 いずれか -> Z
  33.  
  34. $ans = 0
  35. NandPiece = 4
  36. Ntbl = %w{ X Y c1 c2 c3 c4 }
  37.  
  38. def print_map2( ab, z )
  39. puts [ab.map{|n| Ntbl[n]}, "c#{z+1}"].join(' ')
  40. end
  41.  
  42. def print_map( ab, z )
  43. chAB = %w{ a b }
  44. ab.each_with_index{|n,i|
  45. m, a = i.divmod(2)
  46. puts " %3s -> %s%d" % [ Ntbl[n], chAB[a], m+1 ]
  47. }
  48. puts " c#{z+1} -> Z\n\n"
  49. end
  50.  
  51.  
  52. def check( ab )
  53. return false unless ab.index(0) && ab.index(1) # X,Y 入力を使わない物は枝刈り
  54. cnum = [0] * NandPiece # 出力ビットテーブル f(x,y) -> c_
  55. 2.times{|x|
  56. 2.times{|y|
  57. oc = [ x, y ] # 出力値 x,y,c1..c4
  58. fc = [ true, true ] # 出力確定フラグ x,y,c1..c4
  59. nn = NandPiece # 未確定数
  60. NandPiece.times{
  61. NandPiece.times{|cn|
  62. next if fc[ cn+2 ]
  63. a, b = ab[2*cn], ab[2*cn+1]
  64. next unless fc[a] && fc[b]
  65. oc[ cn+2 ] = (oc[a] & oc[b]) ^ 1 # nand
  66. fc[ cn+2 ] = true
  67. nn -= 1
  68. }
  69. break if nn == 0
  70. }
  71. return false unless nn == 0 # 枝刈り
  72. NandPiece.times{|n|
  73. cnum[n] = (cnum[n] << 1) | oc[n+2]
  74. }
  75. }
  76. }
  77. cn = cnum.index( 0b0110 ) # xor パターン検索
  78. return false unless cn
  79.  
  80. $ans += 1
  81. print_map2( ab, cn )
  82. end
  83.  
  84. ab = [ 0,0, 0,0, 0,0, 0,0 ]
  85.  
  86. def solve( ab, n = 0 )
  87. return if n > 7
  88. solve( ab, n + 1 )
  89. check( ab ) if n == 7
  90. ab[n] += 1
  91. ab[n] += 1 if n >> 1 == ab[n] - 2 # 出力は入力につなげない (一段のループだけチェック)
  92. if ab[n] > 5
  93. ab[n] = 0
  94. return
  95. end
  96. solve( ab, n )
  97. end
  98.  
  99. #####################################################################
  100.  
  101. solve( ab )
  102. puts "Done. #{$ans}"
  103.  
Success #stdin #stdout 2.01s 6864KB
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