IDENTIFICATION DIVISION. PROGRAM-ID. AoC-2020-day-1-part-2. *> Inspired by https://github.com/GaloisGirl/Coding *> Compilation: cobc -F -fmfcomment -std=rm -x ex2-cob.cob *> Utilisation: ./ex2-cob < INPUT.txt AUTHOR. Bruno Raoult. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INPUTFILE ASSIGN TO KEYBOARD ORGANIZATION IS LINE SEQUENTIAL. DATA DIVISION. FILE SECTION. FD INPUTFILE. 01 INPUTRECORD PIC 9(4). WORKING-STORAGE SECTION. 01 FILE-STATUS PIC 9 VALUE 0. 01 LEN PIC 9(3) VALUE 0. 01 ARR. 05 VAL PIC 9(5) OCCURS 1024. 01 S PIC 9(4). 01 P PIC 9(12). 01 FMT PIC Z(12)9. LOCAL-STORAGE SECTION. 01 I USAGE UNSIGNED-INT VALUE 1. 01 J USAGE UNSIGNED-INT VALUE 1. 01 K USAGE UNSIGNED-INT VALUE 1. 01 TMP USAGE UNSIGNED-INT VALUE 1. PROCEDURE DIVISION. 01-MAIN. OPEN INPUT INPUTFILE. PERFORM 02-READ UNTIL FILE-STATUS = 1. CLOSE INPUTFILE. *> PERFORM 06-PRINT. PERFORM 05-BUBBLE *> DISPLAY "=========================". *> PERFORM 06-PRINT. PERFORM 04-LOOP STOP RUN. 02-READ. READ INPUTFILE AT END MOVE 1 TO FILE-STATUS NOT AT END PERFORM 03-WRITE-TO-TABLE END-READ. 03-WRITE-TO-TABLE. ADD 1 TO LEN. UNSTRING INPUTRECORD INTO VAL(LEN). *> Wrong: "234" becomes 2340 instead of 0234 *> COMPUTE VAL(LEN) = INPUTRECORD. *> DISPLAY VAL(LEN) " " LEN. 04-LOOP. PERFORM VARYING I FROM 1 BY 1 UNTIL I > LEN ADD I 1 GIVING TMP PERFORM VARYING J FROM TMP BY 1 UNTIL J > LEN ADD J 1 GIVING TMP PERFORM VARYING K FROM TMP BY 1 UNTIL K > LEN ADD VAL(I) VAL(J) VAL(K) GIVING S *> DISPLAY I J K IF S = 2020 THEN MULTIPLY VAL(I) BY VAL(J) GIVING P MULTIPLY P BY VAL(K) GIVING P MOVE P TO FMT DISPLAY FMT EXIT PERFORM ELSE IF S > 2020 THEN EXIT PERFORM END-IF END-IF END-PERFORM END-PERFORM END-PERFORM. 05-BUBBLE. MOVE 1 TO K PERFORM UNTIL K = 0 MOVE 0 TO K PERFORM VARYING I FROM 1 BY 1 UNTIL I > LEN - 1 ADD 1 I GIVING J IF VAL(I) > VAL(J) MOVE VAL(I) TO TMP MOVE VAL(J) TO VAL(I) MOVE TMP TO VAL(J) MOVE 1 TO K END-IF END-PERFORM END-PERFORM. 06-PRINT. PERFORM VARYING I FROM 1 BY 1 UNTIL I > LEN DISPLAY VAL(I) END-PERFORM.