RosettaCodeData/Task/Duffinian-numbers/PL-M/duffinian-numbers.plm
2023-09-01 09:35:06 -07:00

80 lines
1.8 KiB
Text

100H:
BDOS: PROCEDURE (F,A); DECLARE F BYTE, A ADDRESS; GO TO 5; END BDOS;
EXIT: PROCEDURE; GO TO 0; END EXIT;
PR$CHAR: PROCEDURE (C); DECLARE C BYTE; CALL BDOS(2,C); END PR$CHAR;
PRINT: PROCEDURE (S); DECLARE S ADDRESS; CALL BDOS(9,S); END PRINT;
PR$NUM: PROCEDURE (N, WIDTH);
DECLARE N ADDRESS, WIDTH BYTE;
DECLARE S (6) BYTE INITIAL ('.....$');
DECLARE P ADDRESS, DG BASED P BYTE;
P = .S(5);
DIGIT:
P = P - 1;
DG = '0' + N MOD 10;
IF WIDTH > 0 THEN WIDTH = WIDTH - 1;
IF (N := N / 10) > 0 THEN GO TO DIGIT;
CALL PRINT(P);
DO WHILE WIDTH > 0;
CALL PR$CHAR(' ');
WIDTH = WIDTH - 1;
END;
END PR$NUM;
DECLARE MAX$SIGMA LITERALLY '10$001';
DECLARE SIGMA (MAX$SIGMA) ADDRESS;
CALC$SIGMA: PROCEDURE;
DECLARE (I, J) ADDRESS;
DO I = 1 TO MAX$SIGMA-1;
SIGMA(I) = 0;
END;
DO I = 1 TO MAX$SIGMA-1;
DO J = I TO MAX$SIGMA-1 BY I;
SIGMA(J) = SIGMA(J) + I;
END;
END;
END CALC$SIGMA;
GCD: PROCEDURE (X, Y) ADDRESS;
DECLARE (X, Y, Z) ADDRESS;
DO WHILE Y > 0;
Z = X MOD Y;
X = Y;
Y = Z;
END;
RETURN X;
END GCD;
DUFF: PROCEDURE (N) BYTE;
DECLARE N ADDRESS;
RETURN SIGMA(N) > N+1 AND GCD(N, SIGMA(N)) = 1;
END DUFF;
DUFF$TRIPLE: PROCEDURE (N) BYTE;
DECLARE N ADDRESS;
RETURN DUFF(N) AND DUFF(N+1) AND DUFF(N+2);
END DUFF$TRIPLE;
DECLARE N ADDRESS, I BYTE;
CALL CALC$SIGMA;
CALL PRINT(.('FIRST 50 DUFFINIAN NUMBERS:',13,10,'$'));
N = 0;
DO I = 1 TO 50;
DO WHILE NOT DUFF(N := N+1); END;
CALL PR$NUM(N, 4);
IF I MOD 10 = 0 THEN CALL PRINT(.(13,10,'$'));
END;
CALL PRINT(.(13,10,'FIRST 15 DUFFINIAN TRIPLES:',13,10,'$'));
N = 0;
DO I = 1 TO 15;
DO WHILE NOT DUFF$TRIPLE(N := N+1); END;
CALL PR$NUM(N, 6);
CALL PR$NUM(N+1, 6);
CALL PR$NUM(N+2, 6);
CALL PRINT(.(13,10,'$'));
END;
CALL EXIT;
EOF