aboutsummaryrefslogtreecommitdiff
path: root/2025/day_02_part2.cbl
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.