···
1
+
IDENTIFICATION DIVISION.
2
+
PROGRAM-ID. day_02_part2.
3
+
AUTHOR. Trey Bastian.
4
+
ENVIRONMENT DIVISION.
5
+
INPUT-OUTPUT SECTION.
7
+
SELECT input-file ASSIGN TO "./input.txt"
8
+
ORGANIZATION IS LINE SEQUENTIAL.
12
+
01 input-line PIC X(4096).
13
+
WORKING-STORAGE SECTION.
14
+
01 ptr PIC 9(4) Value 1.
16
+
01 left-val PIC 9(32).
17
+
01 right-val PIC 9(32).
18
+
01 grouping PIC X(65).
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.
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.
35
+
OPEN INPUT input-file.
38
+
READ input-file AT END
41
+
INSPECT input-line TALLYING len FOR CHARACTERS BEFORE
44
+
PERFORM UNTIL ptr > len
45
+
UNSTRING input-line DELIMITED BY "," INTO grouping WITH
49
+
UNSTRING grouping DELIMITED BY "-" INTO left-val,
53
+
PERFORM VARYING left-val FROM left-val BY 1 UNTIL
54
+
left-val > right-val
55
+
MOVE left-val TO val-string
57
+
COMPUTE val-string-len = FUNCTION LENGTH(FUNCTION
60
+
COMPUTE val-string-start-idx =
61
+
(FUNCTION LENGTH(val-string) - val-string-len ) + 1
63
+
COMPUTE val-string-half = val-string-len / 2
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
73
+
> FUNCTION LENGTH(val-string)
75
+
MOVE val-string(val-string-start-idx:val-window)
78
+
IF (c-idx + val-window
79
+
> FUNCTION LENGTH(val-string))
80
+
MOVE val-string(c-idx:) TO s-right
82
+
MOVE val-string(c-idx:val-window) TO s-right
85
+
IF NOT s-left = s-right
86
+
MOVE "Y" to no-match
91
+
ADD left-val to result