{ Gele‘inkelio groteli— metodu u‘žifruoto teksto dežifravimas }
{ Eilut‚s pateiktos teisinga tvarka }
{ Programa turi vien… parametr…. J ‘ym‚sime %1 }
{ Duomenys žiai programai pateikiami byloje GROTEL%1.DAT }
{ Rezultatai ražomi  byl…  DESIFR%1.TXT }
{ Duomen— bylos pirmoje eilut‚je turi b–ti skai‡ius k, likusiose k eilu‡i—
  žifro eilut‚s }

program desifravimas;

   const  MAX_K = 12; { maksimalus aukžtis }
          PR = 'GROTEL';
          RZ = 'DESIFR';
   type   eilutes = array [1..MAX_K] of string;
          tekstas = array [1..MAX_K*255] of char;

   procedure desifruoti (k: integer; eil: eilutes;
                         var t: tekstas; var teksto_il: integer);
     { pagrindin‚ u‘davin sprend‘ianti proced–ra }
     var nr, i: integer;
         zemyn: boolean;
  begin
    { suskai‡iuojame teksto ilg }
    teksto_il := 0;
    for i := 1 to k do
      teksto_il := teksto_il + length(eil[i]);
    { ižžifruojame tekst… }
    zemyn := true;
    nr := 1;
    for i := 1 to teksto_il do
      begin
        t[i] := eil[nr, 1];
        delete (eil[nr], 1, 1);
        if (nr = 1) and (i <> 1) or (nr = k)
           then zemyn := not zemyn;
        if zemyn
           then nr := nr + 1
           else nr := nr - 1;
      end;
   end; { dežifruoti }

   procedure skaityti (var k: integer; var eil: eilutes);
     var f: text;
         i: integer;
   begin
     assign (f, PR+paramstr(1)+'.rez');
     reset (f);
     readln (f, k);
     for i := 1 to k do
        readln (f, eil[i]);
     close(f);
   end; { skaityti }

  procedure spausdinti (teksto_il: integer; const t: tekstas);
    var f: text;
        i: integer;
  begin
    assign (f, RZ+paramstr(1)+'.txt');
    rewrite (f);
    for i := 1 to teksto_il do
      begin
        write (f, t[i]);
        if i mod 80 = 0
           then writeln (f);
      end;
    close (f);
  end; { spausdinti }

  var eil: eilutes;
      t: tekstas;
      k, teksto_il: integer;
begin
  skaityti (k, eil);
  desifruoti (k, eil, t, teksto_il);
  spausdinti (teksto_il, t);
end.

