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. def check( ab )
  52. return false unless ab.index(0) && ab.index(1) # X,Y 入力を使わない物は枝刈り
  53. fc = [ true, true ] # 出力確定フラグ x,y,c1..c4
  54. nn = NandPiece # 未確定数
  55. oc = [ 0b1010, 0b1100 ] # 出力値(x,y)(00, 10, 01, 11) c1..c4
  56. NandPiece.times{
  57. NandPiece.times{|cn|
  58. next if fc[ cn+2 ]
  59. a, b = ab[2*cn], ab[2*cn+1]
  60. next unless fc[a] && fc[b]
  61. oc[ cn+2 ] = oc[a] & oc[b] ^ 0b1111 # nand
  62. fc[ cn+2 ] = true
  63. nn -= 1
  64. }
  65. break if nn == 0
  66. }
  67. return false unless nn == 0
  68. cn = oc.rindex( 0b0110 ) # xor パターン検索
  69. return false unless cn # unless cn && cn >= 2; として x,y を排除するのは蛇足
  70.  
  71. $ans += 1
  72. print_map2( ab, cn-2 )
  73. end
  74.  
  75. ab = [ 0,0, 0,0, 0,0, 0,0 ]
  76.  
  77. def solve( ab, n = 0 )
  78. return if n > 7
  79. solve( ab, n + 1 )
  80. check( ab ) if n == 7
  81. ab[n] += 1
  82. ab[n] += 1 if n >> 1 == ab[n] - 2 # 出力は入力につなげない (一段のループだけチェック)
  83. if ab[n] > 5
  84. ab[n] = 0
  85. return
  86. end
  87. solve( ab, n )
  88. end
  89.  
  90. #####################################################################
  91.  
  92. solve( ab )
  93. puts "Done. #{$ans}"
  94.  
Success #stdin #stdout 0.91s 6792KB
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