program Triangles;

{Epreuve informatique de l'Ecole Polytechnique           94.289
--------------------------------------------------------------

1°


+------------------------------------------------------------+
¦              Imprimer tous les résultats                   ¦
¦     en indiquant chaque fois à quoi ils correspondent      ¦
+------------------------------------------------------------+


     }


uses
    modubase,crt;

type
    lettre=char;
     sequence=string;
var
   u,PhiG,PhiD:sequence;
   ch:Char;

function t(a,b:lettre):lettre;
begin
     if a=b then
        t:=a
     else
         t:=Chr(3*ord('A')+3-Ord(a)-Ord(b));
end;


Procedure step(var u:sequence);
var
   l,i:integer;
begin
     l:=length(u);
     for i:=2 to l do
         u[i-1]:=t(u[i-1],u[i]);
     u:=copy(u,1,l-1);
end;

Procedure Alea(var u:sequence;p:integer);
var
   i:integer;
begin
     u:='';
     for i:=1 to p do
         u:=u+Chr(Ord('A')+Trunc(random*3));
end;


procedure Triangle(u:sequence;var PhiG,PhiD:sequence);

procedure traiter;
begin
     PhiG:=PhiG+u[1];
     PhiD:=PhiD+u[length(u)];
     {WriteLN(u);}

end;

begin
     WriteLN;
     PhiG:='';
     PhiD:='';
     TRaiter;
     while length(u)>1 do
           begin
                step(u);
                Traiter;
           end;
     WriteLN('=== PhiG=',PhiG);
     WriteLN('=== PhiD=',PhiD);

end;

Procedure Question1;
begin
     u:='ABABCCC';
     repeat
            Triangle(u,PhiG,PhiD);
            u:=PhiG;
            Pause;
     until false;
     pause;
end;

Procedure Question2;
begin
     u:='ABABCCC';
     repeat
            Triangle(u,PhiG,PhiD);
            u:=PhiD;
            Pause;
     until false;
     pause;
end;

Procedure Analyse(m:sequence);
var
   k,l,a,q,q0,p:integer;
   amorce,motif:sequence;
   t:boolean;

procedure sub(s:string;u:sequence);
var
   k:integer;
begin
     l:=length(u);
     q:=0;
     q0:=trunc(l/2);
     repeat
           Dec(q0);
           t:=true;
           for k:=1 to Trunc(l/2) do
               t:=t and (u[l+1-k]=u[l+1-k-q0]);
           if t then
              q:=q0;
     until q0=1;
     a:=-1;
     repeat
           Inc(a);
           t:=true;
           for k:=a+1 to l-q do
               t:=t and (u[q+k]=u[k]);
     until t;
     amorce:=copy(u,1,a);
     motif:=copy(u,a+1,q);
     writeLN('a+q=',a,'+',q,'... : ',s,'=',amorce,'+',motif+'.....');
end;

begin
     p:=length(m);
     u:='';
     for k:=1 to 20 do
          u:=u+m;
     Triangle(u,PhiG,PhiD);
     Sub('PhiG',PhiG);
     Sub('PhiD',PhiD);

end;


Procedure Question3;
var
   m:sequence;
   p:integer;
begin
     Write('Entrez p=');
     ReadLN(p);

     repeat
           Alea(m,p);
           WriteLN('=================================================');
           WriteLN('U=',m,'...');
           Analyse(m);
           repeat
           until KeyPressed;
           Ch:=readkey;
     until Ch=#27;
end;

Procedure Question4;
var
   m:sequence;
   n,p:integer;
begin
     for n:=1 to 80 do
         begin
              ClrScr;
              Alea(m,n);
              for p:=1 to n  do
                  begin
                       WriteLN(m);
                       step(m);
                       
                  end;
              Pause;
         end;
end;

Procedure Presentation;
begin
     ClrScr;
     Writeln('+--------------------- Propagation ternaire ------------------------+');
     Writeln('¦                                                                   ¦');
     Writeln('¦    (1)  u:=PhiG                                                   ¦');
     Writeln('¦    (2)  u:=PhiD                                                   ¦');
     Writeln('¦    (3)  Motif M                                                   ¦');
     Writeln('¦    (4)  Voir le triangle                                          ¦');
     Writeln('¦                                                                   ¦');
     Writeln('+-------------------------------------------------------------------+');
end;


{ Bloc principal }
begin
     Randomize;
     Initgraphique;
     Modetexte;
     Repeat
           Presentation;
           Ch:= ReadKey;
           case ch of
             '1':  Question1;
             '2':  Question2;
             '3':  Question3;
             '4':  Question4;
           end;
           Pause;
     until false;
