RosettaCodeData/Task/Look-and-say-sequence/PL-M/look-and-say-sequence.plm
2023-07-01 13:44:08 -04:00

53 lines
1.2 KiB
Text

100H:
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;
COPY$STRING: PROCEDURE (SRC, DEST);
DECLARE (SRC, DEST, I) ADDRESS;
DECLARE (S BASED SRC, D BASED DEST) BYTE;
I = 0;
DO WHILE S(I) <> '$';
D(I) = S(I);
I = I + 1;
END;
D(I) = '$';
END COPY$STRING;
COUNT: PROCEDURE (POS) BYTE;
DECLARE POS ADDRESS, (I, P BASED POS) BYTE;
I = 1;
DO WHILE P(I) = P;
I = I + 1;
END;
RETURN I;
END COUNT;
LOOK$SAY: PROCEDURE (OLD, NEW);
DECLARE (OLD, NEW) ADDRESS;
DECLARE (O BASED OLD, N BASED NEW, C) BYTE;
DO WHILE O <> '$';
C = COUNT(OLD);
N = O;
N(1) = C + '0';
NEW = NEW + 2;
OLD = OLD + C;
END;
N = '$';
END LOOK$SAY;
DECLARE STEPS LITERALLY '15';
DECLARE BUF$SIZE LITERALLY '128';
DECLARE BUFR1 (BUF$SIZE) BYTE INITIAL ('1$');
DECLARE BUFR2 (BUF$SIZE) BYTE;
DECLARE I BYTE;
DO I=1 TO STEPS;
CALL PRINT(.BUFR1);
CALL PRINT(.(13,10,'$'));
CALL LOOK$SAY(.BUFR1, .BUFR2);
CALL COPY$STRING(.BUFR2, .BUFR1);
END;
CALL EXIT;
EOF