Discordian date: Difference between revisions

add Refal
(Added PL/M)
(add Refal)
 
(5 intermediate revisions by 3 users not shown)
Line 476:
C:\>ddate 01/05/2005
Setting Orange, day 5 of Chaos in the YOLD 3171: celebrate Mungday!
</pre>
 
=={{header|Action!}}==
{{Trans|MAD}}...via PL/M
<syntaxhighlight lang="action!">
;;; Discordian date calculation - translation of MAD (via PL/M)
 
;;; returns the next number from line, the terminator is ignored
;;; pos holds the position in line and is updated to the
;;; position of the character following the trailing
;;; delimiter - if there is one
;;; pos should be set to 1 on rhe first call
INT FUNC getNumber( CHAR ARRAY line, CARD POINTER pos )
CARD value, linePos
 
linePos = pos^
value = 0
; skip spaces
WHILE linePos <= line(0) AND line(linePos) = ' DO linePos ==+ 1 OD
; get the number
WHILE linePos <= line(0) AND line(linePos) >= '0 AND line(linePos) <= '9
DO
value ==* 10
value ==+ (line(linePos) - '0)
linePos ==+ 1
OD
pos^ = linePos + 1
RETURN(value)
 
;;; get a Gregorian date and output it as a Discordian date
PROC Main()
 
DEFINE STRING_POINTER = "CARD"
 
CARD gMonth, gDay, gYear, gPos
CARD yrDay, season, day, wkDay
CHAR ARRAY gLine(256)
STRING_POINTER ARRAY holy5(5), holy50(5), disday(5), disssn(5)
INT ARRAY mlengt(13) = [ 0 0 31 59 90 120
151 181 212 243 273 304 334
]
holy5 (0) = "MUNG" holy5 (1) = "MOJO" holy5 (2) = "SYA"
holy5 (3) = "ZARA" holy5 (4) = "MALA"
holy50(0) = "CHAO" holy50(1) = "DISCO" holy50(2) = "CONFU"
holy50(3) = "BURE" holy50(4) = "AF"
disday(0) = "SWEETMORN" disday(1) = "BOOMTIME"
disday(2) = "PUNGENDAY" disday(3) = "PRICKLE-PRICKLE"
disday(4) = "SETTING ORANGE"
disssn(0) = "CHAOS" disssn(1) = "DISCORD" disssn(2) = "CONFUSION"
disssn(3) = "BUREAUCRACY" disssn(4) = "THE AFTERMATH"
 
; get the Gregorian date from the keyboard, NB: no validation
Print("Gregorian date (MM/DD/YYYY)> ")
InputS(gLine)
gPos = 1
gMonth = getNumber(gLine, @gPos)
gDay = getNumber(gLine, @gPos)
gYear = getNumber(gLine, @gPos)
 
; convert to Discordian
IF gMonth = 2 AND gDay = 29 THEN
Print("SAINT TIB'S DAY IN THE Y.O.L.D. ")PrintC(gYear+1166)
ELSE
yrDay = mlengt(gMonth)+gDay
season = yrDay/73
day = yrDay-season*73
wkDay = (yrDay-1) MOD 5
Print(disday(wkDay) )Print(", DAY ")PrintC(day)Print(" OF ")
Print(disssn(season))Print(" IN THE Y.O.L.D ")PrintC(gYear+1166)
IF day = 5 THEN
PutE()
Print("CELEBRATE ")Print(holy5(season))Print("DAY")
ELSEIF day = 50 THEN
PutE()
Print("CELEBRATE ")Print(holy50(season))Print("FLUX")
FI
FI
PutE()
 
RETURN
</syntaxhighlight>
{{out}}
<pre>
Gregorian date (MM/DD/YYYY)> 4/1/2023
SWEETMORN, DAY 18 OF DISCORD IN THE Y.O.L.D 3189
</pre>
 
Line 2,085 ⟶ 2,170:
readln;
end.</syntaxhighlight>
 
=={{header|EasyLang}}==
<syntaxhighlight>
seasons$[] = [ "Chaos" "Discord" "Confusion" "Bureaucracy" "The Aftermath" ]
weekday$[] = [ "Sweetmorn" "Boomtime" "Pungenday" "Prickle-Prickle" "Setting Orange" ]
apostle$[] = [ "Mungday" "Mojoday" "Syaday" "Zaraday" "Maladay" ]
holiday$[] = [ "Chaoflux" "Discoflux" "Confuflux" "Bureflux" "Afflux" ]
#
func leap x .
return if x mod 400 = 0 or x mod 4 = 0 and x mod 100 <> 0
.
func day_of_year y m d .
days[] = [ 31 28 31 30 31 30 31 31 30 31 30 31 ]
repeat
m -= 1
until m = 0
d += days[m]
if m = 2 and leap y = 1
d += 1
.
.
return d
.
func$ ddate y m d .
doy = day_of_year y m d
dyear = y + 1166
if leap y = 1 and m = 2 and d = 29
return "St. Tib's Day, in the YOLD " & dyear
.
if leap y = 1 and doy >= 60
doy -= 1
.
dsday = doy mod1 73
dseason = doy div1 73
r$ = weekday$[doy mod1 5] & ", day " & dsday & " of " & seasons$[dseason]
r$ &= " in the YOLD " & dyear & "."
if dsday = 5
r$ &= " Celebrate " & apostle$[dseason] & "!"
elif dsday = 50
r$ &= " Celebrate " & holiday$[dseason] & "!"
.
return r$
.
proc show d$ . .
a[] = number strsplit d$ "-"
write d$ & " --> "
print ddate a[1] a[2] a[3]
.
show "2016-01-05"
show "2016-02-28"
show "2016-02-29"
show "2016-03-01"
show "2016-12-31"
show "2025-03-19"
show substr timestr systime 1 10
</syntaxhighlight>
 
=={{header|Euphoria}}==
Line 3,885 ⟶ 4,026:
=={{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 ⟶ 4,047:
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 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 ⟶ 4,087:
, 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 ⟶ 4,098:
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$CHAR( '/');CALL PR$NUMBER( GYEAR );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( .'CELEBRATE $' );
CALL PR$STRING( HOLY50(SEASON) );
CALL PR$STRING( .'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
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>
 
Line 4,315 ⟶ 4,472:
2012-03-01 is Setting Orange, the 60th day of Chaos in the YOLD 3178
</pre>
 
=={{header|Refal}}==
<syntaxhighlight lang="refal">$ENTRY Go {
, <Numb <Arg 1>>: s.GY
, <Numb <Arg 2>>: s.GM
, <Numb <Arg 3>>: s.GD
, <DisDate s.GY s.GM s.GD>: {
True e.Desc = <Prout e.Desc>;
False = <Prout 'Invalid input'>;
};
};
 
DisDate {
s.GY 2 29, <IsLeapYear s.GY>: True =
True 'St. Tib\'s day in the YOLD ' <Symb <+ 1166 s.GY>>;
 
s.GY s.GM s.GD, <Compare s.GM 1>: '-' = False;
s.GY s.GM s.GD, <Compare s.GM 12>: '+' = False;
s.GY s.GM s.GD, <Compare s.GD 1>: '-' = False;
s.GY s.GM s.GD, <Compare s.GD <Item s.GM <MonthLength>>>: '+' = False;
 
s.GY s.GM s.GD,
<+ <Item s.GM <MonthOffset>> s.GD>: s.DOY,
<Divmod <- s.DOY 1> 73>: (s.DS1) s.DD1,
<+ s.DS1 1>: s.DS,
<+ s.DD1 1>: s.DD,
<+ <Mod <- s.DOY 1> 5> 1>: s.DWD,
 
<Item s.DWD <Weekday>>: (e.Weekday),
<Item s.DS <Seasons>>: (e.Season),
 
e.Weekday ', day ' <Symb s.DD> ' of '
e.Season ' in the YOLD ' <Symb <+ 1166 s.GY>>: e.Desc,
s.DD: {
5, <Item s.DS <Holy5>>: (e.H) = True e.Desc ': celebrate ' e.H;
50, <Item s.DS <Holy50>>: (e.H) = True e.Desc ': celebrate ' e.H;
s.X = True e.Desc;
};
};
 
Item {
1 t.I e.X = t.I;
s.N t.I e.X = <Item <- s.N 1> e.X>;
};
 
IsLeapYear {
s.GY, <Mod s.GY 4>: 0 = True;
s.GY, <Mod s.GY 100>: 0 = False;
s.GY, <Mod s.GY 400>: 0 = True;
s.GY = False;
};
 
MonthOffset { = 0 31 59 90 120 151 181 212 243 273 304 334; };
MonthLength { = 31 28 31 30 31 30 31 31 30 31 30 31; };
 
Weekday { = ('Sweetmorn') ('Boomtime') ('Pungenday')
('Prickle-Prickle') ('Setting Orange'); };
 
Seasons { = ('Chaos') ('Discord') ('Confusion') ('Bureaucracy')
('The Aftermath'); };
 
Holy5 { = ('Mungday') ('Mojoday') ('Syaday') ('Zaraday') ('Maladay'); };
Holy50 { = ('Chaoflux') ('Discoflux') ('Confuflux')
('Bureflux') ('Afflux'); };</syntaxhighlight>
{{out}}
<pre>$ refgo ddate 2010 7 22
Pungenday, day 57 of Confusion in the YOLD 3176
$ refgo ddate 2012 2 28
Prickle-Prickle, day 59 of Chaos in the YOLD 3178
$ refgo ddate 2012 2 29
St. Tib's day in the YOLD 3178
$ refgo ddate 2012 3 1
Setting Orange, day 60 of Chaos in the YOLD 3178
$ refgo ddate 2010 1 5
Setting Orange, day 5 of Chaos in the YOLD 3176: celebrate Mungday
$ refgo ddate 2011 5 3
Pungenday, day 50 of Discord in the YOLD 3177: celebrate Discoflux</pre>
 
=={{header|REXX}}==
Line 4,826 ⟶ 5,060:
{{libheader|Wren-date}}
{{libheader|Wren-fmt}}
<syntaxhighlight lang="ecmascriptwren">import "./date" for Date
import "./fmt" for Fmt
 
var seasons = ["Chaos", "Discord", "Confusion", "Bureaucracy", "The Aftermath"]
2,094

edits