167 lines
6 KiB
COBOL
167 lines
6 KiB
COBOL
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. MTF-ENCODE-DECODE.
|
|
|
|
DATA DIVISION.
|
|
WORKING-STORAGE SECTION.
|
|
*> Initial alphabet reference
|
|
01 ALPHABET-INIT PIC X(26) VALUE
|
|
"abcdefghijklmnopqrstuvwxyz".
|
|
|
|
*> Dynamic character list (simulates the JS charList array)
|
|
01 CHAR-TABLE.
|
|
05 CHAR-ITEM PIC X OCCURS 26 TIMES.
|
|
|
|
*> Variables for processing
|
|
01 WORK-AREAS.
|
|
05 INPUT-WORD PIC X(20) VALUE SPACES.
|
|
05 WORD-LEN PIC 99 VALUE 0.
|
|
05 I PIC 99 VALUE 0.
|
|
05 J PIC 99 VALUE 0.
|
|
05 K PIC 99 VALUE 0.
|
|
05 TEMP-CHAR PIC X VALUE SPACE.
|
|
05 CHAR-INDEX PIC 99 VALUE 0.
|
|
|
|
*> Storage for algorithm outputs
|
|
01 ENCODED-DATA.
|
|
05 ENCODED-NUMBERS PIC 99 OCCURS 20 TIMES.
|
|
01 DECODED-DATA.
|
|
05 DECODED-WORD PIC X(20) VALUE SPACES.
|
|
|
|
*> Variables for console logging/displaying
|
|
01 DISPLAY-AREAS.
|
|
05 DISPLAY-LINE PIC X(120) VALUE SPACES.
|
|
05 DISP-POS PIC 99 VALUE 1.
|
|
05 DISP-NUM PIC Z9.
|
|
|
|
*> Equivalent to JS: var words = ['broood', ...]
|
|
01 TEST-DATA.
|
|
05 TEST-WORDS.
|
|
10 FILLER PIC X(20) VALUE "broood".
|
|
10 FILLER PIC X(20) VALUE "bananaaa".
|
|
10 FILLER PIC X(20) VALUE "hiphophiphop".
|
|
05 TEST-WORD-REDEF REDEFINES TEST-WORDS.
|
|
10 TEST-WORD-ARR PIC X(20) OCCURS 3 TIMES.
|
|
05 TEST-IDX PIC 9 VALUE 1.
|
|
|
|
PROCEDURE DIVISION.
|
|
MAIN-LOGIC.
|
|
DISPLAY "Testing Move-To-Front (MTF) Algorithm".
|
|
DISPLAY "=====================================".
|
|
|
|
*> Equivalent to: words.map(...)
|
|
PERFORM VARYING TEST-IDX FROM 1 BY 1 UNTIL TEST-IDX > 3
|
|
MOVE TEST-WORD-ARR(TEST-IDX) TO INPUT-WORD
|
|
PERFORM GET-WORD-LENGTH
|
|
|
|
DISPLAY "Original Word : " INPUT-WORD(1:WORD-LEN)
|
|
|
|
*> Encode
|
|
PERFORM ENCODE-MTF
|
|
PERFORM PRINT-ENCODED
|
|
|
|
*> Decode
|
|
PERFORM DECODE-MTF
|
|
PERFORM PRINT-DECODED
|
|
|
|
DISPLAY "-------------------------------------"
|
|
END-PERFORM.
|
|
|
|
STOP RUN.
|
|
|
|
*> ==========================================
|
|
*> ENCODE ALGORITHM
|
|
*> ==========================================
|
|
ENCODE-MTF.
|
|
PERFORM INIT-CHAR-LIST.
|
|
PERFORM VARYING I FROM 1 BY 1 UNTIL I > WORD-LEN
|
|
MOVE INPUT-WORD(I:1) TO TEMP-CHAR
|
|
MOVE 0 TO CHAR-INDEX
|
|
|
|
*> Simulate JS: charList.indexOf(char)
|
|
PERFORM VARYING J FROM 1 BY 1
|
|
UNTIL J > 26 OR CHAR-INDEX > 0
|
|
IF CHAR-ITEM(J) = TEMP-CHAR
|
|
MOVE J TO CHAR-INDEX
|
|
END-IF
|
|
END-PERFORM
|
|
|
|
*> JS arrays are 0-indexed, COBOL is 1-indexed.
|
|
*> Subtract 1 to match exact JS numeric output.
|
|
COMPUTE ENCODED-NUMBERS(I) = CHAR-INDEX - 1
|
|
|
|
*> Simulate JS: splice(charNum, 1) and unshift()
|
|
PERFORM MOVE-TO-FRONT
|
|
END-PERFORM.
|
|
|
|
*> ==========================================
|
|
*> DECODE ALGORITHM
|
|
*> ==========================================
|
|
DECODE-MTF.
|
|
PERFORM INIT-CHAR-LIST.
|
|
MOVE SPACES TO DECODED-WORD.
|
|
PERFORM VARYING I FROM 1 BY 1 UNTIL I > WORD-LEN
|
|
*> Convert JS 0-based index back to COBOL 1-based index
|
|
COMPUTE CHAR-INDEX = ENCODED-NUMBERS(I) + 1
|
|
MOVE CHAR-ITEM(CHAR-INDEX) TO TEMP-CHAR
|
|
|
|
*> Append character to decoded string
|
|
MOVE TEMP-CHAR TO DECODED-WORD(I:1)
|
|
|
|
*> Simulate JS: splice(num, 1) and unshift()
|
|
PERFORM MOVE-TO-FRONT
|
|
END-PERFORM.
|
|
|
|
*> ==========================================
|
|
*> SHARED HELPER FUNCTIONS
|
|
*> ==========================================
|
|
|
|
*> Moves item at CHAR-INDEX to position 1, shifting rest right
|
|
MOVE-TO-FRONT.
|
|
IF CHAR-INDEX > 1
|
|
PERFORM VARYING K FROM CHAR-INDEX BY -1 UNTIL K = 1
|
|
COMPUTE J = K - 1
|
|
MOVE CHAR-ITEM(J) TO CHAR-ITEM(K)
|
|
END-PERFORM
|
|
MOVE TEMP-CHAR TO CHAR-ITEM(1)
|
|
END-IF.
|
|
|
|
*> Resets the array back to "a" through "z"
|
|
INIT-CHAR-LIST.
|
|
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 26
|
|
MOVE ALPHABET-INIT(I:1) TO CHAR-ITEM(I)
|
|
END-PERFORM.
|
|
|
|
*> Trims whitespace to find true length of current input word
|
|
GET-WORD-LENGTH.
|
|
MOVE 0 TO WORD-LEN.
|
|
PERFORM VARYING I FROM 20 BY -1
|
|
UNTIL I < 1 OR INPUT-WORD(I:1) NOT = SPACE
|
|
CONTINUE
|
|
END-PERFORM.
|
|
MOVE I TO WORD-LEN.
|
|
|
|
*> ==========================================
|
|
*> DISPLAY/LOGGING FORMATTERS
|
|
*> ==========================================
|
|
PRINT-ENCODED.
|
|
MOVE SPACES TO DISPLAY-LINE.
|
|
MOVE 1 TO DISP-POS.
|
|
STRING "Encoded Array : [" DELIMITED BY SIZE
|
|
INTO DISPLAY-LINE WITH POINTER DISP-POS.
|
|
|
|
PERFORM VARYING I FROM 1 BY 1 UNTIL I > WORD-LEN
|
|
MOVE ENCODED-NUMBERS(I) TO DISP-NUM
|
|
IF I = WORD-LEN
|
|
STRING DISP-NUM DELIMITED BY SIZE
|
|
"]" DELIMITED BY SIZE
|
|
INTO DISPLAY-LINE WITH POINTER DISP-POS
|
|
ELSE
|
|
STRING DISP-NUM DELIMITED BY SIZE
|
|
", " DELIMITED BY SIZE
|
|
INTO DISPLAY-LINE WITH POINTER DISP-POS
|
|
END-IF
|
|
END-PERFORM.
|
|
DISPLAY DISPLAY-LINE(1:DISP-POS).
|
|
|
|
PRINT-DECODED.
|
|
DISPLAY "Decoded Word : " DECODED-WORD(1:WORD-LEN).
|