Jump to content

Calendar - for "REAL" programmers: Difference between revisions

m
→‎[[Calendar - for "real" programmers#ALGOL 68]]: add retro BEGIN ~ END blocks and remove % char and square brackets (which for some reason were missing from some early machines)
m (→‎[[Calendar - for "real" programmers#ALGOL 68]]: add retro BEGIN ~ END blocks and remove % char and square brackets (which for some reason were missing from some early machines))
Line 28:
Note: to run this code with [[ALGOL 68G]] you need to use the '''--quote-stropping''' option.
<lang algol68>'PR' QUOTE 'PR'
 
'PROC' PRINT CALENDAR = ('INT' YEAR, PAGE WIDTH)'VOID': ('BEGIN'
 
[]()'STRING' MONTH NAMES = (
"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE",
"JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"),
WEEKDAY NAMES = ("SU","MO","TU","WE","TH","FR","SA");
'FORMAT' WEEKDAY FMT = $G,N('UPB' WEEKDAY NAMES - 'LWB' WEEKDAY NAMES)(" "G)$;
 
# 'JUGGLE' THE CALENDAR FORMAT TO FIT THE PRINTER/SCREEN WIDTH #
'INT' DAY WIDTH = 'UPB' WEEKDAY NAMES[(1]), DAY GAP=1;
'INT' MONTH WIDTH = (DAY WIDTH+DAY GAP) * 'UPB' WEEKDAY NAMES-1;
'INT' MONTH HEADING LINES = 2;
Line 47:
'INT' YEAR WIDTH = YEAR COLS*(MONTH WIDTH+MONTH GAP)-MONTH GAP;
'INT' YEAR LINES = YEAR ROWS*MONTH LINES;
 
'MODE' 'MONTHBOX' = [(MONTH LINES, MONTH WIDTH])'CHAR';
'MODE' 'YEARBOX' = [(YEAR LINES, YEAR WIDTH])'CHAR';
 
'INT' WEEK START = 1; # 'SUNDAY' #
 
'PROC' DAYS IN MONTH = ('INT' YEAR, MONTH)'INT':
'CASE' MONTH 'IN' 31,
Line 58:
31, 30, 31, 30, 31, 31, 30, 31, 30, 31
'ESAC';
 
'PROC' DAY OF WEEK = ('INT' YEAR, MONTH, DAY)'INT': ('BEGIN'
# 'DAY' OF THE WEEK BY 'ZELLER'’S 'CONGRUENCE' ALGORITHM FROM 1887 #
'INT' Y := YEAR, M := MONTH, D := DAY, C;
'IF' M <= 2 'THEN' M +:= 12; Y -:= 1 'FI';
C := Y 'OVER' 100;
Y %*:='MODAB' 100;
(D - 1 + ((M + 1) * 26) 'OVER' 10 + Y + Y 'OVER' 4 + C 'OVER' 4 - 2 * C) 'MOD' 7
)'END';
 
'MODE' 'SIMPLEOUT' = 'UNION'('STRING', []()'STRING', 'INT');
 
'PROC' CPUTF = ('REF'[]()'CHAR' OUT, 'FORMAT' FMT, 'SIMPLEOUT' ARGV)'VOID':('BEGIN'
'FILE' F; 'STRING' S; ASSOCIATE(F,S);
PUTF(F, (FMT, ARGV));
OUT[(:'UPB' S]):=S;
CLOSE(F)
)'END';
 
'PROC' MONTH REPR = ('INT' YEAR, MONTH)'MONTHBOX':('BEGIN'
'MONTHBOX' MONTH BOX; 'FOR' LINE 'TO' 'UPB' MONTH BOX 'DO' MONTH BOX[(LINE,]):=" "* 2 'UPB' MONTH BOX 'OD';
'STRING' MONTH NAME = MONTH NAMES[(MONTH]);
 
# CENTER THE TITLE #
CPUTF(MONTH BOX[(1,(MONTH WIDTH - 'UPB' MONTH NAME ) 'OVER' 2+1:]), $G$, MONTH NAME);
CPUTF(MONTH BOX[(2,]), WEEKDAY FMT, WEEKDAY NAMES);
 
'INT' FIRST DAY := DAY OF WEEK(YEAR, MONTH, 1);
'FOR' DAY 'TO' DAYS IN MONTH(YEAR, MONTH) 'DO'
'INT' LINE = (DAY+FIRST DAY-WEEK START) 'OVER' 'UPB' WEEKDAY NAMES + MONTH HEADING LINES + 1;
'INT' CHAR =((DAY+FIRST DAY-WEEK START) 'MOD' 'UPB' WEEKDAY NAMES)*(DAY WIDTH+DAY GAP) + 1;
CPUTF(MONTH BOX[(LINE,CHAR:CHAR+DAY WIDTH-1]),$G(-DAY WIDTH)$, DAY)
'OD';
MONTH BOX
)'END';
 
'PROC' YEAR REPR = ('INT' YEAR)'YEARBOX':('BEGIN'
'YEARBOX' YEAR BOX;
'FOR' LINE 'TO' 'UPB' YEAR BOX 'DO' YEAR BOX[(LINE,]):=" "* 2 'UPB' YEAR BOX 'OD';
'FOR' MONTH ROW 'FROM' 0 'TO' YEAR ROWS-1 'DO'
'FOR' MONTH COL 'FROM' 0 'TO' YEAR COLS-1 'DO'
Line 104:
'ELSE'
'INT' MONTH COL WIDTH = MONTH WIDTH+MONTH GAP;
YEAR BOX[(
MONTH ROW*MONTH LINES+1 : (MONTH ROW+1)*MONTH LINES,
MONTH COL*MONTH COL WIDTH+1 : (MONTH COL+1)*MONTH COL WIDTH-MONTH GAP
]) := MONTH REPR(YEAR, MONTH)
'FI'
'OD'
'OD';
DONE: YEAR BOX
)'END';
 
'INT' CENTER = (YEAR COLS*(MONTH WIDTH+MONTH GAP) - MONTH GAP - 1) 'OVER' 2;
'INT' INDENT = (PAGE WIDTH - YEAR WIDTH) 'OVER' 2;
 
PRINTF((
$N(INDENT + CENTER - 9)K G L$, "[(INSERT SNOOPY HERE])",
$N(INDENT + CENTER - 1)K 4D L$, YEAR, $L$,
$N(INDENT)K N(YEAR WIDTH)(G) L$, YEAR REPR(YEAR)
))
'END';
);
 
MAIN: ('BEGIN'
'CO' INSPIRED BY HTTP://WWW.EE.RYERSON.CA/~elfELF/hack/realmen.html
REAL PROGRAMMERS DONT USE PASCAL - ED POST
DATAMATION, VOLUME 29 NUMBER 7, JULY 1983
Line 134:
LINE PRINTER WIDTH = 132; # AS AT 1969! #
PRINT CALENDAR(MANKIND STEPPED ON THE MOON, LINE PRINTER WIDTH)
)'END'</lang>
Output:
<pre>
Cookies help us deliver our services. By using our services, you agree to our use of cookies.