CLASS z_justacasual_advent_day9 DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    INTERFACES if_oo_adt_classrun.

  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS z_justacasual_advent_day9 IMPLEMENTATION.

  METHOD if_oo_adt_classrun~main.
    DATA: input                TYPE TABLE OF string,
          line_index           TYPE i,
          preceding_line_index TYPE i,
          following_line_index TYPE i,
          char_index           TYPE i,
          preceding_char_index TYPE i,
          following_char_index TYPE i,
          current_number       TYPE i,
          risk                 TYPE i,
          preceding_line       TYPE string,
          following_line       TYPE string.
    input = VALUE #( ( CONV #( '1349898912987656678912987899012998765456798765432345689876543234567998998956987545678999321239874568' ) )
  ( CONV #( '0998677893976544569329876498929899654345899879541236799997696447689897897645796434589998930347965679' ) )
  ( CONV #( '9865456789898633498999765357898798765456789998752345898989987557998756789534985327679987891956976789' ) )
  ( CONV #( '8764377456789212987987653232979659876567894329863456797679998699876545898929876434567896789899899895' ) )
  ( CONV #( '9843212345678901296897532101568939987878996909877567898567898789987676987910987569778945698789789934' ) )
  ( CONV #( '8943101234569992985698745323457898799989679899998679943456799899999787896891299878989234987694678925' ) )
  ( CONV #( '7654212356798989876789656434569989623494598789789789432347899998769898965692998999790149875423589434' ) )
  ( CONV #( '8765543878987678989898789556778976510123987679689897541456789987756989896789867897653298765212389549' ) )
  ( CONV #( '9878654989898567894939898767989965432234598789579976532369899876545679797898756789964987654323678998' ) )
  ( CONV #( '5989785898765468943129989998999878543456679895489987953678998765434997679993234895895799876754567897' ) )
  ( CONV #( '4699876789894347894698778999899998676599989994356798974569999974329876557879101234789898987766678965' ) )
  ( CONV #( '3457997899985456789987667898789329898678996989467989985689899865698965446358992345678957599877789654' ) )
  ( CONV #( '2345798999876569899996546987578935999789345978979878997789789976987654321237989467989432498998896543' ) )
  ( CONV #( '6566789989987678998989435965469899899891239867898767898894598997898985435445678979994321987689995432' ) )
  ( CONV #( '7678999978998789867679319854376789789990197756997656789913496789929876545656789989875439765476789521' ) )
  ( CONV #( '8989998767859896753489598743215345699989976546789545878901989999439987656788994597976799854345789432' ) )
  ( CONV #( '9693987654345965642567999653101234789879897437894234567899878898998798767899012345998987654234679943' ) )
  ( CONV #( '7542397543239874321298998774654346899965689546789123598898767797897659878932123459869498762123567894' ) )
  ( CONV #( '9954598654129765439989439898776457899854578956991012345789754556898767999549234698754359973234589975' ) )
  ( CONV #( '8895976543239876798978921939987569998765699877892323456896543345789998998698959799873249899845678986' ) )
  ( CONV #( '6789898764345989986769890124998678999898789998943565897987621237899989329987998989954198789756789997' ) )
  ( CONV #( '5679789975456798765456789239899789678929891299874876789398740123789878909876897677895987678967899998' ) )
  ( CONV #( '4565679986587989654356994398769894569212990988965987891298761834678967998765623556999993457898998869' ) )
  ( CONV #( '3234589998999876543267895987656923578901989877897999990199898757989456986653512349878986567929987656' ) )
  ( CONV #( '2124679999102989875356987896543212349212979766798998789986969867892359875432103498769987699219876545' ) )
  ( CONV #( '3014587893233499876787898998732103494399867645699987698765456978901345989843213569657899789998764334' ) )
  ( CONV #( '2123456895349568989998999987643212989987656535789999539876323989323456798764345698747999899899854210' ) )
  ( CONV #( '3496567897598978996979999998876429978996543423678998425973212499934567899876456789656897998798765421' ) )
  ( CONV #( '4789878949987989245964978929987598656987632014569987534965976567896899999987567899867896987659876534' ) )
  ( CONV #( '5678989959876890139843769934598986543496544123678996549876797678987896789998679949878995498969997646' ) )
  ( CONV #( '9899396898765679349752357895699878432398763239789987678987898789699955678969889321989789329998798768' ) )
  ( CONV #( '9954235698754598998541235989987656501239854349892198789198979896546544569656999932997678912987659879' ) )
  ( CONV #( '9653124599743987897630145679876543213459767457893999891099767979932123459545989899876567899876543989' ) )
  ( CONV #( '8543234987652326897521239789987854323456977667989889932988656567892034578939879789985467891985432396' ) )
  ( CONV #( '7654545987641015689435468893298985434569988998978778999877543456789145689749865698964346790296521234' ) )
  ( CONV #( '9765659876432124597545679992109876565678999999867667789765432569993276789659954567893234891987639347' ) )
  ( CONV #( '9876768987653235789658799989212987678789323987656545678977621998789989898798893458965345692998798956' ) )
  ( CONV #( '3987899998764346789799989678929898789899019876543236799998549878656798999987632357896459989899987897' ) )
  ( CONV #( '2399999979898757899998965567899759899988923999432145678997698765434987898798421234987598775789876789' ) )
  ( CONV #( '1234598765998768999887543456789432959876895988321017989798789877329986799543210123597697654599765679' ) )
  ( CONV #( '0399999854329879898765432345678921249765689876532328999679897998998865689754321234689898767989864568' ) )
  ( CONV #( '1987898985435989789987543456789532999974678998643467898789976789896464569895456545699959979876543666' ) )
  ( CONV #( '9896587976856797654298654587897699889893459997655578929898765798764353479987677656789544398765432345' ) )
  ( CONV #( '9765456798767988432129765678998987676799567989767699012997654329965212989998788798997932109854321234' ) )
  ( CONV #( '1964367999879876549039878789999876545678979878978789229898765439897339898959899899456893212965642445' ) )
  ( CONV #( '2973256789989989998956989897898765434569898767899899998789876598789599767945999999567894323988763766' ) )
  ( CONV #( '4983145678992399897897895976999976523459767654678999899679987987678989657896989897998976594599884878' ) )
  ( CONV #( '5693237889921998786789944235699897634698654323567898777567899876569876546789978766789987989699876789' ) )
  ( CONV #( '6954358999899887545679432134986779786899965434698987663459998995498765437998766545679999878989989891' ) )
  ( CONV #( '9876769658798765434678943449875667997999877546789196542369987654329854315697653234567898765679393992' ) )
  ( CONV #( '3987878947679987323567894556984356789999989987891097863498998765446995534987654365678987654569212989' ) )
  ( CONV #( '2498989134567895435678989678993247999987695598989998764987889987569876665898765476799999543578907678' ) )
  ( CONV #( '1239896545678987656999879989832156999876554439677899999876778998878998976789978987897985432389913589' ) )
  ( CONV #( '0234797666789998799788768998791027899985433123456789988954467789989329987897899998946976321567894690' ) )
  ( CONV #( '1245698977899989987674346899652345678996521014589894976543235678993213398986789989323965432469999891' ) )
  ( CONV #( '4376999989999879876554234578943456789998733125678953987656356789754901239875678965219876543479999989' ) )
  ( CONV #( '5487899990498765995432145679655568992987654247789432198998456789869892397654567894323987755678989975' ) )
  ( CONV #( '6789978991399854986543476789879989621098875759896543999876569899997689986543456965499899876789878994' ) )
  ( CONV #( '7998769789986543497754567899997899542149876967999959899997978999877567899679767896987764987896567893' ) )
  ( CONV #( '8989946679097655698965678939876798967234987889998898789998989678965458998789878979876543298989489932' ) )
  ( CONV #( '9875734589298766789798799329765657995457898995987675678939996589876579529892989765997754359878996310' ) )
  ( CONV #( '8654623499999879897659978998654546789567899434976544579910965323997689434993999854569875598767975492' ) )
  ( CONV #( '8743414487891989998542356999763234568978999949865323467899876212598997599789888743457986987656899989' ) )
  ( CONV #( '9852101276890196899621239899874345679989987897653212356999954323459998988698765632378898998545998978' ) )
  ( CONV #( '9764256345991965698780398789975656789899876789766623567898765434567899875498654321237789987659896567' ) )
  ( CONV #( '8994346656789894999821987678988777898789985899895434678979876555678968994398776410145691298998765438' ) )
  ( CONV #( '7889468977898789899943996567999888999659876789986567789865987966989357989239864323234889979799889324' ) )
  ( CONV #( '6578999988987656789899865459864999898743987896797878999984798999893239878945987434545678964689998434' ) )
  ( CONV #( '3489989999498943456789654398753236789432398934598999789995679989789198969699876545656789653456986556' ) )
  ( CONV #( '2359878995349832377998743299654125896549459323459767689876899877698997654589988676897899732569897677' ) )
  ( CONV #( '1298759989239765478999854988643034789798969212345954569987998766467898543478999898998998993498798798' ) )
  ( CONV #( '2976543478959876567898769876532125678987898901567893498998999854345999532357893999899456789987659899' ) )
  ( CONV #( '3498752367967987778999878987646235789896567892478902987899998743257894321558954989672345678975445959' ) )
  ( CONV #( '4689871256899999899998989598655446796785456943599319876799899654356789432349769876531234569765332348' ) )
  ( CONV #( '5799954345678998967987695429776579895432349657679599985476789765567896543598998786420129878986201257' ) )
  ( CONV #( '6798766456799897659876543219887699977321458967789989876365679896678987654987897654321298999098212345' ) )
  ( CONV #( '7959987868989789543998994109999789765430567899899876943214568987889499769876798965442397689129323456' ) )
  ( CONV #( '9543298979878699912349889298798994975421678989998985432102679399994349898765679876743498568995434767' ) )
  ( CONV #( '8932109998767567899497678999687893986543989779897896554999789234943235987654399998654579679987545878' ) )
  ( CONV #( '7893219879654479998989569986566789997654597567776989769878993139832129898765489239865689989898676789' ) )
  ( CONV #( '6794929865432348897677498765404678998765696432645778997659891098763239779877678999878794598769989891' ) )
  ( CONV #( '5989899996543456789535349897323458999886789521034569876545789987654398656999999989999892987654597993' ) )
  ( CONV #( '4876789987655587898621299875434567898999898742125678988656999998765997545679878979999969996543456789' ) )
  ( CONV #( '3265678998766798987210989999595788987899969883236989399767898999879876434798768968987857987654569894' ) )
  ( CONV #( '2134567899877899896329878998989899876989659864346793212989997894989988523899757857895445698765678933' ) )
  ( CONV #( '3245698988989998765459967867678986985878934965457899323498986795698764312498645346989234569987789321' ) )
  ( CONV #( '4356789877595679876598756654567965434569215989568948996567895689987654209569432234678945978998894310' ) )
  ( CONV #( '9867899965434999999699843423459897123489326897679336789678954599899754398997640123598999899439995992' ) )
  ( CONV #( '1978999896549878988987932012346796545699987898989124778989543498767975987789431334567989794323989889' ) )
  ( CONV #( '0989998789699868977696542145459897656789999989691014569899632597658989876598955456678978689212978768' ) )
  ( CONV #( '1399987678987659764569643236767998767997899876542123698788949986545698965476996767889567568909867657' ) )
  ( CONV #( '2999876569434348973198754745678989978976998987665435989667898975434987656345889898994423457899754345' ) )
  ( CONV #( '9878987498921237891098765656789876599345896598797649878556697954321096643245678959893212668998643234' ) )
  ( CONV #( '9768998987890145692129889797899987432234789349899799865434546895432985432123499546789424578997432123' ) )
  ( CONV #( '6657899976989234589236999898989296590195689234999987654321234789549876543247895434596534569876573244' ) )
  ( CONV #( '5346798765678945678945678999679199989989890123789998764310345699656987764656789323789545678998764356' ) )
  ( CONV #( '4212987654569956789876789986568988979878921234599989876421256798967898975879897535698656799789875467' ) )
  ( CONV #( '5101976563457899896987999965459876565767892345678967989532347897898999876793976546789969895678976567' ) )
  ( CONV #( '6249875432345698945698929874345965434658789656789345698745459956789899989892987687899878934589987679' ) )
  ( CONV #( '7857987631234567934569219865466976521345678967891236987656567943456789999901298798920989323678998989' ) ) ) .
    TRY.
        LOOP AT input ASSIGNING FIELD-SYMBOL(<line>).
*BREAK-POINT.
          line_index = sy-tabix.
          out->write( |line_index: { line_index } | ).
          out->write( <line> ).
          TRY.
              preceding_line_index = line_index - 1.
              preceding_line = input[ preceding_line_index ].
            CATCH cx_sy_itab_line_not_found.
          ENDTRY.
          TRY.
              following_line_index = line_index + 1.
              following_line = input[ following_line_index ].
            CATCH cx_sy_itab_line_not_found.
          ENDTRY.
          DO strlen( <line> ) TIMES.
            char_index = sy-index - 1.
            out->write( |char_index: { char_index } | ).

            preceding_char_index = char_index - 1.
            following_char_index = char_index + 1.
            current_number = <line>+char_index(1).
            IF preceding_char_index >= 0.
              IF current_number >= <line>+preceding_char_index(1).
                CONTINUE.
              ENDIF.
            ENDIF.
            IF following_char_index < strlen( <line> ) .
              IF current_number >= <line>+following_char_index(1).
                CONTINUE.
              ENDIF.
            ENDIF.
            IF preceding_line_index >= 1.
              IF current_number >= preceding_line+char_index(1).
                CONTINUE.
              ENDIF.
            ENDIF.
            IF following_line_index <= lines( input ).
              IF current_number >= following_line+char_index(1).
                CONTINUE.
              ENDIF.
            ENDIF.
            risk = risk + 1 + current_number.
          ENDDO.
        ENDLOOP.
      CATCH cx_root.
        out->write( 'Fucked' ).

    ENDTRY.
    out->write( risk ).
  ENDMETHOD.

ENDCLASS.
