Програма мовою Pascal
побудови нормальної диз'юнктивної форми
булевої функції

згідно із завданням ІІІ (міського) етапу
Всеукраїнської учнівської олімпіади з інформатики
місто Київ 2004 рік
                                                       const
b: array [1..28] of string[5] =  ('(0)','(1)','not1','not0',
'0and0','0and1','1and0','1and1','0or0','0or1','1or0','1or1',
'0=>0','0=>1','1=>0','1=>1','0<=>0','0<=>1','1<=>0','1<=>1',
'0|0','0|1','1|0','1|1','0^0','0^1','1^0','1^1');       {що}

c: string ='0101000101111101100111101000';   {на що міняємо}

d: array [1..28] of byte =
(2,2,3,3,4,4,4,4,3,3,3,3,3,3,3,3,4,4,4,4,2,2,2,2,2,2,2,2);
                 {кількість позицій для знищення при заміні}
var  j,k,l,m,n,n2: longint;   a,f,s,s0,v: string;   o: text;
                                       y: boolean;    begin
assign(o,'nornal.dat'); reset(o);
readln(o,s0);            {Зчитування переліку змінних}
readln(o,s);             {Зчитування запису булевої функції}
 close(o);  n:=length(s0);               {Кількість змінних}
while pos(' ',s)>0 do delete(s,pos(' ',s),1); {         n  }
n2:=1;  for j:=1 to n do n2:=n2*2;            {     n2=2   }
assign(o,'nornal.res');  rewrite(o);  y:=false;

for j:=0 to n2-1 do              {Перебір арґументів} begin
v:=s; m:=j;  for k:=1 to n do {Визначення арґументів} begin
if m mod 2=0 then a[k]:='0' else a[k]:='1';  m:=m div 2 end;

             {Заміна позначення арґумента на його значення}
for k:=1 to n do  while pos(s0[k],v)>0 do
                     v[pos(s0[k],v)]:=a[k];

                             {Знаходження величини функції}
repeat      for l:=1 to 28 do  while pos(b[l],v)>0 do begin
       k:=pos(b[l],v);  v[k]:=c[l];  delete(v,k+1,d[l]) end;
until length(v)=1;
                                        if v='1' then begin
{Фраґмент запису}            f:='('; for k:=1 to n do begin
                 if k>1 then f:=f+' and ';
            if a[k]='0' then f:=f+'not ';   f:=f+s0[k]  end;
if y then write(o,' or ');  write(o,f+')'); y:=true end end;
                                               close(o) end.