Files
advent-of-code/day01/ex2-pure-sort-cob.cob

97 lines
3.1 KiB
COBOL

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.