Skip to content

Instantly share code, notes, and snippets.

@vasilescur
Created March 6, 2019 16:49
Show Gist options
  • Save vasilescur/df8a233e10aaa6e3b96c52dfc80bc8ca to your computer and use it in GitHub Desktop.
Save vasilescur/df8a233e10aaa6e3b96c52dfc80bc8ca to your computer and use it in GitHub Desktop.
ACSL Challenge #4
*> ***********************************************************************
*> 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