sequence012.ob07 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. MODULE sequence012;
  7. IMPORT In, Out, Console;
  8. CONST
  9. maxlength = 75;
  10. VAR
  11. n: INTEGER;
  12. good: BOOLEAN;
  13. s: ARRAY maxlength OF INTEGER;
  14. PROCEDURE printsequence;
  15. VAR
  16. k: INTEGER;
  17. BEGIN
  18. Out.Char(" ");
  19. FOR k := 1 TO n DO Out.Int(s[k], 1) END;
  20. Out.Ln
  21. END printsequence;
  22. PROCEDURE changesequence;
  23. BEGIN
  24. IF s[n] = 3 THEN
  25. DEC(n);
  26. changesequence
  27. ELSE
  28. s[n] := s[n] + 1
  29. END
  30. END changesequence;
  31. PROCEDURE try;
  32. VAR
  33. i, l, nhalf: INTEGER;
  34. BEGIN
  35. IF n <= 1 THEN
  36. good := TRUE
  37. ELSE
  38. l := 0; nhalf := n DIV 2;
  39. REPEAT
  40. INC(l); i := 0;
  41. REPEAT
  42. good := s[n - i] # s[n - l - i];
  43. INC(i)
  44. UNTIL good OR (i = l)
  45. UNTIL ~good OR (l >= nhalf)
  46. END
  47. END try;
  48. BEGIN
  49. Console.open;
  50. n := 0;
  51. REPEAT
  52. INC(n);
  53. s[n] := 1; try;
  54. WHILE ~good DO
  55. changesequence;
  56. try
  57. END;
  58. printsequence
  59. UNTIL n >= maxlength - 1;
  60. In.Ln;
  61. Console.exit(TRUE)
  62. END sequence012.