{ -- FLORIDA HIGH SCHOOLS COMPUTING COMPETITION '81 }
{ -- PASCAL PROGRAM SOLUTIONS }
 
 
{1.1}
program One1T81;
{ -- This program will compute percent of heads and tails. }
  var
    H, T, S: Integer;
 
begin
  Write ('Enter number of heads: ');  Readln (H);
  Write ('Enter number of tails: ');  Readln (T);
  S := T + H;
  Writeln ('PERCENT HEADS: ', H/S * 100 :3:1);
  Writeln ('PERCENT TAILS: ', T/S * 100 :3:1);
end.
 
 
{1.2}
program One2T81;
{ -- This program will display the angle of a polygon. }
  var
    N: Integer;
 
begin
  Write ('Enter number of sides: ');  Readln (N);
  Writeln ('ANGLE=', 180 * (N - 2) div N);
end.
 
 
{1.3}
program One3T81;
{ -- This program will compute the value of a function. }
  var
    A, B, C, X: Integer;
 
begin
  Write ('A, B, C, X: ');  Readln (A, B, C, X);
  Writeln ('AX^2 + BX + C = ', A*X*X + B*X + C);
end.



{1.4}
program One4T81;
{ -- This program will compute the net price after discounts. 
}
  var
    I:    Byte;
    P, D: Real;
 
begin
  Write ('Enter original price: $');  Readln (P);
  for I := 1 to 2 do begin
    Write ('Enter discount ', I, ' percent: ');  Readln (D);
    P := P - P * D / 100
  end;
  Writeln ('FINAL NET PRICE: $', P :3:2);
end.
 
 
 
{1.5}
program One5T81;
{ -- This program will determine the quadrant of a point. }
  var
    X, Y: Integer;
 
begin
  Write ('Enter X, Y: ');  Readln (X, Y);
  if (X > 0) and (Y > 0) then Writeln ('QUADRANT: I');
  if (X < 0) and (Y > 0) then Writeln ('QUADRANT: II');
  if (X < 0) and (Y < 0) then Writeln ('QUADRANT: III');
  if (X > 0) and (Y < 0) then Writeln ('QUADRANT: IV');
  if X = 0 then Writeln ('LIES ON THE Y-AXIS');
  if Y = 0 then Writeln ('LIES ON THE X-AXIS');
end.
 
 


{2.1}
program Two1T81;
{ -- This program will sum two fractions. }
  var
    A, B, C, D, Num, Den, I: Integer;
 
begin
  Write ('Enter a, b, c, d: ');  Readln (A, B, C, D);
  Num := A * D + B * C;
  Den := B * D;
    I := Num;
  while (Num mod I <> 0) or (Den mod I <> 0) do
    Dec(I);
  Writeln (Num div I, '/', Den div I);
end.
 
 
{2.2}
program Two2T81;
{ -- This program will determine if quad is equilateral. }
  var
    I, Asq, Bsq: Integer;
    A, B:        Array [1..5] of Integer;
    C:           Array [1..5] of Real;
 
begin
  for I := 1 to 4 do begin
    Write ('Enter point ', I, ': ');  Readln (A[I], B[I]);
  end;
  A[5] := A[1];  B[5] := B[1];
  for I := 1 to 4 do begin
    Asq := (A[I] - A[I+1]) * (A[I] - A[I+1]);
    Bsq := (B[I] - B[I+1]) * (B[I] - B[I+1]);
    C[I] := Sqrt (Asq + Bsq);
  end;
  Write ('QUAD IS ');
  for I := 1 to 3 do
    if Abs (C[I] - C[I+1]) > 0.1 then begin
      Writeln ('NOT EQUILATERAL');  Exit;
    end;
  Writeln ('EQUILATERAL');
end.
 


{2.3}
program Two3T81;
{ -- This program will print discount rate for phone call. }
  var
    D, T: Integer;
 
begin
  Write ('Enter day, time: ');  Readln (D, T);
  if (T >= 1700) and (T < 2300) then Writeln ('20%') else
  if (T >= 2300) or  (T < 700)  then Writeln ('40%') else
  if D = 7 then Writeln ('20%') else
  if D = 1 then Writeln ('40%') else
  Writeln ('NO DISCOUNT');
end.
 
 
{2.4}
program Two4T81;
{ -- This program will determine if graph is parallel. }
  var
    A, B, C, D, E, F: Integer;
 
begin
  Write ('Enter A, B, C: ');  Readln (A, B, C);
  Write ('Enter D, E, F: ');  Readln (D, E, F);
  Write ('LINES ARE ');
  if A * E <> D * B then Write ('NOT ');
  Writeln ('PARALLEL');
end.
 
 
 
{2.5}
program Two5T81;
{ -- This program will find the LCM of 3 integers. }
  var
    A, B, C, S: Integer;
 
begin
  Write ('Enter three integers: ');
  Readln (A, B, C);  S := 0;
  repeat
    S := S + A;
  until (s mod B = 0) and (S mod C = 0);
  Writeln (S);
end.
 
 


{3.1}
program Thr1T81;
{ -- This program will convert a number from base 10 to B. }
  var
    N, B, J, I, X, Pow: Integer;
 
begin
  Write ('Enter numeral, base: ');  Readln (N, B);
  J := Trunc (Ln(N) / Ln(B));  Pow := 1;
  for I := 0 to J do  Pow := Pow * B;
  for I := J downto 0 do begin
    Pow := Pow div B;
    X := N div Pow;  Write (X);
    N := N - X * Pow;
  end;
  Writeln;
end.
 
 
{3.2}
program Thr2T81;
{ -- This program will print the mode in a list. }
  var
    N, I, J, Max: Integer;
    A, B:         Array [1..20] of Integer;
 
begin
  Write ('Enter how many numbers: ');  Readln (N);
  for I := 1 to N do begin
    Write ('Enter #: ');  Readln (A[I]);
  end;
  for I := 1 to N do begin
    B[I] := 1;
    for J := I+1 to N do
      if A[I] = A[J] then Inc(B[I]);
    if B[I] > Max then Max := B[I];
  end;
  Write ('MODE(S): ');
  for I := 1 to N do
    if B[I] = Max then Write (A[I], '  ');
  Writeln;
  Writeln ('NUMBER OF OCCURRENCES: ', Max);
end.
 


{3.3}
program Thr3T81;
{ -- This program will compute gross weekly pay. }
  var
    E:      String[12];
    R, Pay: Real;
    I:      Byte;
    H:      Array[1..5] of Real;
 
begin
  Write ('Employee Number: ');  Readln (E);
  Write ('Regular rate of pay/hour: $');  Readln (R);
  Write ('Enter hours for M,T,W,R,F: ');
  Readln (H[1], H[2], H[3], H[4], H[5]);
  Pay := 0;
  for I := 1 to 5 do
    if H[I] <= 8 then
      Pay := Pay + H[I] * R
    else
      Pay := Pay + 8 * R + (H[I]-8) * R * 2;
  Writeln ('EMPLOYEE NUMBER: ', E);
  Writeln ('GROSS WEEKLY PAY: $', Pay :3:2);
end.
 
 
 
{3.4}
program Thr4T81;
{ -- This program will play tic-tac-toe with a user. }
uses Crt;
  const
    Winsq: Array [1..8,1..3] of Integer =
     { -- Board numbering system }
     ((1,2,3), (8,9,4), (7,6,5),
     { -- Sets of 3 winning squares (in addition to above) }
      (1,8,7), (2,9,6), (3,4,5), (1,9,5), (3,9,7));
    { -- Vertical and horizontal coordinates for squares }
    Row: Array [1..9] of Integer = (1,1,1,3,5,5,5,3,3);
    Col: Array [1..9] of Integer = (1,5,9,9,9,5,1,1,5);
    Pl:  Array [0..1] of String[8] = ('YOU', 'COMPUTER');
    Ast = '  |   |';
    Bst = '---------';
  var
    I, Mov, N, P, X:   Integer;
    A: Array [1..9] of Integer;


function SomeOneWon: Boolean;
{ -- This procedure checks 8 columns, rows, and diagonals. }
begin
  I := 1;  SomeOneWon := False;
  repeat
    if (A[ Winsq[I,1] ] = P) and (A [Winsq[I,2] ] = P) and
       (A[ Winsq[I,3] ] = P) then
    begin
      GotoXY (3, 10);  Writeln (Pl[P], ' WON!');
      SomeOneWon := True;  I := 8;
    end;
    Inc(I);
  until (I = 9);
end;
 
begin
  ClrScr;  Writeln (Ast);  Writeln (Bst);  Writeln (Ast);
  Writeln (Bst);  Writeln (Ast);
  for I := 1 to 9 do begin
    A[I] := 9;  GotoXY (Col[I], Row[I]);  Write (I);
  end;
  A[9] := 1;  GotoXY (Col[9], Row[9]);  Write ('X');
 
  for Mov := 2 to 9 do begin
    if Mov in [2, 4, 6, 8] then P := 0 else P := 1;
    if P = 0 then
      begin          { -- Your move }
        repeat
          GotoXY (3, 8);  Write ('Enter # ');  Readln (N);
          GotoXY (10, 8); Write ('  ');
        until (A[N] <> 0) and (A[N] <> 1);
        A[N] := 0;  GotoXY (Col[N], Row[N]);  Write('O');
        if SomeOneWon then Exit;
      end
    else
      begin          { -- Computer's move }
        repeat
          X := Random (9);
        until (A[X] <> 0) and (A[X] <> 1);
        A[X] := 1;  GotoXY (Col[X], Row[X]);  Write('X');
        if SomeOneWon then Exit;
      end
  end;  { -- for Mov }
  GotoXY (3, 10);  Writeln ('TIE GAME');
end.
 


{3.5}
program Thr5T81;
{ -- This program will print a list of people who will retire. 
}
  const
    TM = 4;  TY = 1981;  { -- Todays month/year }
  var
    I, J, N, Y, Yr, X: Integer;
    Xst:               String[40];
    S, BM, Nam: Array[1..9] of String[18];
    BY:         Array[1..9] of Integer;
    A:          Array[1..9] of Integer;
    B:          Array[1..5,1..9] of Integer;
    SandNam:    Array[1..5,1..9] of String[40];
 
begin
  Write ('Enter number of employees: ');  Readln (N);
  for I := 1 to N do begin
    Writeln;
    Write ('Social Security No.: ');  Readln (S[I]);
    Write ('Name: ');  Readln (Nam[I]);
    Write ('Birthdate: (Month and day): ');  Readln (BM[I]);
    Write ('Birthdate: (Year): ');  Readln (BY[I]);
  end;
         { -- Determine who retires when }
  for Y := TY - 69 to Ty - 65 do begin
    Yr := Y - (TY - 70);  A[Yr] := 0;
    for I := 1 to N do
      if BY[I] <= Y then begin
        Inc(A[Yr]);
        SandNam[Yr, A[Yr]] := '  #' + S[I] + ' ' + Nam[I];
        B[Yr, A[Yr]] := BY[I];
      end;
  end;
         { -- Dispay retirers }
  for Y := 1 to 5 do
    if A[Y] > 0 then begin { -- sort people by birthdates }
      for I := 1 to A[Y]-1 do
        for J := I+1 to A[Y] do
          if B[Y,I] > B[Y,J] then begin
            X := B[Y,I];  B[Y,I] := B[Y,J];  B[Y,J] := X;
            Xst := SandNam[Y,I];
            SandNam[Y,I] := SandNam[Y, J];
            SandNam[Y,J] := Xst;
          end;
      { -- Display retirers in order of dates }
      Writeln;
      Writeln ('RETIRE WITHIN ', Y, ' YEARS');
      for I := 1 to A[Y] do
        Writeln (SandNam[Y, I]);
    end;
end.