package Ġeu . jan v db . a oc 2 0 2 1 . day 2 0 Ċ Ċ import Ġeu . jan v db . a oc util . kotlin . read Group ed Lines Ċ import Ġeu . jan v db . a oc util . kotlin . run With Timer Ċ import Ġjava . util .* Ċ Ċ const Ġval ĠFIL ENAME Ġ= Ġ" input 2 0 . txt " Ċ Ċ fun Ġmain () Ġ{ Ċ ĉ val Ġgroups Ġ= Ġread Group ed Lines ( 2 0 2 1 , ĠFIL ENAME ) Ċ ĉ val Ġpattern Ġ= ĠPattern . parse ( groups [ 0 ]) Ċ ĉ val Ġimage Ġ= ĠImage . parse ( groups [ 1 ]) ĊĊ ĉ run With Timer (" Part Ġ 1 ") Ġ{ Ċĉ ĉ val Ġresult 1 Ġ= Ġimage . apply Pattern ( pattern ). apply Pattern ( pattern ) Ċĉ ĉ result 1 . print () Ċ ĉ } ĊĊ ĉ run With Timer (" Part Ġ 2 ") Ġ{ Ċĉ ĉ var Ġresult 2 Ġ= Ġimage Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġ 5 0 ) Ġ{ Ċĉĉ ĉ result 2 Ġ= Ġresult 2 . apply Pattern ( pattern ) Ċĉ ĉ } Ċĉ ĉ result 2 . print () Ċ ĉ } Ċ } Ċ Ċ class ĠPattern ( val Ġvalues : ĠBit Set ) Ġ{ Ċ ĉ val Ġsize Ġ= Ġvalues . size () ĊĊ ĉ fun Ġprint () Ġ{ Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġvalues . size ()) Ġ{ Ċĉĉ ĉ val Ġch Ġ= Ġif Ġ( values [ i ]) Ġ'#' Ġelse Ġ'.' Ċĉĉ ĉ print ( ch ) Ċĉ ĉ } Ċĉ ĉ println () Ċ ĉ } ĊĊ ĉ operator Ġfun Ġget ( pattern Index : ĠInt ) Ġ= Ġvalues [ pattern Index ] ĊĊ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ fun Ġparse ( lines : ĠList < String >): ĠPattern Ġ{ Ċĉĉ ĉ val Ġall Data Ġ= Ġlines . fold ( StringBuilder ()) Ġ{ Ġacc , Ġit Ġ-> Ġacc . append ( it ) Ġ}. toString () Ċĉĉ ĉ val Ġbits Ġ= ĠBit Set ( all Data . length ) Ċĉĉ ĉ for Ġ( i Ġin Ġall Data . indices ) Ġ{ Ċĉĉĉ ĉ bits [ i ] Ġ= Ġall Data [ i ] Ġ== Ġ'#' Ċĉĉ ĉ } Ċĉĉ ĉ return ĠPattern ( bits ) Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ class ĠImage ( val Ġwidth : ĠInt , Ġval Ġheight : ĠInt , Ġval Ġpixels : ĠBit Set , Ġval ĠdefaultValue : ĠBoolean ) Ġ{ Ċ ĉ fun Ġapply Pattern ( pattern : ĠPattern ): ĠImage Ġ{ Ċĉ ĉ val Ġnew Width Ġ= Ġwidth Ġ+ Ġ 2 Ċĉ ĉ val Ġnew Height Ġ= Ġheight Ġ+ Ġ 2 Ċĉ ĉ val Ġnew Pixels Ġ= ĠBit Set ( new Height Ġ* Ġnew Width ) ĊĊĉ ĉ fun Ġnew Index ( x : ĠInt , Ġy : ĠInt ): ĠInt Ġ{ Ċĉĉ ĉ return Ġx Ġ+ Ġ 1 Ġ+ Ġnew Width Ġ* Ġ( y Ġ+ Ġ 1 ) Ġ// ĠInd ices Ġgo Ġfrom Ġ- 1 Ġ.. Ġn Ċĉ ĉ } ĊĊĉ ĉ for Ġ( y Ġin Ġ- 1 Ġuntil Ġheight Ġ+ Ġ 1 ) Ġ{ Ċĉĉ ĉ for Ġ( x Ġin Ġ- 1 Ġuntil Ġwidth Ġ+ Ġ 1 ) Ġ{ Ċĉĉĉ ĉ val Ġpattern Index Ġ= Ġget Pattern Index ( x , Ġy ) Ċĉĉĉ ĉ new Pixels [ new Index ( x , Ġy )] Ġ= Ġpattern [ pattern Index ] Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ val Ġnext DefaultValue Ġ= Ġif Ġ( defaultValue ) Ġpattern [ pattern . size Ġ- 1 ] Ġelse Ġpattern [ 0 ] Ċĉ ĉ return ĠImage ( new Width , Ġnew Height , Ġnew Pixels , Ġnext DefaultValue ) Ċ ĉ } ĊĊ ĉ fun Ġprint () Ġ{ Ċĉ ĉ for Ġ( y Ġin Ġ 0 Ġuntil Ġheight ) Ġ{ Ċĉĉ ĉ for Ġ( x Ġin Ġ 0 Ġuntil Ġwidth ) Ġ{ Ċĉĉĉ ĉ val Ġch Ġ= Ġif Ġ( get Pixel ( x , Ġy )) Ġ'#' Ġelse Ġ'.' Ċĉĉĉ ĉ print ( ch ) Ċĉĉ ĉ } Ċĉĉ ĉ println () Ċĉ ĉ } Ċĉ ĉ println (" Pixels Ġset : Ġ" Ġ+ Ġpixels . cardinality ()) Ċ ĉ } ĊĊ ĉ private Ġfun Ġget Pattern Index ( x : ĠInt , Ġy : ĠInt ): ĠInt Ġ{ Ċĉ ĉ var Ġresult Ġ= Ġ 0 Ċĉ ĉ for Ġ( y 1 Ġin Ġy Ġ- Ġ 1 .. y Ġ+ Ġ 1 ) Ġ{ Ċĉĉ ĉ for Ġ( x 1 Ġin Ġx Ġ- Ġ 1 .. x Ġ+ Ġ 1 ) Ġ{ Ċĉĉĉ ĉ result Ġ= Ġ 2 Ġ* Ġresult Ġ+ Ġif Ġ( get Pixel ( x 1 , Ġy 1 )) Ġ 1 Ġelse Ġ 0 Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġresult Ċ ĉ } ĊĊ ĉ private Ġfun Ġget Pixel ( x : ĠInt , Ġy : ĠInt ): ĠBoolean Ġ{ Ċĉ ĉ if Ġ( x Ġ< Ġ 0 Ġ|| Ġy Ġ< Ġ 0 Ġ|| Ġx Ġ>= Ġwidth Ġ|| Ġy Ġ>= Ġheight ) Ġreturn ĠdefaultValue Ċĉ ĉ return Ġpixels [ x Ġ+ Ġy Ġ* Ġwidth ] Ċ ĉ } ĊĊ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ fun Ġparse ( lines : ĠList < String >): ĠImage Ġ{ Ċĉĉ ĉ val Ġheight Ġ= Ġlines . size Ċĉĉ ĉ val Ġwidth Ġ= Ġlines [ 0 ]. length Ċĉĉ ĉ val Ġpixels Ġ= ĠBit Set ( width Ġ* Ġheight ) Ċĉĉ ĉ for Ġ( y Ġin Ġ 0 Ġuntil Ġheight ) Ġ{ Ċĉĉĉ ĉ for Ġ( x Ġin Ġ 0 Ġuntil Ġwidth ) Ġ{ Ċĉĉĉĉ ĉ pixels [ y Ġ* Ġwidth Ġ+ Ġx ] Ġ= Ġlines [ y ][ x ] Ġ== Ġ'#' Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ return ĠImage ( width , Ġheight , Ġpixels , Ġfalse ) Ċĉ ĉ } Ċ ĉ } Ċ }