/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠAndrew ĠK re pp s Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . ask re pp s . ad vent 2 0 2 1 . day 2 0 Ċ Ċ import Ġcom . ask re pp s . ad vent 2 0 2 1 . util . getInput Lines Ċ import Ġjava . io . File Ċ Ċ private Ġval ĠK ERNEL _ DIRECTION S Ġ= ĠlistOf ( ĊĠĠĠ ĠPair (- 1 , Ġ- 1 ), ĠPair (- 1 , Ġ 0 ), ĠPair (- 1 , Ġ 1 ), ĊĠĠĠ ĠPair ( 0 , Ġ- 1 ), Ġ ĠPair ( 0 , Ġ 0 ), Ġ ĠPair ( 0 , Ġ 1 ), ĊĠĠĠ ĠPair ( 1 , Ġ- 1 ), Ġ ĠPair ( 1 , Ġ 0 ), Ġ ĠPair ( 1 , Ġ 1 ) Ċ ) Ċ Ċ data Ġclass ĠGrid Coordinates ( val Ġrow : ĠInt , Ġval Ġcol : ĠInt ) Ċ Ċ fun ĠList < String >. to ImageData (): ĠPair < List < Char >, ĠSet < Grid Coordinates >> Ġ{ ĊĠĠĠ Ġval Ġenhancement Data Ġ= Ġget ( 0 ). toList () ĊĠĠĠ Ġcheck ( en hancement Data . first () Ġ== Ġ'.' Ġ|| Ġenhancement Data . last () Ġ== Ġ'.') Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Enhanced Ġimage Ġwill Ġhave Ġinfinite Ġlit Ġpixels " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġimage Ġ= Ġ( 1 Ġuntil Ġsize ). flatMap Ġ{ Ġline Index Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġrow Ġ= Ġline Index Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġget ( line Index ). map Indexed NotNull Ġ{ Ġcol , Ġpixel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pixel Ġ== Ġ'# ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGrid Coordinates ( row , Ġcol ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. toSet () ĊĊĠĠĠ Ġreturn ĠPair ( en hancement Data , Ġimage ) Ċ } Ċ Ċ fun ĠGrid Coordinates . get Kernel Pixels () Ġ= ĊĠĠĠ ĠK ERNEL _ DIRECTION S . map Ġ{ Ġ( delta Row , Ġdelta Col ) Ġ-> ĊĠĠĠĠĠĠĠ ĠGrid Coordinates ( row Ġ+ Ġdelta Row , Ġcol Ġ+ Ġdelta Col ) ĊĠĠĠ Ġ} Ċ Ċ fun ĠSet < Grid Coordinates >. getOutput Pixels () Ġ= ĊĠĠĠ Ġflat Map Ġ{ Ġit . get Kernel Pixels () Ġ}. toSet () Ċ Ċ fun ĠGrid Coordinates . check Output Pixel ( ĊĠĠĠ Ġenhancement Data : ĠList < Char >, ĊĠĠĠ Ġinput Pixels : ĠSet < Grid Coordinates >, ĊĠĠĠ Ġinput F lipped : ĠBoolean , ĊĠĠĠ Ġflip Output : ĠBoolean Ċ ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġenhancement Index Ġ= Ġget Kernel Pixels (). fold ( 0 ) Ġ{ Ġresult , Ġpixel Ġ-> ĊĠĠĠĠĠĠĠ Ġresult . sh l ( 1 ) Ġ+ Ġif Ġ( input F lipped . xor ( pixel Ġin Ġinput Pixels )) Ġ 1 Ġelse Ġ 0 ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġflip Output . xor ( en hancement Data [ en hancement Index ] Ġ== Ġ'# ') Ċ } Ċ Ċ fun ĠSet < Grid Coordinates >. en hance Once ( en hancement Data : ĠList < Char >, Ġinput F lipped : ĠBoolean , Ġflip Output : ĠBoolean ) Ġ= ĊĠĠĠ Ġget Output Pixels (). filter Ġ{ ĊĠĠĠĠĠĠĠ Ġit . check Output Pixel ( en hancement Data , Ġthis , Ġinput F lipped , Ġflip Output ) ĊĠĠĠ Ġ}. toSet () Ċ Ċ fun ĠSet < Grid Coordinates >. en hance ( en hancement Data : ĠList < Char >, Ġiterations : ĠInt ): ĠSet < Grid Coordinates > Ġ{ ĊĠĠĠ Ġval Ġf li pping Required Ġ= Ġenhancement Data . first () Ġ== Ġ'#' ĊĠĠĠ Ġcheck Ġ(! f li pping Required Ġ|| Ġiterations Ġ% Ġ 2 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" En hancement Ġdata Ġthat Ġrequires Ġf li pping Ġneeds Ġa Ġeven Ġnumber Ġof Ġiterations " ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġ( 0 Ġuntil Ġiterations ). fold ( this ) Ġ{ Ġimage , Ġstep Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġinput F lipped Ġ= Ġf li pping Required Ġ&& Ġstep Ġ% Ġ 2 Ġ== Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġflip Output Ġ= Ġf li pping Required Ġ&& Ġ! input F lipped ĊĠĠĠĠĠĠĠ Ġimage . en hance Once ( en hancement Data , Ġinput F lipped , Ġflip Output ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġget Part 1 Answer ( en hancement Data : ĠList < Char >, Ġimage : ĠSet < Grid Coordinates >) Ġ= ĊĠĠĠ Ġimage . en hance ( en hancement Data , Ġiterations Ġ= Ġ 2 ). size Ċ Ċ fun Ġget Part 2 Answer ( en hancement Data : ĠList < Char >, Ġimage : ĠSet < Grid Coordinates >) Ġ= ĊĠĠĠ Ġimage . en hance ( en hancement Data , Ġiterations Ġ= Ġ 5 0 ). size Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġ( en hancement Data , Ġimage ) Ġ= ĠFile (" src / main / resources / day 2 0 . txt ") ĊĠĠĠĠĠĠĠ Ġ. getInput Lines (). to ImageData () ĊĊĠĠĠ Ġprintln (" The Ġanswer Ġto Ġpart Ġ 1 Ġis Ġ${ get Part 1 Answer ( en hancement Data , Ġimage )} ") ĊĠĠĠ Ġprintln (" The Ġanswer Ġto Ġpart Ġ 2 Ġis Ġ${ get Part 2 Answer ( en hancement Data , Ġimage )} ") Ċ } Ċ