const MAX = 1000; { maximalní počet hradel ... to není důležité } type THradlo = record in1, in2: Integer; { indexy na vstupní hradla (nebo bity) } done: Boolean; { je true, pokud bylo hradlo již spočteno } val: Boolean; { spočtená hodnota (pouze pokud done = true) } end; var PocetHradel, PocetVstupu, PocetVystupu: Integer; Hradla: array[1..MAX] of THradlo; { pole všech hradel } Vystupy: array[0..MAX] of Integer; { indexy hradel, zapojených na výstupy } Vstupy: array[0..MAX] of Boolean; { hodnoty vstupních bitů } { rekurzivní funkce, která určí výstupní hodnotu hradla } { Pozn: Budu zde sahat na glob. proměnné (Hradla, Vstupy a Pocty) } function spocitejHradlo(index: Integer): Boolean; var val_tmp: Boolean; begin if (index < 1) then begin { index neukazuje na hradlo, ale na vstup. bit } spocitejHradlo := Vstupy[-index]; Exit; end; { jen pro jistotu - jestli se ptáme na existující hradlo } spocitejHradlo := false; if ((index < 1) or (index > PocetHradel)) then Exit; if (not Hradla[index].done) then begin { hradlo ještě nebylo spočteno } Hradla[index].done = true; { tak ho spočítáme } val_tmp := spocitejHradlo(in1); if (val_tmp) then Hradla[index].val := not (val1 and spocitejHradlo(in2)) else { optimalizace - nemusíme počítat dál} Hradla[index].val = true; { 0 NAND s čímkoli je vždy true } end; spocitejHradlo := Hradla[index].val; { sáhnem pro výsledek do cache } end; { Připraví hradla pro další dotaz } procedure vycistiHradla; var i: Integer; begin for i := 1 to PocetHradel do Hradla[i].done := False; end; { Spočítá všechna výstupní hradla a vytiskne spočtené hodnoty } procedure spocitejHradla; var i: Integer; begin for i := 0 to PocetVystupu-1 do Writeln("bit ", i, ".: ", spocitejHradlo(Vystupy[i]) ); end; procedure nactiVstup; { načte ze vstupu hodnoty do pole Vstupy - implentaci vynechávám } procedure nactiHradla; { načte ze vstupu hodnoty do pole Hradla a Vystupy a konstanty Pocet... } begin nactiHradla; ... { při každém dotazu se zavolá posloupnost } vycistiHradla; nactiVstup; spocitejHradla; end.