Discordian date: Difference between revisions

→‎{{header|PL/M}}: Get the Gregorian date from the command line
(Added PL/M)
(→‎{{header|PL/M}}: Get the Gregorian date from the command line)
Line 3,885:
=={{header|PL/M}}==
{{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">
100H: /* DISCORDIAN DATE CALCULATION - TRANSLATION OF MAD (VIA ALGOL W) */
Line 3,907 ⟶ 3,906:
CALL PR$STRING( .N$STR( W ) );
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 ( YRDAY, SEASON, DAY, WKDAY )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 */
Line 3,918 ⟶ 3,946:
, 151, 181, 212, 243, 273, 304, 334
);
 
HOLY5 (0) = .'MUNG$'; HOLY5 (1) = .'MOJO$'; HOLY5 (2) = .'SYA$';
HOLY5 (3) = .'ZARA$'; HOLY5 (4) = .'MALA$';
Line 3,929 ⟶ 3,957:
DISSSN(3) = .'BUREAUCRACY$'; DISSSN(4) = .'THE AFTERMATH$';
 
/* PRINTSGET THE DISWCORDIANGREGORIAN DATE GMONTH/GDAY/GYEAR 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 );
GMONTH = CL$NUMBER; DECLAREGDAY (= GMONTH, GDAY,CL$NUMBER; GYEAR )= ADDRESSCL$NUMBER;
CALL PR$NUMBER( GMONTH );CALL PR$CHAR( '/' );CALL PR$NUMBER( GDAY );
CALL PR$DISCORDIAN$DATECHAR( 08,'/');CALL 15,PR$NUMBER( 2017GYEAR ); CALL PR$NL;
 
/* CONVERT AND PRINT THE DATE */
IF GMONTH = 2 AND GDAY = 29
IF GMONTH = THEN2 DO;AND GDAY = 29
THEN DO;
CALL PR$STRING( .'SAINT TIB''S DAY IN THE Y.O.L.D. $' );
CALL PR$NUMBERSTRING( GYEAR.'SAINT +TIB''S 1166DAY IN THE Y.O.L.D. $' );
CALL PR$NUMBER( GYEAR END+ 1166 );
ELSE DOEND;
ELSE DO;
DECLARE ( YRDAY, SEASON, DAY, WKDAY ) ADDRESS;
DECLARE ( YRDAY, SEASON, =DAY, WKDAY MLENGT(GMONTH)+GDAY ADDRESS;
YRDAY SEASON = YRDAY / 73MLENGT(GMONTH)+GDAY;
SEASON = YRDAY DAY/ = YRDAY-SEASON*73;
DAY WKDAY = (YRDAY-1) MOD 5SEASON*73;
WKDAY = CALL PR$STRING( DISDAY(WKDAYYRDAY-1) )MOD 5;
CALL PR$STRING( .', DAY $'DISDAY(WKDAY) );
CALL PR$NUMBERSTRING( .', DAY $' );
CALL PR$STRINGNUMBER( .' OF $'DAY );
CALL PR$STRING( DISSSN(SEASON).' OF $' );
CALL PR$STRING( .' IN THE Y.O.L.D $'DISSSN(SEASON) );
CALL PR$NUMBERSTRING( GYEAR.' +IN 1166THE Y.O.L.D $' );
CALL PR$NUMBER( GYEAR IF+ 1166 DAY = 5 THEN DO);
IF CALLDAY PR$NL= 5 THEN DO;
CALL PR$STRING( .'CELEBRATE $' )NL;
CALL PR$STRING( HOLY5(SEASON).'CELEBRATE $' );
CALL PR$STRING( .'DAY$'HOLY5(SEASON) );
CALL PR$STRING( .'DAY$' END);
ELSE IF DAY = 50 THEN DO;
CALL PR$NL;
CALL PR$STRING( .'CELEBRATE $' );
CALL PR$STRING( HOLY50(SEASON) );
CALL PR$STRING( .'FLUX$' );
END;
ELSE IF DAY = 50 THEN DO;
CALL PR$NL;
CALL PR$STRING( .'SAINT TIB''S DAY IN THE Y.O.L.D.CELEBRATE $' );
CALL PR$STRING( HOLY50(SEASON) );
CALL PR$STRING( .'CELEBRATE FLUX$' );
END;
CALL PR$NLEND;
ENDCALL PR$DISCORDIAN$DATENL;
 
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
</syntaxhighlight>
{{out}}
With the command line: <code>DISCORD 03/29/2023</code>:
<pre>
3/29/2023
BOOMTIMEPUNGENDAY, DAY 815 OF BUREAUCRACYDISCORD IN THE Y.O.L.D 31833189
 
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>
 
3,045

edits