algol,n<
begin
   comment

   GC84BA2

   Time: 9583.05s

   No buffer GIER:

   Time classic:        9439.92
   Time turbo:          8811.91 6.7pct

   Buffer GIER:

   Time classic:        9583.25
   Time turbo:          8912.39 7.0pct

   ;
   integer alen,alen1,cipher len;
   integer initial shift,shift,plugchar1,plugchar2;
   integer i,c1,c2,c3,c4,c5,c6;
   boolean found;
   real procedure clock count;
   code clock count;
   1, 37;
     zl        , grf p−1   ; RF ≔ clock count; stack[p−1] ≔ RF;
   e;
   select(32);
   clock count;
   alen ≔ read integer;
   alen1 ≔ alen−1;
   cipher len ≔ read integer;
   begin
      integer array alphabet,rotor,delta1,delta2,reflector[0:alen1];
      integer array reverse alphabet[0:63];
      integer array cipher,clear[1:cipher len];
      procedure read alphabet;
      begin
         integer i,c;
         i ≔ 0;
again:
         c ≔ lyn;
         if c=60 ∨ c=58 then goto again;
         if c=64 then goto exit;
         alphabet[i] ≔ c;
         reverse alphabet[c] ≔ i;
         i ≔ i+1;
         goto again;
exit:
      end read alphabet;
      procedure read rotor;
      begin
         integer i,j,c,c2;
         i ≔ 0;
again:
         c ≔ lyn;
         if c=60 ∨ c=58 then goto again;
         if c=64 then goto exit;
         c2 ≔ reverse alphabet[c];
         rotor[i] ≔ c2;
         i ≔ i+1;
         goto again;
exit:
         for j ≔ 0 step 1 until alen1 do
         begin
            i ≔ rotor[j];
            delta1[j] ≔ (i−j+alen)mod alen;
            delta2[i] ≔ (j−i+alen)mod alen
         end delta
      end read rotor;
      procedure read reflector;
      begin
         integer i,c,c2;
         i ≔ 0;
again:
         c ≔ lyn;
         if c=60 ∨ c=58 then goto again;
         if c=64 then goto exit;
         c2 ≔ reverse alphabet[c];
         reflector[i] ≔ c2;
         i ≔ i+1;
         goto again;
exit:
      end read reflector;
      procedure read cipher;
      begin
         integer i,c,c2;
         i ≔ 0;
again:
         c ≔ lyn;
         if c=60 ∨ c=58 then goto again;
         if c=64 then goto exit;
         c2 ≔ reverse alphabet[c];
         i ≔ i+1;
         cipher[i] ≔ c2;
         goto again;
exit:
      end read cipher;
      integer procedure plugboard(c1);
      value c1;
      integer c1;
      plugboard ≔  if c1=plugchar1 then plugchar2 else
         if c1=plugchar2 then plugchar1 else c1;
      integer procedure replace delta(c1,delta);
      value c1;
      integer c1;
      integer array delta;
      replace delta ≔ (c1+delta[(c1−shift+1000×alen)mod alen])mod alen;
      read alphabet;
      read rotor;
      read reflector;
      read cipher;
      for initial shift ≔ 0 step 1 until 3 do
      for plugchar1 ≔ 0 step 1 until alen1 do
      for plugchar2 ≔ 0 step 1 until alen1 do
      begin
         shift ≔ initial shift;
         for i ≔ 1 step 1 until cipher len do
         begin
            c1 ≔ cipher[i];
            c2 ≔ plugboard(c1);
            shift ≔ shift+1;
            c3 ≔ replace delta(c2,delta1);
            c4 ≔ reflector[c3];
            c5 ≔ replace delta(c4,delta2);
            c6 ≔ plugboard(c5);
            clear[i] ≔ c6
         end cipher len;
         found ≔ false;
         for i ≔ 1 step 1 until cipher len−2 do
         begin
            comment
                Look for FEM:

                012345678901234567890123456789
                ABCDEFGHIJKLMNOPQRSTUVXYZÆØÅ
                ;
            if clear[i]=5 ∧
               clear[i+1]=4 ∧
               clear[i+2]=12 then found ≔ true
         end;
         if found then
         begin
            writecr;
            write(«ddd»,initial shift,plugchar1,plugchar2);
            writetext(«  »);
            writechar(60);
            for i ≔ 1 step 1 until cipher len do
            writechar(alphabet[clear[i]]);
            writechar(58)
         end
      end for plugchar2 plugchar1 initial shift
   end inner loop;
   writecr;
   writetext(«Time: »);
   write(«ddddddd.dd»,clock count)
end;
run<
28
76
ABCDEFGHIJKLMNOPQRSTUVXYZÆØÅ
DBPEMGZALRNKØYTJXÆOÅFUHCQVSI
OHVFMDXBÅNSTEJAUZØKLPCGÆQYRI
ÅLNPSGÅJDRØMYUHÅBXUUOUKVQGLTBÅJVXZISFTØZFHAIELDFLÅKHÅDHIYZZÅXZISFTØVPPVVIQGD