Created
March 6, 2019 16:49
-
-
Save vasilescur/df8a233e10aaa6e3b96c52dfc80bc8ca to your computer and use it in GitHub Desktop.
ACSL Challenge #4
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
*> *********************************************************************** | |
*> NAME: RADU VASILESCU | |
*> SCHOOL: LOVELAND HIGH SCHOOL | |
*> DIVISION: SENIOR 5 DIVISION | |
*> PROGRAM: ACSL CONTEST #4 - DUPLICATES | |
*> *********************************************************************** | |
*> LANGUAGE: COBOL | |
*> COMPILER: GNUCOBOL 2.0RC2 FOR WINDOWS | |
*> NOTE: COMPILE WITH -FREE FLAG | |
*> *********************************************************************** | |
IDENTIFICATION DIVISION. | |
PROGRAM-ID. DUPLICATES. | |
*> *********************************************************************** | |
DATA DIVISION. | |
*> *********************************************************************** | |
*> *********************************************************************** | |
WORKING-STORAGE SECTION. | |
*> *********************************************************************** | |
01 INPUT-LINE PIC X(300) VALUE SPACES. | |
01 INPUT-LINE-LEN PIC 999 VALUE 0. | |
01 CURRENT-LETTER-INDEX PIC 999 VALUE 0. | |
01 CURRENT-LETTER PIC X VALUE SPACE. | |
01 LETTERS. | |
05 ARRAY-LETTERS OCCURS 26 TIMES. | |
10 LETTER-NAME PIC X. | |
10 LETTER-COUNT PIC 999. | |
10 LETTER-LEFT-IND PIC 99. | |
10 LETTER-RIGHT-IND PIC 99. | |
01 ROOT-INDEX PIC 99 VALUE 0. | |
01 ADD-ITER-INDEX PIC 99 VALUE 0. | |
01 ITER-ARRAY-INDEX PIC 99 VALUE 0. | |
01 CURRENT-LETTER-VALUE PIC 99 VALUE 0. | |
01 OTHER-LETTER-VALUE PIC 99 VALUE 0. | |
01 FINISHED-ADDING-FLAG PIC X VALUE 'N'. | |
01 RESULT PIC 999 VALUE 0. | |
*> *********************************************************************** | |
PROCEDURE DIVISION. | |
*> *********************************************************************** | |
*> *********************************************************************** | |
PROC-MAIN. | |
*> *********************************************************************** | |
*> **************************** | |
*> MAIN PROGRAM LOOP | |
*> **************************** | |
PERFORM FOREVER | |
*> CLEAR LETTER VALUES TO 0 | |
PERFORM PROC-SETUPLETTERS | |
*> **************************** | |
*> GET USER INPUT | |
*> **************************** | |
DISPLAY 'ENTER INPUT BELOW OR CTRL-C TO QUIT' | |
ACCEPT INPUT-LINE | |
*> CALCULATE ACTUAL STRING LENGTH | |
MOVE 0 TO INPUT-LINE-LEN | |
INSPECT FUNCTION REVERSE(INPUT-LINE) | |
TALLYING INPUT-LINE-LEN FOR LEADING SPACES | |
COMPUTE INPUT-LINE-LEN = LENGTH OF INPUT-LINE - INPUT-LINE-LEN | |
*> TO UPPER | |
MOVE FUNCTION UPPER-CASE(INPUT-LINE) TO INPUT-LINE | |
*> **************************** | |
*> SETUP ROOT NODE | |
*> **************************** | |
MOVE FUNCTION ORD(INPUT-LINE(1:1)) TO ROOT-INDEX | |
SUBTRACT 65 FROM ROOT-INDEX *> ORD('A') = 66 ==> 'A' - 65 = 1 | |
MOVE 1 TO LETTER-COUNT(ROOT-INDEX) | |
*>! DEBUG ONLY *************************************************** | |
*>DISPLAY 'ROOT NODE IS ' WITH NO ADVANCING | |
*>DISPLAY ARRAY-LETTERS(ROOT-INDEX) | |
*>! DEBUG ONLY *************************************************** | |
*> **************************** | |
*> LOOP OVER LETTERS | |
*> **************************** | |
PERFORM VARYING CURRENT-LETTER-INDEX | |
FROM 2 BY 1 | |
UNTIL CURRENT-LETTER-INDEX > INPUT-LINE-LEN | |
IF INPUT-LINE(CURRENT-LETTER-INDEX:1) NOT EQUALS SPACE | |
*>! DEBUG ONLY ******************************************* | |
*>DISPLAY ' CURRENT LETTER IS ' WITH NO ADVANCING | |
*>DISPLAY INPUT-LINE(CURRENT-LETTER-INDEX:1) | |
*> WITH NO ADVANCING | |
*>DISPLAY ' = ' WITH NO ADVANCING | |
*>DISPLAY FUNCTION ORD(INPUT-LINE(CURRENT-LETTER-INDEX:1)) | |
*> | |
*>DISPLAY LETTERS | |
*>DISPLAY ' ' | |
*>! DEBUG ONLY ******************************************* | |
*> **************************** | |
*> IF LETTER ALREADY IN TREE, JUST INCREMENT VALUE | |
*> **************************** | |
MOVE FUNCTION ORD(INPUT-LINE(CURRENT-LETTER-INDEX:1)) | |
TO ADD-ITER-INDEX | |
SUBTRACT 65 FROM ADD-ITER-INDEX | |
IF LETTER-COUNT(ADD-ITER-INDEX) > 0 | |
ADD 1 TO LETTER-COUNT(ADD-ITER-INDEX) | |
ELSE *> OTHERWISE, ADD THE LETTER TO THE TREE | |
*> **************************** | |
PERFORM PROC-ADDTOTREE | |
*> **************************** | |
END-IF | |
END-IF | |
END-PERFORM | |
*> **************************** | |
*> COUNT NODES WITH EXACTLY ONE CHILD | |
*> **************************** | |
MOVE 0 TO RESULT | |
PERFORM VARYING ITER-ARRAY-INDEX | |
FROM 1 BY 1 | |
UNTIL ITER-ARRAY-INDEX > 26 | |
IF LETTER-LEFT-IND(ITER-ARRAY-INDEX) NOT EQUALS 0 | |
AND LETTER-RIGHT-IND(ITER-ARRAY-INDEX) EQUALS 0 | |
ADD LETTER-COUNT(ITER-ARRAY-INDEX) TO RESULT | |
END-IF | |
IF LETTER-LEFT-IND(ITER-ARRAY-INDEX) EQUALS 0 | |
AND LETTER-RIGHT-IND(ITER-ARRAY-INDEX) NOT EQUALS 0 | |
ADD LETTER-COUNT(ITER-ARRAY-INDEX) TO RESULT | |
END-IF | |
END-PERFORM | |
*> **************************** | |
DISPLAY RESULT | |
*> **************************** | |
END-PERFORM | |
STOP RUN. | |
*> *********************************************************************** | |
PROC-ADDTOTREE. | |
*> *********************************************************************** | |
MOVE ROOT-INDEX TO ADD-ITER-INDEX | |
MOVE 'N' TO FINISHED-ADDING-FLAG | |
MOVE FUNCTION ORD(INPUT-LINE(CURRENT-LETTER-INDEX:1)) | |
TO CURRENT-LETTER-VALUE | |
SUBTRACT 65 FROM CURRENT-LETTER-VALUE | |
*> **************************** | |
*> TREE TRAVERSAL LOOP | |
*> **************************** | |
PERFORM UNTIL FINISHED-ADDING-FLAG = 'Y' | |
*> GET THE VALUE OF THE TREES LETTER | |
MOVE FUNCTION ORD(LETTER-NAME(ADD-ITER-INDEX)) | |
TO OTHER-LETTER-VALUE | |
SUBTRACT 65 FROM OTHER-LETTER-VALUE | |
IF CURRENT-LETTER-VALUE < OTHER-LETTER-VALUE | |
IF LETTER-LEFT-IND(ADD-ITER-INDEX) = 0 *> NO LETTER; INSERT | |
MOVE CURRENT-LETTER-VALUE | |
TO LETTER-LEFT-IND(ADD-ITER-INDEX) | |
MOVE 1 TO LETTER-COUNT(CURRENT-LETTER-VALUE) | |
MOVE 'Y' TO FINISHED-ADDING-FLAG | |
ELSE *> ALREADY THERE; RE-SEARCH FROM LEFT MEMBER | |
MOVE LETTER-LEFT-IND(ADD-ITER-INDEX) TO ADD-ITER-INDEX | |
END-IF | |
ELSE | |
IF LETTER-RIGHT-IND(ADD-ITER-INDEX) = 0 *> NO LETTER; INSERT | |
MOVE CURRENT-LETTER-VALUE | |
TO LETTER-RIGHT-IND(ADD-ITER-INDEX) | |
MOVE 1 TO LETTER-COUNT(CURRENT-LETTER-VALUE) | |
MOVE 'Y' TO FINISHED-ADDING-FLAG | |
ELSE *> ALREADY THERE; RE-SEARCH FROM RIGHT MEMBER | |
MOVE LETTER-RIGHT-IND(ADD-ITER-INDEX) TO ADD-ITER-INDEX | |
END-IF | |
END-IF | |
END-PERFORM | |
. | |
*> *********************************************************************** | |
PROC-SETUPLETTERS. | |
*> *********************************************************************** | |
*> SETUP LETTERS ARRAY | |
MOVE 'A0000000' TO ARRAY-LETTERS(1) | |
MOVE 'B0000000' TO ARRAY-LETTERS(2) | |
MOVE 'C0000000' TO ARRAY-LETTERS(3) | |
MOVE 'D0000000' TO ARRAY-LETTERS(4) | |
MOVE 'E0000000' TO ARRAY-LETTERS(5) | |
MOVE 'F0000000' TO ARRAY-LETTERS(6) | |
MOVE 'G0000000' TO ARRAY-LETTERS(7) | |
MOVE 'H0000000' TO ARRAY-LETTERS(8) | |
MOVE 'I0000000' TO ARRAY-LETTERS(9) | |
MOVE 'J0000000' TO ARRAY-LETTERS(10) | |
MOVE 'K0000000' TO ARRAY-LETTERS(11) | |
MOVE 'L0000000' TO ARRAY-LETTERS(12) | |
MOVE 'M0000000' TO ARRAY-LETTERS(13) | |
MOVE 'N0000000' TO ARRAY-LETTERS(14) | |
MOVE 'O0000000' TO ARRAY-LETTERS(15) | |
MOVE 'P0000000' TO ARRAY-LETTERS(16) | |
MOVE 'Q0000000' TO ARRAY-LETTERS(17) | |
MOVE 'R0000000' TO ARRAY-LETTERS(18) | |
MOVE 'S0000000' TO ARRAY-LETTERS(19) | |
MOVE 'T0000000' TO ARRAY-LETTERS(20) | |
MOVE 'U0000000' TO ARRAY-LETTERS(21) | |
MOVE 'V0000000' TO ARRAY-LETTERS(22) | |
MOVE 'W0000000' TO ARRAY-LETTERS(23) | |
MOVE 'X0000000' TO ARRAY-LETTERS(24) | |
MOVE 'Y0000000' TO ARRAY-LETTERS(25) | |
MOVE 'Z0000000' TO ARRAY-LETTERS(26) | |
. | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment