package Ġnl . dr ic us . ad vent of code . year 2 0 2 0 Ċ Ċ import Ġnl . dr ic us . ad vent of code . util . Input Ċ import Ġnl . dr ic us . ad vent of code . util . P uzzle Ċ Ċ class ĠDay 2 4 ( input : ĠInput ) Ġ: ĠP uzzle () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġflip Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġinput . lines (). map Ġ{ Ġparse Route ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdirection Regex Ġ= Ġ"( e | se | sw | w | nw | ne ) ". to Regex () ĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġparse Route ( route : ĠString , Ġdirections : ĠList < String > Ġ= ĠlistOf ()): ĠList < String > Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( route Ġ== Ġ"") Ġdirections ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Ġ= Ġdirection Regex . find ( route ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse Route ( route . substring ( match . group Values [ 1 ]. length ), Ġdirections Ġ+ Ġmatch . group Values [ 1 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpart 1 () Ġ= Ġblack Tiles (). size ĊĊĠĠĠ Ġoverride Ġfun Ġpart 2 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinitial Black Tiles Ġ= Ġblack Tiles () ĊĠĠĠĠĠĠĠ Ġval Ġinitial Width Ġ= Ġinitial Black Tiles . max Of Ġ{ Ġit . first Ġ} Ġ- Ġinitial Black Tiles . min Of Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinitial Height Ġ= Ġinitial Black Tiles . max Of Ġ{ Ġit . second Ġ} Ġ- Ġinitial Black Tiles . min Of Ġ{ Ġit . second Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġturns Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġincrease Ġ= Ġturns Ġ* Ġ 2 Ġ+ Ġ 4 ĊĠĠĠĠĠĠĠ Ġval Ġorigin X Ġ= Ġ( initial Width Ġ+ Ġincrease ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġorigin Y Ġ= Ġ( initial Height Ġ+ Ġincrease ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġblack Tiles Ġ= Ġinitial Black Tiles . map Ġ{ Ġ( x , Ġy ) Ġ-> Ġorigin X Ġ+ Ġx Ġto Ġorigin Y Ġ+ Ġy Ġ}. to Mutable Set () ĊĠĠĠĠĠĠĠ Ġval Ġgrid Ġ= ĠArray ( initial Height Ġ+ Ġincrease ) Ġ{ Ġy Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBoolean Array ( initial Width Ġ+ Ġincrease ) Ġ{ Ġx Ġ-> Ġx Ġto Ġy Ġin Ġblack Tiles Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrepeat ( turn s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflip To Black Ġ= Ġblack Tiles . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġ( x , Ġy ) Ġ-> Ġadjacent Tiles ( x , Ġy ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ( x , Ġy ) Ġ-> Ġ! grid [ y ][ x ] Ġ&& Ġadjacent Black Tiles ( grid , Ġx , Ġy ) Ġ== Ġ 2 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflip To White Ġ= Ġblack Tiles . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ( x , Ġy ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadjacent Black Tile Count Ġ= Ġadjacent Black Tiles ( grid , Ġx , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjacent Black Tile Count Ġ== Ġ 0 Ġ|| Ġadjacent Black Tile Count Ġ> Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġblack Tiles . addAll ( flip To Black ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflip To Black . forEach Ġ{ Ġ( x , Ġy ) Ġ-> Ġgrid [ y ][ x ] Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblack Tiles . removeAll ( flip To White . toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflip To White . forEach Ġ{ Ġ( x , Ġy ) Ġ-> Ġgrid [ y ][ x ] Ġ= Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġgrid . sum Of Ġ{ Ġit . count Ġ{ Ġis Black Ġ-> Ġis Black Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjacent Black Tiles ( grid : ĠArray < Boolean Array >, Ġx : ĠInt , Ġy : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġadjacent Tiles ( x , Ġy ). count Ġ{ Ġ( tx , Ġty ) Ġ-> Ġgrid [ ty ][ tx ] Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjacent Tiles ( x : ĠInt , Ġy : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ ĠlistOf ( x Ġ- Ġ 1 Ġto Ġy Ġ+ Ġ 1 , Ġx Ġ+ Ġ 1 Ġto Ġy Ġ- Ġ 1 , Ġx Ġ- Ġ 1 Ġto Ġy , Ġx Ġ+ Ġ 1 Ġto Ġy , Ġx Ġto Ġy Ġ+ Ġ 1 , Ġx Ġto Ġy Ġ- Ġ 1 ) ĊĊĠĠĠ Ġprivate Ġfun Ġblack Tiles () Ġ= Ġflip . as Sequence () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġget Coordinate ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( coord , Ġoccurrences ) Ġ-> Ġcoord Ġto Ġoccurrences . size Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ(_, Ġcount ) Ġ-> Ġcount Ġ% Ġ 2 Ġ> Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( coord , Ġ_) Ġ-> Ġcoord Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġget Coordinate ( directions : ĠList < String >, Ġx : ĠInt Ġ= Ġ 0 , Ġy : ĠInt Ġ= Ġ 0 ): ĠPair < Int , ĠInt > Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( directions . isEmpty ()) Ġx Ġto Ġy ĊĠĠĠĠĠĠĠ Ġelse Ġwhen Ġ( directions [ 0 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" e " Ġ-> Ġget Coordinate ( directions . drop ( 1 ), Ġx Ġ+ Ġ 1 , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" se " Ġ-> Ġget Coordinate ( directions . drop ( 1 ), Ġx , Ġy Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" sw " Ġ-> Ġget Coordinate ( directions . drop ( 1 ), Ġx Ġ- Ġ 1 , Ġy Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" w " Ġ-> Ġget Coordinate ( directions . drop ( 1 ), Ġx Ġ- Ġ 1 , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" nw " Ġ-> Ġget Coordinate ( directions . drop ( 1 ), Ġx , Ġy Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ne " Ġ-> Ġget Coordinate ( directions . drop ( 1 ), Ġx Ġ+ Ġ 1 , Ġy Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠ Ġ} Ċ }