RosettaCodeData/Task/Doomsday-rule/M2000-Interpreter/doomsday-rule.m2000
2025-02-27 18:35:13 -05:00

60 lines
1.5 KiB
Text

' MAKE USING("FORMAT STRING", PAR1, PAR2, ...PARN)
' WE USE READ V TO READ MORE PARAMETERS.
FUNCTION USING(A$) {
VARIANT V : LONG D, S, E, I=1: S$=""
WHILE I<=LEN(A$)
IF S THEN
IF MID$(A$,I,1)<>"#" THEN
IF MID$(A$,I,1)="." THEN D=I ELSE E=I
END IF
ELSE
IF MID$(A$,I,1)="#" THEN S=I
END IF
IF S AND E THEN
IF S>1 THEN S$+=LEFT$(A$, S-1)
A$=MID$(A$, E)
G()
S=0:E=0:D=0
I=1
END IF
I++
END WHILE
IF S THEN
IF S>1 THEN S$+=LEFT$(A$, S-1):E=I-S+1: S=1 ELSE E=I
G()
=S$
ELSE
=S$+A$
END IF
SUB G()
IF ISNUM THEN
READ V
IF D>0 THEN
S$+=STR$(V, STRING$("#",E-D-1)+"0."+STRING$("0",D-S+1))
ELSE
S$+=STR$(V, STRING$("0",E-S-1)+"0")
END IF
ELSE
V=""
READ V
S$+=LEFT$(V+STRING$(" ", E-S), E-S)
END IF
END SUB
}
05 FLUSH : GOSUB 110
10 DIM D$(1 TO 7): FOR I=1 TO 7: READ D$(I): NEXT I
20 DIM D(1 TO 12, 0 TO 1): FOR I=0 TO 1: FOR J=1 TO 12: READ D(J, I): NEXT J : NEXT I
30 READ Y: IF Y=0 THEN BREAK ELSE READ M,D
40 PRINT USING("##/##/#### ", M, D, Y);
50 C=Y DIV 100: R=Y MOD 100
60 S=R DIV 12: T=R MOD 12
70 A=(5*BINARY.AND(C, 3)+2) MOD 7
80 B=(S+T+(T DIV 4)+A) MOD 7
90 PRINT D$((B+D-D(M,-(Y MOD 4=0 AND (Y MOD 100<>0 OR Y MOD 400=0)))+7) MOD 7+1)
100 GOTO 30
110 DATA "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
120 DATA 3,7,7,4,2,6,4,1,5,3,7,5
130 DATA 4,1,7,4,2,6,4,1,5,3,7,5
140 DATA 1800,1,6,1875,3,29,1915,12,7,1970,12,23
150 DATA 2043,5,14,2077,2,12,2101,4,2,0
160 RETURN