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! }