```Contributor: TIM MIDDLETON

program moondays;

uses dos;

{----------------------------------------------------------------------}
{--           Calculate Approxmiate Phase of the Moon:               --}
{----------------------------------------------------------------------}
{-- Uses formula by P. Harvey in the "Journal of the British         --}
{-- Astronomical Association", July 1941. Formula is accurate to     --}
{-- within one day (or on some occassions two days). If anyone knows --}
{-- a better formula please let me know! Internet: as544@torfree.net --}
{----------------------------------------------------------------------}
{-- Calculates number of days since the new moon where:              --}
{--    0 = New moon       15 = Full Moon                             --}
{--    7 = First Quarter  22 = Last Quarter (right half dark)        --}
{----------------------------------------------------------------------}
Function Moon_age(y : word; m : word; d : word) : byte;
var i : integer;
c : word;
begin
c:=(y div 100);
if (m>2) then dec(m,2) else inc(m,10);
i:=((((((y mod 19)*11)+(c div 3)+(c div 4)+8)-c)+m+d) mod 30);
moon_age:=i;
end;

{----------------------------------------------------------------------}
{-- Enable Dos redirection:                                          --}
{----------------------------------------------------------------------}
Procedure DosRedirect;
begin
ASSIGN(Input,'');RESET(Input);
ASSIGN(Output,'');REWRITE(Output);
end;

{**********************************************************************}
{**********************************************************************}
var
ty, tm, td, tdow : word;
BEGIN
DosRedirect;
Getdate(ty,tm,td,tdow);
tdow := Moon_age(ty,tm,td);
Write('The moon is ',tdow,' day');
if tdow<>1 then write('s');
write(' old.');
case tdow of
0 : Write('  New moon!');
7 : Write('  First Quater!');
15: Write('  Full moon!');
22: Write('  Last Quarter!');
end;
writeln;
END.

```