My yearly advent-of-code solutions
at main 3.4 kB view raw
1 IDENTIFICATION DIVISION. 2 PROGRAM-ID. day_02_part2. 3 AUTHOR. Trey Bastian. 4 ENVIRONMENT DIVISION. 5 INPUT-OUTPUT SECTION. 6 FILE-CONTROL. 7 SELECT input-file ASSIGN TO "./input.txt" 8 ORGANIZATION IS LINE SEQUENTIAL. 9 DATA DIVISION. 10 FILE SECTION. 11 FD input-file. 12 01 input-line PIC X(4096). 13 WORKING-STORAGE SECTION. 14 01 ptr PIC 9(4) Value 1. 15 01 len PIC 9(4). 16 01 left-val PIC 9(32). 17 01 right-val PIC 9(32). 18 01 grouping PIC X(65). 19 20 01 val-string PIC Z(32). 21 01 val-string-len PIC 9(2). 22 01 val-string-start-idx PIC 9(2). 23 01 val-string-half PIC 9(2). 24 01 val-window PIC 9(2) VALUE 1. 25 01 c-idx PIC 9(2). 26 01 s-left PIC Z(16). 27 01 s-right PIC Z(16). 28 01 no-match PIC X VALUE "N". 29 01 result PIC 9(32) VALUE ZEROS. 30 31 01 eof PIC X. 32 88 eof-y VALUE "Y". 33 88 eof-n VALUE "N". 34 PROCEDURE DIVISION. 35 OPEN INPUT input-file. 36 SET eof-n to TRUE. 37 PERFORM UNTIL eof-y 38 READ input-file AT END 39 SET eof-y to TRUE 40 NOT AT END 41 INSPECT input-line TALLYING len FOR CHARACTERS BEFORE 42 SPACE 43 44 PERFORM UNTIL ptr > len 45 UNSTRING input-line DELIMITED BY "," INTO grouping WITH 46 POINTER ptr 47 END-UNSTRING 48 49 UNSTRING grouping DELIMITED BY "-" INTO left-val, 50 right-val 51 END-UNSTRING 52 53 PERFORM VARYING left-val FROM left-val BY 1 UNTIL 54 left-val > right-val 55 MOVE left-val TO val-string 56 57 COMPUTE val-string-len = FUNCTION LENGTH(FUNCTION 58 TRIM(val-string)) 59 60 COMPUTE val-string-start-idx = 61 (FUNCTION LENGTH(val-string) - val-string-len ) + 1 62 63 COMPUTE val-string-half = val-string-len / 2 64 65 PERFORM VARYING val-window FROM 1 BY 1 66 UNTIL val-window > val-string-half 67 COMPUTE c-idx = val-string-start-idx + val-window 68 MOVE "N" to no-match 69 PERFORM VARYING c-idx 70 FROM c-idx 71 BY val-window 72 UNTIL c-idx 73 > FUNCTION LENGTH(val-string) 74 75 MOVE val-string(val-string-start-idx:val-window) 76 TO s-left 77 78 IF (c-idx + val-window 79 > FUNCTION LENGTH(val-string)) 80 MOVE val-string(c-idx:) TO s-right 81 ELSE 82 MOVE val-string(c-idx:val-window) TO s-right 83 END-IF 84 85 IF NOT s-left = s-right 86 MOVE "Y" to no-match 87 EXIT PERFORM 88 END-IF 89 END-PERFORM 90 IF no-match = "N" 91 ADD left-val to result 92 EXIT PERFORM 93 END-IF 94 END-PERFORM 95 END-PERFORM 96 END-PERFORM 97 98 END-READ 99 END-PERFORM. 100 CLOSE input-file. 101 DISPLAY result. 102 STOP-RUN. 103