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.