Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. (*
  2.    adapted to Oberon-07 by 0CodErr, KolibriOS team
  3.                                                    *)
  4. (* Find sequence of digits 0, 1, 2 and of lengths 1 ... 90, such
  5.    that they contain no two adjacent subsequences that are equal *)
  6.  
  7. MODULE sequence012;
  8.  
  9. IMPORT In, Out, Console;
  10.  
  11.  
  12. CONST
  13.     maxlength = 75;
  14.  
  15.  
  16. VAR
  17.     n: INTEGER;
  18.     good: BOOLEAN;
  19.     s: ARRAY maxlength OF INTEGER;
  20.  
  21.  
  22. PROCEDURE printsequence;
  23. VAR
  24.     k: INTEGER;
  25. BEGIN
  26.     Out.Char(" ");
  27.     FOR k := 1 TO n DO Out.Int(s[k], 1) END;
  28.     Out.Ln
  29. END printsequence;
  30.  
  31.  
  32. PROCEDURE changesequence;
  33. BEGIN
  34.     IF s[n] = 3 THEN
  35.         DEC(n);
  36.         changesequence
  37.     ELSE
  38.         s[n] := s[n] + 1
  39.     END
  40. END changesequence;
  41.  
  42.  
  43. PROCEDURE try;
  44. VAR
  45.     i, l, nhalf: INTEGER;
  46.  
  47. BEGIN
  48.     IF n <= 1 THEN
  49.         good := TRUE
  50.     ELSE
  51.         l := 0; nhalf := n DIV 2;
  52.         REPEAT
  53.             INC(l); i := 0;
  54.             REPEAT
  55.                 good := s[n - i] # s[n - l - i];
  56.                 INC(i)
  57.             UNTIL good OR (i = l)
  58.         UNTIL ~good OR (l >= nhalf)
  59.     END
  60. END try;
  61.  
  62.  
  63. BEGIN
  64.     Console.open;
  65.  
  66.     n := 0;
  67.     REPEAT
  68.         INC(n);
  69.         s[n] := 1; try;
  70.         WHILE ~good DO
  71.             changesequence;
  72.             try
  73.         END;
  74.         printsequence
  75.     UNTIL n >= maxlength - 1;
  76.     In.Ln;
  77.  
  78.     Console.exit(TRUE)
  79. END sequence012.