fork download
  1. =begin
  2.  
  3.  
  4. >293 デフォルトの名無しさん 2020/04/27(月) 09:21:19.63 ID:Vk+6u7Hb
  5. > 次は全加算器をやってみよう。
  6. > 4入力セレクタ辺りで限界でしょう。
  7.  
  8. さすがに無理臭いので半加算器でお茶を濁す
  9.  
  10. 半加算器は 5つのNANDゲートで構成できることが分かっている (またはXOR,ORを1各1個)
  11. 全加算器は 2つの半加算器と1つのORゲートで構成できる
  12. ※ 最低1つのNANDゲートの入力は A,Bであることは自明なので、1つ目のNANDゲートの入力はA,Bに固定
  13. ※ その場合の解は 96通り。固定しない場合の解は 768通り。
  14.  
  15. =end
  16.  
  17. $ans = 0
  18. NandPiece = 5
  19. ab = [ 0,1, 0,0, 0,0, 0,0, 0,0 ] # 1つ目のNANDゲートの入力を A,Bに固定
  20.  
  21. def print_map2( ab, c, s )
  22. tbl = %w{ X Y c1 c2 c3 c4 c5 }
  23. ab.each_with_index{|n,i|
  24. m, a = i.divmod(2)
  25. print "#{tbl[n]} "
  26. }
  27. puts " c#{c+1} c#{s+1}"
  28. $ans += 1
  29. end
  30.  
  31. def check( ab )
  32. return false unless ab.index(0) && ab.index(1) # X,Y 入力を使わない物は枝刈り
  33. cnum = [0] * NandPiece # 出力ビットテーブル f(x,y) -> c_, s_
  34. 2.times{|x|
  35. 2.times{|y|
  36. lg = []
  37. c = []
  38. ab.each_with_index{|n,i|
  39. case n
  40. when 0; lg[i] = x
  41. when 1; lg[i] = y
  42. end
  43. }
  44. NandPiece.times{
  45. NandPiece.times{|cn|
  46. next if c[cn]
  47. if lg[2*cn] && lg[2*cn+1]
  48. c[cn] = (lg[2*cn] & lg[2*cn+1]) ^ 1 # nand
  49. ab.each_with_index{|n,i|
  50. case n
  51. when 2; lg[i] = c[0]
  52. when 3; lg[i] = c[1]
  53. when 4; lg[i] = c[2]
  54. when 5; lg[i] = c[3]
  55. end
  56. }
  57. end
  58. }
  59. }
  60. NandPiece.times{|n|
  61. if c[n] && cnum[n]
  62. cnum[n] = (cnum[n] << 1) | c[n]
  63. else
  64. cnum[n] = nil
  65. end
  66. }
  67. return false if cnum.index( nil ) # 枝刈り
  68. }
  69. }
  70. if cnum.index( 0b0001 ) && cnum.index( 0b0110 ) # パターン検索 Half adder C, S
  71. print_map2( ab, cnum.index( 0b0001 ), cnum.index( 0b0110 ) )
  72. end
  73. end
  74.  
  75. def solve( ab, n = 0 )
  76. return if n > 2 * NandPiece - 1
  77. solve( ab, n + 1 )
  78. check( ab ) if n == 2 * NandPiece - 1
  79. ab[n] += 1
  80. ab[n] += 1 if n >> 1 == ab[n] - 2 # 出力は入力につなげない (一段のループだけチェック)
  81. if ab[n] > NandPiece + 1
  82. ab[n] = 0
  83. return
  84. end
  85. solve( ab, n )
  86. end
  87.  
  88. #####################################################################
  89.  
  90. solve( ab, 2 ) # 最初の nand の a,b を X,Y に固定
  91.  
  92.  
Time limit exceeded #stdin #stdout 5s 6320KB
stdin
Standard input is empty
stdout
Standard output is empty