RosettaCodeData/Task/Mayan-numerals/Modula-2/mayan-numerals.mod2
2026-04-30 12:34:36 -04:00

71 lines
1.4 KiB
Text

MODULE MayanNums;
(* Mayan numerals *)
FROM STextIO IMPORT
ReadString, SkipLine, WriteLn, WriteString;
FROM SWholeIO IMPORT
WriteInt;
CONST
MaxM = 20; (* maximum number of digits *)
TYPE
TMayanDigit = ARRAY [0 .. 4] OF CHAR; (* a single digit *)
TLS = ARRAY [0 .. 5] OF TMayanDigit;
CONST
LS = TLS{" "," . "," .. ","... ","....","----"};
VAR
D : ARRAY [1 .. MaxM] OF CARDINAL;
InputNumber: ARRAY [1 .. MaxM] OF CHAR;
I, J, L, M, S: CARDINAL;
N: INTEGER;
BEGIN
WriteString("Number: ");
ReadString(InputNumber);
SkipLine;
M := LENGTH(InputNumber);
IF M > MaxM THEN M := MaxM END;
FOR I := 1 TO M DO
D[I] := ORD(InputNumber[I]) - ORD("0");
END;
FOR J := M - 1 TO 1 BY -1 DO
FOR I := 1 TO J DO
D[I + 1] := D[I + 1] + 10 * (D[I] MOD 2);
D[I] := D[I] DIV 2
END
END;
S := 1;
WHILE (D[S] = 0) AND (S < M) DO
S := S + 1
END;
FOR I := S TO M DO
WriteString("+----")
END;
WriteString("+");
WriteLn;
FOR L := 3 TO 0 BY -1 DO
FOR I := S TO M DO
IF (D[I] = 0) AND (L = 0) THEN
WriteString("| @ ")
ELSE
N := D[I] - 5 * L;
IF N > 5 THEN
N := 5
ELSIF N < 0 THEN
N := 0
END;
WriteString("|");
WriteString(LS[N]);
END
END;
WriteString("|");
WriteLn
END;
FOR I := S TO M DO
WriteString("+----")
END;
WriteString("+");
WriteLn
END MayanNums.