Mayan numerals: Difference between revisions
Content added Content deleted
No edit summary |
Not a robot (talk | contribs) (Add PL/M) |
||
Line 2,632: | Line 2,632: | ||
| style="border: solid black 2px;background-color: #fffff0;border-bottom: double 6px;border-radius: 1em;-moz-border-radius: 1em;-webkit-border-radius: 1em;vertical-align: bottom;width: 3.25em;" | ● |
| style="border: solid black 2px;background-color: #fffff0;border-bottom: double 6px;border-radius: 1em;-moz-border-radius: 1em;-webkit-border-radius: 1em;vertical-align: bottom;width: 3.25em;" | ● |
||
|} |
|} |
||
=={{header|PL/M}}== |
|||
<lang plm>/* MAYAN NUMERALS IN PL/M |
|||
THIS PROGRAM RUNS UNDER CP/M AND TAKES THE NUMBER ON THE COMMAND LINE */ |
|||
100H: |
|||
/* CP/M CALLS */ |
|||
BDOS: PROCEDURE (FN, ARG); DECLARE FN BYTE, ARG ADDRESS; GO TO 5; END BDOS; |
|||
EXIT: PROCEDURE; CALL BDOS(0,0); END EXIT; |
|||
PRINT: PROCEDURE (S); DECLARE S ADDRESS; CALL BDOS(9,S); END PRINT; |
|||
/* CP/M COMMAND LINE */ |
|||
DECLARE CL$PTR ADDRESS INITIAL (80H), CMD$LEN BASED CL$PTR BYTE; |
|||
DECLARE CMD$PTR ADDRESS INITIAL (81H), CMD$LINE BASED CMD$PTR BYTE; |
|||
/* THE PIPE AND AT SYMBOLS ARE NOT INCLUDED IN THE PL/M CHARSET */ |
|||
DECLARE PIPE LITERALLY '7CH', AT LITERALLY '40H'; |
|||
/* PRINT BORDER FOR N DIGITS */ |
|||
BORDER: PROCEDURE (N); |
|||
DECLARE (I, N) BYTE; |
|||
DO I=1 TO N; |
|||
CALL PRINT(.'+----$'); |
|||
END; |
|||
CALL PRINT(.('+',13,10,'$')); |
|||
END BORDER; |
|||
/* PRINT LINE FOR GIVEN DIGIT */ |
|||
DIGIT$LINE: PROCEDURE (LINE, DIGIT); |
|||
DECLARE (I, LINE, DIGIT, UPB) BYTE; |
|||
DECLARE PARTS (6) ADDRESS; |
|||
PARTS(0) = .(PIPE,' $'); PARTS(1) = .(PIPE,' . $'); |
|||
PARTS(2) = .(PIPE,' .. $'); PARTS(3) = .(PIPE,'... $'); |
|||
PARTS(4) = .(PIPE,'....$'); PARTS(5) = .(PIPE,'----$'); |
|||
IF DIGIT = 0 THEN DO; |
|||
IF LINE = 3 THEN CALL PRINT(.(PIPE,' ',AT,' $')); |
|||
ELSE CALL PRINT(PARTS(0)); |
|||
END; |
|||
ELSE DO; |
|||
UPB = 15-LINE*5; |
|||
IF DIGIT < UPB THEN CALL PRINT(PARTS(0)); |
|||
ELSE IF DIGIT >= UPB+5 THEN CALL PRINT(PARTS(5)); |
|||
ELSE CALL PRINT(PARTS(DIGIT-UPB)); |
|||
END; |
|||
END DIGIT$LINE; |
|||
/* PRINT LINE GIVEN DIGITS */ |
|||
LINE: PROCEDURE (L, DIGITS, NDIGITS); |
|||
DECLARE DIGITS ADDRESS; |
|||
DECLARE (L, I, D BASED DIGITS, NDIGITS) BYTE; |
|||
DO I=0 TO NDIGITS-1; |
|||
CALL DIGIT$LINE(L, D(I)); |
|||
END; |
|||
CALL PRINT(.(PIPE,13,10,'$')); |
|||
END LINE; |
|||
/* CHECK FOR ARGUMENT */ |
|||
IF CMD$LEN < 2 THEN DO; |
|||
CALL PRINT(.'NO INPUT$'); |
|||
CALL EXIT; |
|||
END; |
|||
/* PREPROCESS COMMAND LINE - TURN EACH ASCII DIGIT INTO 0-9 */ |
|||
DECLARE (I, J) BYTE; |
|||
DO I = 1 TO CMD$LEN-1; |
|||
CMD$LINE(I) = CMD$LINE(I) - '0'; |
|||
IF CMD$LINE(I) > 9 THEN DO; |
|||
/* ERROR MESSAGE FOR INVALID INPUT */ |
|||
CALL PRINT(.'INVALID DIGIT IN INPUT$'); |
|||
CALL EXIT; |
|||
END; |
|||
END; |
|||
/* CONVERT TO BASE 20 DIGIT BY DIGIT */ |
|||
J = CMD$LEN-2; |
|||
DO WHILE J > 0; |
|||
DO I = 1 TO J; |
|||
CMD$LINE(I+1) = CMD$LINE(I+1) + 10*(CMD$LINE(I) AND 1); |
|||
CMD$LINE(I) = CMD$LINE(I) / 2; |
|||
END; |
|||
J = J - 1; |
|||
END; |
|||
/* FIND FIRST NONZERO DIGIT */ |
|||
J = 1; |
|||
DO WHILE CMD$LINE(J) = 0 AND J < CMD$LEN-1; |
|||
J = J + 1; |
|||
END; |
|||
/* PRINT CARTOUCHES */ |
|||
DECLARE SIZE BYTE; |
|||
SIZE = CMD$LEN-J; |
|||
CALL BORDER(SIZE); |
|||
DO I=0 TO 3; |
|||
CALL LINE(I, .CMD$LINE(J), SIZE); |
|||
END; |
|||
CALL BORDER(SIZE); |
|||
CALL EXIT; |
|||
EOF</lang> |
|||
{{out}} |
|||
<pre style='height:50ex;'>A>MAYAN 4005 |
|||
+----+----+----+ |
|||
| | | | |
|||
| | | | |
|||
|----| | | |
|||
|----| @ |----| |
|||
+----+----+----+ |
|||
A>MAYAN 8017 |
|||
+----+----+----+----+ |
|||
| | | | .. | |
|||
| | | |----| |
|||
| | | |----| |
|||
| . | @ | @ |----| |
|||
+----+----+----+----+ |
|||
A>MAYAN 326205 |
|||
+----+----+----+----+----+ |
|||
| | | | | | |
|||
| | |----| | | |
|||
| | |----|----| | |
|||
| .. | @ |----|----|----| |
|||
+----+----+----+----+----+ |
|||
A>MAYAN 886205 |
|||
+----+----+----+----+----+ |
|||
| | | | | | |
|||
| | |----| | | |
|||
| |----|----|----| | |
|||
|----|----|----|----|----| |
|||
+----+----+----+----+----+ |
|||
A>MAYAN 18380658207197784 |
|||
+----+----+----+----+----+----+----+----+----+----+----+----+----+ |
|||
| | | |....| | | | | |....| | | | |
|||
| | |....|----|....| | | |....|----|....| | | |
|||
| |....|----|----|----|....| |....|----|----|----|....| | |
|||
|....|----|----|----|----|----|....|----|----|----|----|----|....| |
|||
+----+----+----+----+----+----+----+----+----+----+----+----+----+</pre> |
|||
=={{header|Phix}}== |
=={{header|Phix}}== |