Discordian date: Difference between revisions

Content added Content deleted
(Added PL/M)
(→‎{{header|PL/M}}: Get the Gregorian date from the command line)
Line 3,885: Line 3,885:
=={{header|PL/M}}==
=={{header|PL/M}}==
{{works with|8080 PL/M Compiler}} ... under CP/M (or an emulator)
{{works with|8080 PL/M Compiler}} ... under CP/M (or an emulator)
<br>Based on:{{Trans|MAD}}...via Algol W
<br>
Based on:{{Trans|MAD}}...via Algol W
<syntaxhighlight lang="plm">
<syntaxhighlight lang="plm">
100H: /* DISCORDIAN DATE CALCULATION - TRANSLATION OF MAD (VIA ALGOL W) */
100H: /* DISCORDIAN DATE CALCULATION - TRANSLATION OF MAD (VIA ALGOL W) */
Line 3,907: Line 3,906:
CALL PR$STRING( .N$STR( W ) );
CALL PR$STRING( .N$STR( W ) );
END PR$NUMBER;
END PR$NUMBER;

/* COMMAND LINE */
DECLARE CL$ADDR LITERALLY '80H'; /* ADDRESS OF THE COMMAND LINE */
DECLARE CL$PTR ADDRESS; /* POINTER TO THE CURRENT COMMAND LINE CHAR */
DECLARE CL$CHAR BASED CL$PTR BYTE; /* CURRENT COMMAND LINE CHARACTER */
DECLARE CL$LEN ADDRESS; /* LENGTH OF THE COMMAND LINE */

/* INITIALISES THE COMMAND LINE VARIABLES */
CL$INIT: PROCEDURE;
CL$PTR = CL$ADDR;
CL$LEN = CL$CHAR;
CL$PTR = CL$PTR + 1;
END CL$INIT;

/* READS A NUMBER FROM THE COMMAND LINE, THE TERMINATOR IS IGNORED */
CL$NUMBER: PROCEDURE ADDRESS;
DECLARE N ADDRESS;
N = 0;
DO WHILE CL$PTR <= ( CL$ADDR + CL$LEN ) AND CL$CHAR = ' ';
CL$PTR = CL$PTR + 1;
END;
DO WHILE CL$PTR <= ( CL$ADDR + CL$LEN ) AND CL$CHAR >= '0'
AND CL$CHAR <= '9';
N = ( N * 10 ) + ( CL$CHAR - '0' );
CL$PTR = CL$PTR + 1;
END;
CL$PTR = CL$PTR + 1; /* SKIP THE CHARACTER THAT TERMINATED THE NUMBER */
RETURN N;
END CL$NUMBER;


/* TASK */
/* TASK */
Line 3,918: Line 3,946:
, 151, 181, 212, 243, 273, 304, 334
, 151, 181, 212, 243, 273, 304, 334
);
);

HOLY5 (0) = .'MUNG$'; HOLY5 (1) = .'MOJO$'; HOLY5 (2) = .'SYA$';
HOLY5 (0) = .'MUNG$'; HOLY5 (1) = .'MOJO$'; HOLY5 (2) = .'SYA$';
HOLY5 (3) = .'ZARA$'; HOLY5 (4) = .'MALA$';
HOLY5 (3) = .'ZARA$'; HOLY5 (4) = .'MALA$';
Line 3,929: Line 3,957:
DISSSN(3) = .'BUREAUCRACY$'; DISSSN(4) = .'THE AFTERMATH$';
DISSSN(3) = .'BUREAUCRACY$'; DISSSN(4) = .'THE AFTERMATH$';


/* PRINTS THE DISWCORDIAN DATE GMONTH/GDAY/GYEAR */
/* GET THE GREGORIAN DATE FROM THE COMMAND LINE, NB: NO VALIDATION */
DECLARE ( GMONTH, GDAY, GYEAR ) ADDRESS; /* MUST BE IN MM/DD/YYYY FORMAT */
/* GMONTH/GDAY/GYEAR SHOULD BE IN THE GREGORIAN CALENDAR */
CALL CL$INIT;
PR$DISCORDIAN$DATE: PROCEDURE( GMONTH, GDAY, GYEAR );
DECLARE ( GMONTH, GDAY, GYEAR ) ADDRESS;
GMONTH = CL$NUMBER; GDAY = CL$NUMBER; GYEAR = CL$NUMBER;
CALL PR$NUMBER( GMONTH );CALL PR$CHAR( '/' );CALL PR$NUMBER( GDAY );
CALL PR$CHAR( '/');CALL PR$NUMBER( GYEAR );CALL PR$NL;


/* CONVERT AND PRINT THE DATE */
IF GMONTH = 2 AND GDAY = 29
THEN DO;
IF GMONTH = 2 AND GDAY = 29
THEN DO;
CALL PR$STRING( .'SAINT TIB''S DAY IN THE Y.O.L.D. $' );
CALL PR$NUMBER( GYEAR + 1166 );
CALL PR$STRING( .'SAINT TIB''S DAY IN THE Y.O.L.D. $' );
END;
CALL PR$NUMBER( GYEAR + 1166 );
ELSE DO;
END;
ELSE DO;
DECLARE ( YRDAY, SEASON, DAY, WKDAY ) ADDRESS;
YRDAY = MLENGT(GMONTH)+GDAY;
DECLARE ( YRDAY, SEASON, DAY, WKDAY ) ADDRESS;
SEASON = YRDAY / 73;
YRDAY = MLENGT(GMONTH)+GDAY;
DAY = YRDAY-SEASON*73;
SEASON = YRDAY / 73;
WKDAY = (YRDAY-1) MOD 5;
DAY = YRDAY-SEASON*73;
CALL PR$STRING( DISDAY(WKDAY) );
WKDAY = (YRDAY-1) MOD 5;
CALL PR$STRING( .', DAY $' );
CALL PR$STRING( DISDAY(WKDAY) );
CALL PR$NUMBER( DAY );
CALL PR$STRING( .', DAY $' );
CALL PR$STRING( .' OF $' );
CALL PR$NUMBER( DAY );
CALL PR$STRING( DISSSN(SEASON) );
CALL PR$STRING( .' OF $' );
CALL PR$STRING( .' IN THE Y.O.L.D $' );
CALL PR$STRING( DISSSN(SEASON) );
CALL PR$NUMBER( GYEAR + 1166 );
CALL PR$STRING( .' IN THE Y.O.L.D $' );
IF DAY = 5 THEN DO;
CALL PR$NUMBER( GYEAR + 1166 );
CALL PR$NL;
IF DAY = 5 THEN DO;
CALL PR$STRING( .'CELEBRATE $' );
CALL PR$NL;
CALL PR$STRING( HOLY5(SEASON) );
CALL PR$STRING( .'CELEBRATE $' );
CALL PR$STRING( .'DAY$' );
CALL PR$STRING( HOLY5(SEASON) );
END;
CALL PR$STRING( .'DAY$' );
ELSE IF DAY = 50 THEN DO;
CALL PR$NL;
CALL PR$STRING( .'CELEBRATE $' );
CALL PR$STRING( HOLY50(SEASON) );
CALL PR$STRING( .'FLUX$' );
END;
END;
ELSE IF DAY = 50 THEN DO;
CALL PR$NL;
CALL PR$STRING( .'CELEBRATE $' );
CALL PR$STRING( HOLY50(SEASON) );
CALL PR$STRING( .'FLUX$' );
END;
END;
CALL PR$NL;
END;
END PR$DISCORDIAN$DATE;
CALL PR$NL;

CALL PR$DISCORDIAN$DATE( 08, 15, 2017 ); CALL PR$NL;
CALL PR$DISCORDIAN$DATE( 12, 06, 2020 ); CALL PR$NL;
CALL PR$DISCORDIAN$DATE( 07, 12, 1969 ); CALL PR$NL;
CALL PR$DISCORDIAN$DATE( 01, 05, 2005 ); CALL PR$NL;
CALL PR$DISCORDIAN$DATE( 09, 26, 1995 ); CALL PR$NL;


EOF
EOF
</syntaxhighlight>
</syntaxhighlight>
{{out}}
{{out}}
With the command line: <code>DISCORD 03/29/2023</code>:
<pre>
<pre>
3/29/2023
BOOMTIME, DAY 8 OF BUREAUCRACY IN THE Y.O.L.D 3183
PUNGENDAY, DAY 15 OF DISCORD IN THE Y.O.L.D 3189

SETTING ORANGE, DAY 48 OF THE AFTERMATH IN THE Y.O.L.D 3186

PUNGENDAY, DAY 47 OF CONFUSION IN THE Y.O.L.D 3135

SETTING ORANGE, DAY 5 OF CHAOS IN THE Y.O.L.D 3171
CELEBRATE MUNGDAY

PRICKLE-PRICKLE, DAY 50 OF BUREAUCRACY IN THE Y.O.L.D 3161
CELEBRATE BUREFLUX
</pre>
</pre>