Discordian date: Difference between revisions

add Refal
m (syntax highlighting fixup automation)
(add Refal)
 
(8 intermediate revisions by 5 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,076 ⟶ 3,217:
@add(@time("year"),3066))
)),".")</syntaxhighlight>
 
=={{header|jq}}==
'''Adapted from [[#Wren]]'''
{{works with|jq}}
'''Also works with gojq, the Go implementation of jq'''
 
'''Also works with fq, a Go implementation of a large subset of jq'''
<syntaxhighlight lang=jq>
### Gregorian calendar
def isLeapYear(y):
y%4 == 0 and ((y%100 != 0) or (y%400 == 0));
 
### Discordian calendar
def seasons: ["Chaos", "Discord", "Confusion", "Bureaucracy", "The Aftermath"];
 
def weekdays: ["Sweetmorn", "Boomtime", "Pungenday", "Prickle-Prickle", "Setting Orange"];
 
def apostles: ["Mungday", "Mojoday", "Syaday", "Zaraday", "Maladay"];
 
def holidays: ["Chaoflux", "Discoflux", "Confuflux", "Bureflux", "Afflux"];
 
# Input: {year, dayOfYear}
def discordian(date):
date.year as $y
| " in the YOLD \($y + 1166)." as $yold
| { doy: date.dayOfYear, holyday: ""}
| if isLeapYear($y) and (.doy == 60) then "St. Tib's Day" + $yold
else if isLeapYear($y) and (.doy > 60) then .doy += -1 else . end
| .doy += -1
| .seasonDay = ((.doy % 73) + 1)
| .seasonNr = ((.doy/73)|floor)
| .weekdayNr = .doy % 5
| if .seasonDay == 5 then .holyday = " Celebrate \(apostles[.seasonNr])!"
elif .seasonDay == 50 then .holyday = " Celebrate \(holidays[.seasonNr])!"
else .
end
| .season = seasons[.seasonNr]
| .dow = weekdays[.weekdayNr]
| "\(.dow), day \(.seasonDay) of \(.season)\($yold)\(.holyday)"
end ;
 
def dates: [
"2010-01-01",
"2010-01-05",
"2011-02-19",
"2012-02-28",
"2012-02-29",
"2012-03-01",
"2013-03-19",
"2014-05-03",
"2015-05-31",
"2016-06-22",
"2016-07-15",
"2017-08-12",
"2018-09-19",
"2018-09-26",
"2019-10-24",
"2020-12-08",
"2020-12-31"
];
 
dates[]
| (strptime("%Y-%m-%d")
| {year: .[0], dayOfYear: (1 + .[-1])}) as $dt
| "\(.) = \(discordian($dt))"
</syntaxhighlight>
{{output}}
As for [[#Wren|Wren]].
 
=={{header|Julia}}==
Line 3,814 ⟶ 4,023:
> Calendar.Day((Calendar.Discordian.Month()+1)->day(1));
Result: Day(Thu 20 Oct 2011)</syntaxhighlight>
 
=={{header|PL/M}}==
{{works with|8080 PL/M Compiler}} ... under CP/M (or an emulator)
<br>Based on:{{Trans|MAD}}...via Algol W
<syntaxhighlight lang="plm">
100H: /* DISCORDIAN DATE CALCULATION - TRANSLATION OF MAD (VIA ALGOL W) */
 
/* CP/M SYSTEM CALL AND I/O ROUTINES */
BDOS: PROCEDURE( FN, ARG ); DECLARE FN BYTE, ARG ADDRESS; GOTO 5; END;
PR$CHAR: PROCEDURE( C ); DECLARE C BYTE; CALL BDOS( 2, C ); END;
PR$STRING: PROCEDURE( S ); DECLARE S ADDRESS; CALL BDOS( 9, S ); END;
PR$NL: PROCEDURE; CALL PR$CHAR( 0DH ); CALL PR$CHAR( 0AH ); END;
PR$NUMBER: PROCEDURE( N ); /* PRINTS A NUMBER IN THE MINIMUN FIELD WIDTH */
DECLARE N ADDRESS;
DECLARE V ADDRESS, N$STR ( 6 )BYTE, W BYTE;
V = N;
W = LAST( N$STR );
N$STR( W ) = '$';
N$STR( W := W - 1 ) = '0' + ( V MOD 10 );
DO WHILE( ( V := V / 10 ) > 0 );
N$STR( W := W - 1 ) = '0' + ( V MOD 10 );
END;
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 */
 
DECLARE HOLY5 ( 5 )ADDRESS;
DECLARE HOLY50 ( 5 )ADDRESS;
DECLARE DISDAY ( 5 )ADDRESS;
DECLARE DISSSN ( 5 )ADDRESS;
DECLARE MLENGT ( 13 )ADDRESS
INITIAL( 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 COMMAND LINE, NB: NO VALIDATION */
DECLARE ( GMONTH, GDAY, GYEAR ) ADDRESS; /* MUST BE IN MM/DD/YYYY FORMAT */
CALL CL$INIT;
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;
CALL PR$STRING( .'SAINT TIB''S DAY IN THE Y.O.L.D. $' );
CALL PR$NUMBER( GYEAR + 1166 );
END;
ELSE DO;
DECLARE ( YRDAY, SEASON, DAY, WKDAY ) ADDRESS;
YRDAY = MLENGT(GMONTH)+GDAY;
SEASON = YRDAY / 73;
DAY = YRDAY-SEASON*73;
WKDAY = (YRDAY-1) MOD 5;
CALL PR$STRING( DISDAY(WKDAY) );
CALL PR$STRING( .', DAY $' );
CALL PR$NUMBER( DAY );
CALL PR$STRING( .' OF $' );
CALL PR$STRING( DISSSN(SEASON) );
CALL PR$STRING( .' IN THE Y.O.L.D $' );
CALL PR$NUMBER( GYEAR + 1166 );
IF DAY = 5 THEN DO;
CALL PR$NL;
CALL PR$STRING( .'CELEBRATE $' );
CALL PR$STRING( 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;
END;
CALL PR$NL;
 
EOF
</syntaxhighlight>
{{out}}
With the command line: <code>DISCORD 03/29/2023</code>:
<pre>
3/29/2023
PUNGENDAY, DAY 15 OF DISCORD IN THE Y.O.L.D 3189
</pre>
 
=={{header|PowerBASIC}}==
Line 4,139 ⟶ 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,201 ⟶ 4,611:
Boomtime, Bureaucracy 73, 3181
Setting Orange, The Aftermath 73, 3266
</pre>
 
=={{header|RPL}}==
{{works with|Halcyon Calc|4.2.7}}
≪ '''IF''' DUP2 R→C (29,2) == '''THEN''' DROP2 0
'''ELSE'''
'''IF''' DUP 1 == '''THEN''' DROP
'''ELSE'''
{ 31 59 90 120 151 181 212 243 273 304 334 }
SWAP 1 - GET +
'''END END'''
≫ ‘'''DQtm'''’ STO
≪ 1166 + ROT ROT '''DQtm'''
'''IF''' DUP '''THEN'''
1 - { "Sweetmorn", "Boomtime", "Pungenday", "Prickle-Prickle", "Setting Orange" }
OVER 5 MOD 1 + GET ", " +
SWAP { "Chaos", "Discord", "Confusion", "Bureaucracy", "The Aftermath" }
OVER 73 / IP RND 1 + GET " " +
SWAP 73 MOD 1 + →STR + +
'''ELSE''' DROP "St. Tib's Day" '''END'''
", YoLD " + SWAP →STR +
≫ ‘'''DDATE'''’ STO
{{in}}
<pre>
19,1,2023 DDATE
29,2,2024 DDATE
25,12,800 DDATE
</pre>
{{out}}
<pre>
3: "Prickle-Prickle, Chaos 19, YoLD 3189"
2: "St. Tib's Day, YoLD 3190"
1: "Prickle-Prickle, The Aftermath 67, YoLD 1966"
</pre>
 
Line 4,616 ⟶ 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