package Ġyear 2 0 2 1 . day 1 3 Ċ Ċ import Ġutil . read All Lines Ċ import Ġkotlin . math . max Ċ Ċ data Ġclass ĠDot ( val Ġx : ĠInt , Ġval Ġy : ĠInt ) Ċ data Ġclass ĠFold ( val Ġx : ĠInt , Ġval Ġy : ĠInt ) Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġdots Ġ= Ġmutable Set Of < Dot >() ĊĠĠĠ Ġval Ġfold s Ġ= Ġmutable ListOf < Fold >() ĊĊĠĠĠ Ġread All Lines (" input . txt "). forEach Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( line . startsWith (" fold ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . remove Prefix (" fold Ġalong Ġ"). split (" =" ). also Ġ{ Ġ( axis , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġvalue . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfold Ġ= Ġwhen Ġ( axis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" x " Ġ-> ĠFold ( v , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" y " Ġ-> ĠFold ( 0 , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Illegal Ġaxis Ġ$ axis ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfold s . add ( fold ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( line . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . split ("," ). let Ġ{ Ġ( x , Ġy ) Ġ-> Ġdots . add ( Dot ( x . toInt (), Ġy . toInt ())) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfold s . forEach Ġ{ Ġfold Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġremoved Ġ= Ġmutable Set Of < Dot >() ĊĠĠĠĠĠĠĠ Ġval Ġadded Ġ= Ġmutable Set Of < Dot >() ĊĠĠĠĠĠĠĠ Ġif Ġ( fold . x Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdots . filter Ġ{ Ġit . x Ġ> Ġfold . x Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremoved . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadded . add ( Dot ( fold . x Ġ+ Ġfold . x Ġ- Ġit . x , Ġit . y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( fold . y Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdots . filter Ġ{ Ġit . y Ġ> Ġfold . y Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremoved . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadded . add ( Dot ( it . x , Ġfold . y Ġ+ Ġfold . y Ġ- Ġit . y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdots . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove All ( removed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( added ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln ( dots . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġmax X Ġ= ĠInt . MIN _ VALUE ĊĠĠĠ Ġvar Ġmax Y Ġ= ĠInt . MIN _ VALUE ĊĠĠĠ Ġdots . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġmax X Ġ= Ġmax ( max X , Ġit . x ) ĊĠĠĠĠĠĠĠ Ġmax Y Ġ= Ġmax ( max Y , Ġit . y ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ( 0 .. max Y ). forEach Ġ{ Ġy Ġ-> ĊĠĠĠĠĠĠĠ Ġ( 0 .. max X ). forEach Ġ{ Ġx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint ( if ( dots . contains ( Dot ( x , Ġy ))) Ġ"#" Ġelse Ġ". ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln () ĊĠĠĠ Ġ} Ċ } Ċ