My yearly advent-of-code solutions
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