NAND kapılarını kullanarak 4 köşeli bir Bağlantı Test Cihazı oluşturun


12

Bir bağlı grafiği herhangi iki köşe arasında bir yol içeren bir grafiktir.

Meydan okuma

4 tepe grafiğinin bağlı olup olmadığını belirleyen [2 girişli NAND geçidi] devresi oluşturun.
(Bir geçidin 2 giriş için aynı giriş bit veya başka geçit olabilir.)
Çıkış doğru grafik başka bir şekilde bağlanmış ve sahte olup olmadığını.

Giriş

4 köşeli basit bir grafiğin altı olası kenarı :

[ 0 e 1 , 0 e 2 , 1 e 2 , 0 e 3 , 1 e 3 , 2 e 3 ]

burada bir E b temsil uçları arasında bir kenar olup olmadığını , bir ve b

Bağlantılılık aşağıdaki koşullara eşdeğerdir:

  • 3'ten az giriş Doğru ise, False (Çıktı) çıkışını yapın.

  • 3'ten fazla giriş True ise True çıkışını verin.

  • Tam olarak 3 giriş doğruysa ve bir üçgen oluşturuyorsa, False çıktısını alın.

  • Aksi takdirde, True çıktısını alın.

En az sayıda kapıyı kullanan cevap kazanır. Bağlar
en düşük devre derinliği (girişten çıkışa en uzun yolların uzunluğu) ile kırılacaktır .


Giriş formatını daha ayrıntılı belirtebilir misiniz?
LegionMammal978

iej yoktur ya da bir olup olmadığını göre doğru veya yanlış olduğu kenar gelen tepe i tepe j.

Girdi olarak alınabilir 0ve 1? Çıktıya ne dersiniz?
TheCoffeeCup

3
@TheCoffeeCup Bu bir mantık devresi tasarım problemidir, kod golfü değildir .
lirtosiast

@ThomasKwa Whoops, fark etmedi.
TheCoffeeCup

Yanıtlar:


4

30 NAND

Ne zaman 1 alacağımızı sormak yerine, ne zaman 0 alacağımızı sordum. Bu şekilde sormak daha iyidir çünkü 1'den daha az 0 vardır.

İşte kenar sayısına göre dağılım (pascal üçgeninin 6. satırı)

Edges     0  1  2  3  4  5  6
Frequency 1  6 15 20 15  6  1 (total 64)
Output    0  0  0  *  1  1  1
* = 0 if triangle (4 possibilities) 1 if claw (4 possibilities) 
1 if two opposite edges and one other (12 possibilities)

Soruyu bu şekilde sorarak, aşağıdaki diyagramı ve ifadeyi alıyoruz

 ___D___
|\     /|
| E   F |
|  \ /  |
A   X   C
|  / \  |
| /   \ |
|/__B__\|

(A|C|D|B)&(A|D|E)&(D|B|E|F)&(C|B|E)&(A|C|E|F)&(D|F|C)&(A|F|B) 

Çıktının varsayılan olarak 1 olacağını, ancak aşağıdaki koşullardan herhangi birinde 0 olarak değişeceğini varsayıyoruz.

Bitişik kenarlar için 1. 0 (test 3 girişi)

İki karşılıklı çift çift için 0 (test 4 girişi)

Yukarıdaki terimler zaten aşağıdaki gibi gruplandırılmalarını sağlayacak şekilde sıralanmıştır. (Bu arada, ifadenin bu versiyonu AFB tepe noktası etrafında dönel olarak simetriktir.)

((A|D)|((C|B)&E))&((B|E)|((D|F)&C))&((C|F)|((A|E)&D))&(A|F|B)    =6 inverters
   1      1  1       1      1  1       1      1  1      1        =10 (7 OR with both inputs inverted, 3 NAND)
      2                 2                 2               2      =8  (4 OR with one input inverted)
                 2                 2                 2           =6  (3 AND) 
                                                        Total    =30

Her biri için puan &veya |sembolün altına yerleştirilir ve aşağıdaki gibi yaslanır:

Seviye 0: Her giriş için bir invertöre yatırım yapıyoruz: 6 NANDS

Seviye 1: Girişe bir invertör (toplam 3 NANDS) koyarak bir NAND geçidinden bir OR oluşturabiliriz, ancak önceki adımda zaten 6 NAND'a yatırım yaptığımız için 7 NAND geçidinden 7 VEYA geçidi yapabiliriz. Ayrıca 3 VE kapıya ihtiyacımız var. Bunlar için, sadece NAND'ları kullanacağız ve çıktıyı ters çevireceğiz. 10 NAND

Seviye 2: Yine NAND kapılarından 4 VEYA kapı inşa ediyoruz. Her durumda bir OR geçidinden 1 giriş var, bu yüzden bunu tersine çevirmeliyiz. Ancak diğer giriş zaten ters çevrilmiştir (önceki adımdaki NAND'lerden birinden &üç durumda bir sembole karşılık gelen ve sonuncusundaki bir invertörden geliyor), bu nedenle her OR işlevselliği için sadece 2 kapıya ihtiyacımız var. 4 * 2 = 8

Seviye 3: Şimdi dört çıkışı birlikte VE yapmamız gerekiyor. Bu, her biri 2 NAND'den yapılmış 3 AND kapısı gerektirir, 3 * 2 = 6

Bu, toplam |1 veya 3 + 1 + 4 = 8 NAND seviyesi olan dallar için maksimum 2 + 2 + 4 = 8 NAND derinliğine sahip toplam 30 NAND geçidi &.

Aşağıdaki Ruby betiği, yukarıdaki ifadenin geçerli olduğunu görsel olarak doğrular.

64.times{|i|
  a=i%2
  b=i/2%2
  c=i/4%2
  d=i/8%2
  e=i/16%2 
  f=i/32%2

puts i, ((a|d)|((c|b)&e))&((b|e)|((d|f)&c))&((c|f)|((a|e)&d))&(a|f|b)

puts " ___#{d}___
|\\     /|
| #{e}   #{f} |
|  \\ /  |
#{a}   X   #{c}
|  / \\  |
| /   \\ |
|/__#{b}__\\|


"
}

7

19 NAND

Bundan daha basit bir devre yoktur.

Resmin altında test etmek için kod var. Anlamaya gelince, bu zor. Orada birkaç IF kapısı vardır ve girişler, analiz için tek tek eklenen serbest köşe çizgileri ile bir üçgen şeklinde gruplandırılmıştır, ancak basit bir şekilde değil. Birisi bunu anlamayı başarırsa, etkileneceğim.

resim açıklamasını buraya girin

Testli verilog kodu:

// 4-vertex Connectedness Tester                                                                  
// Minimal at 19 NANDs                                                                            
//                                                                                                
// By Kim Øyhus 2018 (c) into (CC BY-SA 3.0)                                                      
// This work is licensed under the Creative Commons Attribution 3.0                               
// Unported License. To view a copy of this license, visit                                        
// https://creativecommons.org/licenses/by-sa/3.0/                                                
//                                                                                                
// This is my entry to win this Programming Puzzle & Code Golf                                    
// at Stack Exchange:                                                                             
// /codegolf/69912/build-a-4-vertex-connectedness-tester-using-nand-gates/                                                                                      
//                                                                                                
// I am sure there are no simpler solutions to this problem.                                      
// It has a logical depth of 11, which is deeper than                                             
// circuits using a few more NANDs.                                                               

module counting6 ( in_000, in_001, in_002, in_003, in_004, in_005, in_006, out000 );
  input  in_000, in_001, in_002, in_003, in_004, in_005, in_006;
  output out000;
  wire   wir000, wir001, wir002, wir003, wir004, wir005, wir006, wir007, wir008, wir009, wir010, wir011, wir012, wir013, wir014, wir015, wir016, wir017;

  nand gate000 ( wir000, in_000, in_000 );
  nand gate001 ( wir001, in_001, in_003 );
  nand gate002 ( wir002, wir001, wir000 );
  nand gate003 ( wir003, in_002, wir002 );
  nand gate004 ( wir004, wir002, wir002 );
  nand gate005 ( wir005, wir004, in_002 );
  nand gate006 ( wir006, wir005, wir004 );
  nand gate007 ( wir007, in_005, wir006 );
  nand gate008 ( wir008, in_003, wir006 );    
  nand gate009 ( wir009, in_004, wir003 );
  nand gate010 ( wir010, wir003, wir009 );
  nand gate011 ( wir011, wir009, wir000 );
  nand gate012 ( wir012, wir011, in_001 );
  nand gate013 ( wir013, wir008, wir012 );
  nand gate014 ( wir014, wir013, in_005 );
  nand gate015 ( wir015, wir006, wir013 );
  nand gate016 ( wir016, wir015, wir007 );
  nand gate017 ( wir017, wir016, wir010 );
  nand gate018 ( out000, wir014, wir017 );
endmodule


module connecting6_test;
   reg [5:0] X;
   wire a;

  counting6 U1 (
  .in_000 (X[0]),
  .in_001 (X[1]),
  .in_002 (X[2]),
  .in_003 (X[3]),
  .in_004 (X[4]),
  .in_005 (X[5]),
  .in_006 (X[6]),
  .out000 (a )
  );

  initial begin
    X = 0;
  end

  always
    #10  X = X+1;

 initial  begin
    $display("\t\t     \t_");
    $display("\t\ttime,\t \\db/_,\tconnected");
    $monitor("%d,\t%b,\t%d",$time, X, a );
  end

  initial
   #630  $finish;

endmodule

// iverilog -o hello hello.v                                                                      
// vvp hello                                                                                      

Kim Øyhus


Bunu asgari düzeyde kanıtladınız mı, eğer öyleyse nasıl?
lirtosiast

Minimal olduğuna dair kanıt elde etmek için istatistiksel testler kullandım. Bunun gibi nispeten basit devreler için testler oldukça kesindir.
KimOyhus

1

Mathematica, 17 kapı

Sadece tüm kuralları numaralandırır, boolean işlevini oluşturur ve NANDformda en aza indiririz .

#->If[Total@#<3||
       MemberQ[{{1,1,1,0,0,0},{1,0,0,1,1,0},{0,1,0,1,0,1},{0,0,1,0,1,1}},#]
       ,0,1] /.{1->True,0->False}& /@
     Tuples[{0,1},6];
BooleanMinimize[BooleanFunction[rule], "NAND"]

Sonuç :

(#1⊼#2⊼#4)⊼(#1⊼#2⊼#5)⊼(#1⊼#2⊼#6)⊼(#1⊼#3⊼#4)⊼ \
(#1⊼#3⊼#5)⊼(#1⊼#3⊼#6)⊼(#1⊼#4⊼#6)⊼(#1⊼#5⊼#6)⊼ \
(#2⊼#3⊼#4)⊼(#2⊼#3⊼#5)⊼(#2⊼#3⊼#6)⊼(#2⊼#4⊼#5)⊼ \
(#2⊼#5⊼#6)⊼(#3⊼#4⊼#5)⊼(#3⊼#4⊼#6)⊼(#4⊼#5⊼#6)&

, #1...#6argümanlar için 6 slot nerede .


Test senaryoları :

f=%; (* assign the function to symbol f *)

f[True, True, True, True, False, False]
(* True *)

f[True, True, False, True, False, False]
(* True *) (*, three Trues do not form a triangle *)

f[True, True, True, False, False, False]
(* False *) (*, three Trues form a triangle *)

P⊼q⊼r ne anlama geliyor not (p&q&r)? Sonucun sonucu ne anlama geliyor?

@RickyDemer Evet, eşdeğer p⊼q⊼ranlamına gelir . (p⊼q)⊼r!(p&&q&&r)
njpipeorgan

Takma Yanlış, Yanlış, Doğru (p⊼q)⊼r, eşdeğer olmadığını gösteriyor !(p&&q&&r).

@RickyDemer Bu bir sorun ... Kabul ettim.
njpipeorgan

Ayrıca BooleanMinimize [İfade, "NAND"] en az Wolfram Alpha versiyonu etmez değil mutlaka NAND ler sayısını en aza indirmek. (BooleanMinimize'i deneyin [(((bir NAND b) NAND (c NAND d)) NAND ((e NAND f) NAND (g NAND h))), "NAND"].) Mathematica'da çalıştırdığınızda çıktı verir en fazla 7 NAND ile?

1

64 NAND

Altı kenar, zıt kenarların üç çiftine ayrılabilir. Bir grafiğin bağlanması için, ya iki zıt kenarın yanı sıra üçüncü bir kenarın ya da aynı tepe noktasına bağlı üç kenarın olması gerekir.

       •
       U

   Z   •   Y  
    V     W 
 •     X     •

Karşı çiftler UX, VY, WZ, yani:

A = U+V   ;3 gates
B = W+X
C = Y+Z

D = UV(B+C)  ;2+2+3=7 gates
E = WX(A+C)
F = YZ(C+A)

Result = D+E+F+UVW+UYZ+XVZ+XWY ; 18 + 16 = 34 gates

AND ve OR kapılarını her zamanki gibi inşa etmek için, kullanılan toplam kapı sayısı 3*3+7*3+34= 64'tür.


[Doğru, Doğru, Yanlış, Doğru, Yanlış, Yanlış] birbirine zıt kenarlar olmadan bağlı bir grafik verir.

@RickyDemer Sanırım bu şimdi çalışıyor ...
lirtosiast
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.