package Ġdays Ċ Ċ import Ġprint Map Ċ import Ġutil . Co or Ċ Ċ class ĠDay 2 0 Ġ: ĠDay ( 2 0 ) Ġ{ ĊĊĠĠĠ Ġval Ġalgorithm : ĠString Ġ= Ġinput List [ 0 ] ĊĠĠĠ Ġval Ġinput Ġ= Ġmutable Map Of < Co or , ĠInt >() ĊĠĠĠ Ġval ĠC Ġ= ĠlistOf (".", Ġ"# ") ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġheight Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġwidth Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġinput List . forEach Indexed () Ġ{ Ġi , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// input [ Co or (- 1 , i )] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// input [ Co or (- 2 , i )] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . forEach Indexed Ġ{ Ġx , Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput [ Co or ( x , Ġi )] Ġ= Ġif Ġ( c Ġ== Ġ'# ') Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . length Ġ> Ġwidth ) Ġwidth Ġ= Ġit . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// input [ Co or ( width , i )] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// input [ Co or ( width + 1 , i )] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġi ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// print Map ( input . map Values Ġ{ ĠC [ it . value ] Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpart One (): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġapply Algorithm ( input , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġoutput 1 Ġ= Ġapply Algorithm ( output , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput 1 . values . count Ġ{ Ġit Ġ== Ġ 1 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġapply Algorithm ( input : ĠMutable Map < Co or , ĠInt >, Ġstep : ĠInt ): ĠMutable Map < Co or , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġmutable Map Of < Co or , ĠInt >() ĊĠĠĠĠĠĠĠ Ġval Ġmin X Ġ= Ġinput . keys . min Of Ġ{ Ġit . x Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmin Y Ġ= Ġinput . keys . min Of Ġ{ Ġit . y Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmax X Ġ= Ġinput . keys . max Of Ġ{ Ġit . x Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmax Y Ġ= Ġinput . keys . max Of Ġ{ Ġit . y Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdv Ġ= Ġif Ġ( step Ġ% Ġ 2 Ġ== Ġ 0 Ġ&& Ġalgorithm [ 0 ] Ġ== Ġ'# ') Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġmin X Ġ- Ġ 1 .. max X Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġmin Y Ġ- Ġ 1 .. max Y Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbin Data Ġ= Ġ( input [ Co or ( x Ġ- Ġ 1 , Ġy Ġ- Ġ 1 )] Ġ?: Ġdv ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbin Data Ġ+= Ġ( input [ Co or ( x , Ġy Ġ- Ġ 1 )] Ġ?: Ġdv ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbin Data Ġ+= Ġ( input [ Co or ( x Ġ+ Ġ 1 , Ġy Ġ- Ġ 1 )] Ġ?: Ġdv ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbin Data Ġ+= Ġ( input [ Co or ( x Ġ- Ġ 1 , Ġy )] Ġ?: Ġdv ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbin Data Ġ+= Ġ( input [ Co or ( x , Ġy )] Ġ?: Ġdv ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbin Data Ġ+= Ġ( input [ Co or ( x Ġ+ Ġ 1 , Ġy )] Ġ?: Ġdv ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbin Data Ġ+= Ġ( input [ Co or ( x Ġ- Ġ 1 , Ġy Ġ+ Ġ 1 )] Ġ?: Ġdv ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbin Data Ġ+= Ġ( input [ Co or ( x , Ġy Ġ+ Ġ 1 )] Ġ?: Ġdv ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbin Data Ġ+= Ġ( input [ Co or ( x Ġ+ Ġ 1 , Ġy Ġ+ Ġ 1 )] Ġ?: Ġdv ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Ġ= Ġbin Data . toInt ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ Co or ( x , Ġy )] Ġ= Ġif Ġ( algorithm [ num ] Ġ== Ġ'# ') Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// print Map ( output . map Values Ġ{ Ġit Ġ-> ĠC [ it . value ] Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpart Two (): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġoutput Ġ= Ġinput ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 1 .. 5 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Ġ= Ġapply Algorithm ( output , Ġi ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput . values . count Ġ{ Ġit Ġ== Ġ 1 Ġ} ĊĠĠĠ Ġ} Ċ } Ċ