RosettaCodeData/Task/Discordian-date/BASIC/discordian-date.basic

52 lines
1.4 KiB
Plaintext

#INCLUDE "datetime.bi"
DECLARE FUNCTION julian(AS DOUBLE) AS INTEGER
SeasonNames:
DATA "Chaos", "Discord", "Confusion", "Bureaucracy", "The Aftermath"
Weekdays:
DATA "Setting Orange", "Sweetmorn", "Boomtime", "Pungenday", "Prickle-Prickle"
DaysPreceding1stOfMonth:
' jan feb mar apr may jun jul aug sep oct nov dec
DATA 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
DIM dyear AS INTEGER, dseason AS STRING, dday AS INTEGER, dweekday AS STRING
DIM tmpdate AS DOUBLE, jday AS INTEGER, result AS STRING
DIM L0 AS INTEGER
IF LEN(COMMAND$) THEN
tmpdate = DATEVALUE(COMMAND$)
ELSE
tmpdate = FIX(NOW())
END IF
dyear = YEAR(tmpdate) + 1166
IF (2 = MONTH(tmpdate)) AND (29 = DAY(tmpdate)) THEN
result = "Saint Tib's Day, " & STR$(dyear) & " YOLD"
ELSE
jday = julian(tmpdate)
RESTORE SeasonNames
FOR L0 = 1 TO ((jday - 1) \ 73) + 1
READ dseason
NEXT
dday = (jday MOD 73)
IF 0 = dday THEN dday = 73
RESTORE Weekdays
FOR L0 = 1 TO (jday MOD 5) + 1
READ dweekday
NEXT
result = dweekday & ", " & dseason & " " & TRIM$(STR$(dday)) & ", " & TRIM$(STR$(dyear)) & " YOLD"
END IF
? result
END
FUNCTION julian(d AS DOUBLE) AS INTEGER
'doesn't account for leap years (not needed for ddate)
DIM tmp AS INTEGER, L1 AS INTEGER
RESTORE DaysPreceding1stOfMonth
FOR L1 = 1 TO MONTH(d)
READ tmp
NEXT
FUNCTION = tmp + DAY(d)
END FUNCTION