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