package Ġday 2 0 Ċ Ċ import Ġjava . io . File Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġdata Ġ= Ġparse (" src / main / kotlin / day 2 0 / Day 2 0 . txt ") ĊĊĠĠĠ Ġval Ġanswer 1 Ġ= Ġpart 1 ( data ) ĊĠĠĠ Ġval Ġanswer 2 Ġ= Ġpart 2 ( data ) ĊĊĠĠĠ Ġprintln (" ðŁ İ Ħ ĠDay Ġ 2 0 ĠðŁİ Ħ ") ĊĊĠĠĠ Ġprintln () ĊĊĠĠĠ Ġprintln ("[ Part Ġ 1 ]") ĊĠĠĠ Ġprintln (" Answer : Ġ$ answer 1 ") ĊĊĠĠĠ Ġprintln () ĊĊĠĠĠ Ġprintln ("[ Part Ġ 2 ]") ĊĠĠĠ Ġprintln (" Answer : Ġ$ answer 2 ") Ċ } Ċ Ċ private Ġfun Ġparse ( path : ĠString ): ĠEn hance Ġ{ ĊĠĠĠ Ġval Ġ( algorithm , Ġbits ) Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠ Ġ. read Text () ĊĠĠĠĠĠĠĠ Ġ. trim () ĊĠĠĠĠĠĠĠ Ġ. split (""" (\ n \ n )| (\ r \ n \ r \ n ) """. to Regex ()) ĊĊĠĠĠ Ġreturn ĠEn hance ( bits . to Image (), Ġalgorithm ) Ċ } Ċ Ċ private Ġfun ĠString . to Image (): ĠImage Ġ= ĊĠĠĠ Ġthis . lines () ĊĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġlines Ġ-> Ġlines . join ToString ( separator Ġ= Ġ"") Ġto Ġlines . size Ġ} ĊĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġ( bitmap , Ġsize ) Ġ-> ĠImage ( bitmap , Ġsize ) Ġ} Ċ Ċ private Ġdata Ġclass ĠEn hance ( ĊĠĠĠ Ġval Ġimage : ĠImage , ĊĠĠĠ Ġval Ġalgorithm : ĠString , Ċ ) Ċ Ċ private Ġdata Ġclass ĠImage ( ĊĠĠĠ Ġval Ġbitmap : ĠString , ĊĠĠĠ Ġval Ġsize : ĠInt , ĊĠĠĠ Ġval Ġfill : ĠChar Ġ= Ġ'.', Ċ ) Ċ Ċ private Ġfun Ġ< T > ĠIterable < T >. cross ( other : ĠIterable < T >): ĠList < Pair < T , ĠT >> Ġ= ĊĠĠĠ Ġthis . flatMap Ġ{ Ġa Ġ-> Ġother . map Ġ{ Ġb Ġ-> Ġa Ġto Ġb Ġ} Ġ} Ċ Ċ private Ġoperator Ġfun ĠImage . get ( x : ĠInt , Ġy : ĠInt ): ĠChar Ġ= ĊĠĠĠ Ġif Ġ( x Ġin Ġ 0 Ġuntil Ġsize Ġ&& Ġy Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbitmap [ y Ġ* Ġsize Ġ+ Ġx ] ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġfill ĊĠĠĠ Ġ} Ċ Ċ private Ġfun ĠImage . adjacent ( x : ĠInt , Ġy : ĠInt ): ĠList < Char > Ġ= ĊĠĠĠ Ġ(- 1 .. 1 ). cross (- 1 .. 1 ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( dy , Ġdx ) Ġ-> Ġthis [ x Ġ+ Ġdx , Ġy Ġ+ Ġdy ] Ġ} Ċ Ċ private Ġfun ĠImage . index At ( x : ĠInt , Ġy : ĠInt ): ĠInt Ġ= ĊĠĠĠ Ġthis . adjacent ( x , Ġy ) ĊĠĠĠĠĠĠĠ Ġ. fold ( 0 ) Ġ{ Ġacc , Ġc Ġ-> Ġacc Ġshl Ġ 1 Ġor Ġif Ġ( c Ġ== Ġ'# ') Ġ 1 Ġelse Ġ 0 Ġ} Ċ Ċ private Ġfun ĠEn hance . step (): ĠEn hance Ġ{ ĊĠĠĠ Ġ// ĠAfter Ġeach Ġiteration , Ġthe Ġimage Ġexp ands Ġone Ġunit Ġin Ġeach Ġdirection , ĊĠĠĠ Ġ// Ġincreasing Ġthe Ġlength Ġof Ġits Ġsides Ġby Ġ 2 Ġin Ġtotal . ĊĠĠĠ Ġval Ġsize Ġ= Ġimage . size Ġ+ Ġ 2 ĊĠĠĠ Ġval Ġside Ġ= Ġ- 1 Ġuntil Ġimage . size Ġ+ Ġ 1 ĊĠĠĠ Ġval Ġbitmap Ġ= Ġ( side ). cross ( side ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( y , Ġx ) Ġ-> Ġimage . index At ( x , Ġy ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġindex Ġ-> Ġalgorithm [ index ] Ġ} ĊĠĠĠĠĠĠĠ Ġ. join ToString ( separator Ġ= Ġ"") ĊĊĠĠĠ Ġval Ġfill Ġ= Ġif Ġ( image . fill Ġ== Ġ'.') Ġ{ ĊĠĠĠĠĠĠĠ Ġalgorithm . first () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġalgorithm . last () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġthis . copy ( image Ġ= ĠImage ( bitmap , Ġsize , Ġfill )) Ċ } Ċ Ċ private Ġfun ĠEn hance . perform ( iterations : ĠInt ): ĠImage Ġ= ĊĠĠĠ Ġgenerate Sequence ( this ) Ġ{ Ġp Ġ-> Ġp . step () Ġ} ĊĠĠĠĠĠĠĠ Ġ. elementAt ( iterations ). image Ċ Ċ private Ġfun ĠEn hance . count After ( iterations : ĠInt ): ĠInt Ġ= ĊĠĠĠ Ġperform ( iterations ) ĊĠĠĠĠĠĠĠ Ġ. bitmap . count Ġ{ Ġpixel Ġ-> Ġpixel Ġ== Ġ'#' Ġ} Ċ Ċ private Ġfun Ġpart 1 ( en hance : ĠEn hance ): ĠInt Ġ= ĊĠĠĠ Ġenhance . count After ( iterations Ġ= Ġ 2 ) Ċ Ċ private Ġfun Ġpart 2 ( en hance : ĠEn hance ): ĠInt Ġ= ĊĠĠĠ Ġenhance . count After ( iterations Ġ= Ġ 5 0 ) Ċ