Contributor: WILLIAM SCHROEDER        

{
WILLIAM SCHROEDER

I'd like to extend thanks to everyone For helping me set up a PATTERN Program.
Yes, I have done it! Unfortunatley, this Program doesn't have all possible
pattern searches, but I figured out an algorithm For increasing size geometric
patterns such as 2 4 7 11. The formula produced is as follows: N = the Nth
term. So whatever the formula, if you want to find an Nth term, get out some
paper and replace N! :) Well, here's the Program, folks. I hope somebody can
make some improvements on it...
}
Program PatternFinder;

Uses
  Crt;

Var
  ans     : Char;
  PatType : Byte;
  n1, n2,
  n3, n4  : Integer;

Procedure GetInput;
begin
  ClrScr;
  TextColor(lightcyan);
  Writeln('This Program finds patterns For numbers in increasing size.');
  Write('Enter the first four terms in order: ');
  TextColor(yellow);
  readln(n1, n2, n3, n4);
end;

Procedure TestRelations;
begin
  PatType := 0;
  { 1 3 5 }
  if (n3 - n2 = n2 - n1) and ((n4 - n3) = n2 - n1) then
    PatType := 1
  else
  { 1 3 9 }
  if (n3 / n2) = (n4 / n3) then
    PatType := 2
  else
  { 1 1 2 }
  if (n3 = n2 + n1) and (n4 = (n3 + n2)) then
    PatType := 3
  else
  { 1 2 4 7 11 }
  if ((n4 - n3) - (n3 - n2)) = ((n3 - n2) - (n2 - n1)) then
    PatType := 4;
end;

Procedure FindFormula;

  Procedure DoGeoCalc;
  Var
    Factor : Real;
    Dif,
    Shift,
    tempn,
    nx, ny : Integer;
  begin
    Dif := (n3 - n2) - (n2 - n1);
    Factor := Dif * 0.5;
    Shift  := 0;
    ny := n2;
    nx := n1;
    if ny > nx then
    While (ny-nx) <> dif do
    begin
      Inc(Shift);
      tempn := nx;
      nx := nx - ((ny - nx) - dif);
      ny := tempn;
    end;
    if Factor <> 1 then
      Write('(', Factor : 0 : 1, ')');
    if Shift = 0 then
      Write('(N + 0)(N - 1)')
    else
    begin
      if Shift > 0 then
      begin
        Write('(N + ', shift, ')(N');
        if Shift = 1 then
          Write(')')
        else
          Write(' + ', shift - 1, ')');
      end;
    end;
    if nx <> 0 then
      Writeln(' + ', nx)
    else
      Writeln;
  end;

begin
  TextColor(LightGreen);
  Writeln('Formula =');
  TextColor(white);
  Case PatType of
    1 :
    begin
      { Nth term = first term + difference * (N - 1) }
      if n2 - n1 = 0 then
        Writeln(n1)
      else
      if (n2 - n1 = 1) and (n1 - 1 = 0) then
        Writeln('N')
      else
      if n2 - n1 = 1 then
        Writeln('N + ', n1 - 1)
      else
      if (n2 - n1) = n1 then
        Writeln(n1, 'N')
      else
      Writeln(n2 - n1, '(N - 1) + ', n1);
    end;

    2 :
    begin
      { Nth term = first term * ratio^(N - 1) }
      if n1 = 1 then
        Writeln(n2 / n1 : 0 : 0, '^(N - 1)')
      else
        Writeln(n1, ' x ', n2 / n1 : 0 : 0, '^(N - 1)');
    end;

    3 :
    begin
      { Fibonacci Sequence }
      Writeln('No formula: Fibonacci Sequence (Term1 + Term2 = Term3)');
      Writeln('                                ',
              n1 : 5, ' + ', n2 : 5, ' = ', (n1 + n2) : 5);
    end;

    4 :
    begin
      { Geometric Patterns }
      DoGeoCalc;
    end;
  end;
end;

begin
  GetInput;
  TestRelations;
  TextColor(LightRed);
  Writeln;
  if PatType <> 0 then
    FindFormula
  else
    Writeln('No pattern found: This Program may not know how to look '+
    'for that pattern.');
  TextColor(lightred);
  Writeln;
  Write('Press any key...');
  ans := ReadKey;
  ClrScr;
end.

{
That's all folks! if you can find and fix any bugs For me, please send me that
section of the code so I can change it. if anybody cares to ADD to the pattern
check, be my guest! This Program can be altered and used by ANYBODY. I'd just
like to expand it a bit. Have fun!
}