N-grams: Difference between revisions

3,257 bytes added ,  1 month ago
Add PL/M
(Add BASIC)
(Add PL/M)
Line 825:
alpha/freq: LIVE 2, AND 1, LET 1, LIV 1, AND 1, D LE 1, E AN 1, ET L 1, IVE 1, LET 1, ND L 1, T LI 1, VE A 1
</pre>
 
=={{header|PL/M}}==
<syntaxhighlight lang="plm">100H:
BDOS: PROCEDURE (F,A); DECLARE F BYTE, A ADDRESS; GO TO 5; END BDOS;
EXIT: PROCEDURE; GO TO 0; END EXIT;
PR$CH: PROCEDURE (C); DECLARE C BYTE; CALL BDOS(2, C); END PR$CH;
PR$STR: PROCEDURE (S); DECLARE S ADDRESS; CALL BDOS(9, S); END PR$STR;
 
PR$NUM: PROCEDURE (N);
DECLARE N ADDRESS;
DECLARE S (6) BYTE INITIAL ('.....$');
DECLARE I BYTE;
I = 5;
DIGIT:
I = I - 1;
S(I) = N MOD 10 + '0';
IF (N := N / 10) > 0 THEN GO TO DIGIT;
CALL PR$STR(.S(I));
END PR$NUM;
 
PR$NSTR: PROCEDURE (N, STR);
DECLARE (STR, N) ADDRESS, CH BASED STR BYTE;
DO WHILE N>0;
CALL PR$CH(CH);
STR = STR+1;
N = N-1;
END;
END PR$NSTR;
 
CMP$NSTR: PROCEDURE (N, STRA, STRB) BYTE;
DECLARE (STRA, STRB, N, I) ADDRESS;
DECLARE A BASED STRA BYTE;
DECLARE B BASED STRB BYTE;
DO I=0 TO N-1;
IF A(I) <> B(I) THEN RETURN 0;
END;
RETURN 0FFH;
END CMP$NSTR;
 
STR$LEN: PROCEDURE (STR) ADDRESS;
DECLARE (N, STR) ADDRESS, S BASED STR BYTE;
N = 0;
DO WHILE S(N) <> '$';
N = N+1;
END;
RETURN N;
END STR$LEN;
 
FIND$NGRAMS: PROCEDURE (N, STR, RSLT) ADDRESS;
DECLARE (N, I, J, STR, RSLT, FOUND) ADDRESS;
DECLARE S BASED STR BYTE;
DECLARE ITEM BASED RSLT ADDRESS;
DECLARE MAXPOS ADDRESS;
MAXPOS = STR$LEN(STR) - N;
FOUND = 0;
DO I = 0 TO MAXPOS;
IF FOUND = 0 THEN GO TO NOT$FOUND;
DO J = 0 TO FOUND;
IF CMP$NSTR(N, .S(I), ITEM(2*J)) THEN DO;
ITEM(2*J+1) = ITEM(2*J+1) + 1;
GO TO NEXT$ITEM;
END;
END;
NOT$FOUND:
ITEM(2*FOUND) = .S(I);
ITEM(2*FOUND+1) = 1;
FOUND = FOUND + 1;
NEXT$ITEM:
END;
RETURN FOUND;
END FIND$NGRAMS;
 
PRINT$NGRAMS: PROCEDURE (N, STR);
DECLARE (N, I, STR) ADDRESS;
DECLARE RESULT (64) ADDRESS;
DECLARE AMOUNT ADDRESS;
CALL PR$CH(N + '0');
CALL PR$STR(.'-GRAMS OF ''$');
CALL PR$STR(STR);
CALL PR$STR(.(''': ', 13, 10, '$'));
 
AMOUNT = FIND$NGRAMS(N, STR, .RESULT);
DO I = 0 TO AMOUNT - 1;
CALL PR$CH('''');
CALL PR$NSTR(N, RESULT(2*I));
CALL PR$STR(.''' - $');
CALL PR$NUM(RESULT(2*I+1));
IF I MOD 5 = 4
THEN CALL PR$STR(.(13,10,'$'));
ELSE CALL PR$CH(9);
END;
CALL PR$STR(.(13,10,'$'));
END PRINT$NGRAMS;
 
DECLARE STRING DATA ('LIVE AND LET LIVE$');
DECLARE N BYTE;
 
DO N = 2 TO 4;
CALL PRINT$NGRAMS(N, .STRING);
END;
CALL EXIT;
EOF</syntaxhighlight>
{{out}}
<pre>2-GRAMS OF 'LIVE AND LET LIVE':
'LI' - 2 'IV' - 2 'VE' - 2 'E ' - 1 ' A' - 1
'AN' - 1 'ND' - 1 'D ' - 1 ' L' - 2 'LE' - 1
'ET' - 1 'T ' - 1
3-GRAMS OF 'LIVE AND LET LIVE':
'LIV' - 2 'VE ' - 1 'E A' - 1 ' AN' - 1 'AND' - 1
'ND ' - 1 'D L' - 1 ' LE' - 1 'LET' - 1 'ET ' - 1
'T L' - 1 ' LI' - 1 'IVE' - 1
4-GRAMS OF 'LIVE AND LET LIVE':
'LIVE' - 2 'IVE ' - 1 'VE A' - 1 'E AN' - 1 ' AND' - 1
'AND ' - 1 'ND L' - 1 'D LE' - 1 ' LET' - 1 'LET ' - 1
'ET L' - 1 'T LI' - 1 ' LIV' - 1</pre>
 
=={{header|Python}}==
2,117

edits