package Ġpl . mr ug acz 9 5 . a oc . day 1 1 Ċ Ċ class ĠF erry ( private Ġvar Ġse ats : ĠList < String >, Ġprivate Ġval Ġtolerance : ĠInt , Ġclose Ne ighbour hood : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEMPTY Ġ= Ġ' L ' ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠO CC U PI ED Ġ= Ġ'#' ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġchecker Ġ= Ġwhen Ġ( close Ne ighbour hood ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue Ġ Ġ-> ĠClose Ne ighbour Checker () ĊĠĠĠĠĠĠĠ Ġfalse Ġ-> ĠFar Ne ighbour Checker () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Seat ( y : ĠInt , Ġx : ĠInt ): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġse ats [ y ][ x ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġinner Ġclass ĠNe ighbour Checker Ġ{ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġcheck ( y : ĠInt , Ġx : ĠInt , Ġdirection : ĠPair < Int , ĠInt >): ĠBoolean ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠClose Ne ighbour Checker Ġ: ĠNe ighbour Checker () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck ( y : ĠInt , Ġx : ĠInt , Ġdirection : ĠPair < Int , ĠInt >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġny Ġ= Ġy Ġ+ Ġdirection . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnx Ġ= Ġx Ġ+ Ġdirection . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġny Ġ>= Ġ 0 Ġ&& Ġny Ġ< Ġse ats . size Ġ&& Ġnx Ġ>= Ġ 0 Ġ&& Ġnx Ġ< Ġse ats [ 0 ]. length Ġ&& Ġget Seat ( ny , Ġnx ) Ġ== ĠO CC U PI ED ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠFar Ne ighbour Checker Ġ: ĠNe ighbour Checker () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck ( y : ĠInt , Ġx : ĠInt , Ġdirection : ĠPair < Int , ĠInt >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġny Ġ= Ġy Ġ+ Ġdirection . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnx Ġ= Ġx Ġ+ Ġdirection . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( ny Ġ>= Ġ 0 Ġ&& Ġny Ġ< Ġse ats . size Ġ&& Ġnx Ġ>= Ġ 0 Ġ&& Ġnx Ġ< Ġse ats [ 0 ]. length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( get Seat ( ny , Ġnx )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠO CC U PI ED Ġ-> Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEMPTY ĠĠĠ Ġ-> Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġny Ġ+= Ġdirection . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnx Ġ+= Ġdirection . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcount Ne ighbours ( y : ĠInt , Ġx : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdirections Ġ= Ġgenerate Directions () ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( dir Ġin Ġdirections ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( checker . check ( y , Ġx , Ġdir )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcount ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Directions (): ĠMutable List < Pair < Int , ĠInt >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdirections Ġ= Ġmutable ListOf < Pair < Int , ĠInt >>() ĊĠĠĠĠĠĠĠ Ġfor Ġ( dy Ġin Ġ- 1 .. 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( dx Ġin Ġ- 1 .. 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dy Ġ== Ġ 0 Ġ&& Ġdx Ġ== Ġ 0 ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirections . add ( Pair ( dy , Ġdx )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdirections ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstep (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Se ats Ġ= Ġse ats . map Indexed Ġ{ Ġrow Id , Ġrow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . map Indexed Ġ{ Ġcol Id , Ġseat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoccupied Ġ= Ġcount Ne ighbours ( row Id , Ġcol Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( seat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEMPTY ĠĠĠ Ġ-> Ġif Ġ( occup ied Ġ== Ġ 0 ) ĠO CC U PI ED Ġelse ĠEMPTY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠO CC U PI ED Ġ-> Ġif Ġ( occup ied Ġ>= Ġtolerance ) ĠEMPTY Ġelse ĠO CC U PI ED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠ Ġ-> Ġseat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. join ToString ("") ĊĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġval Ġchanged Ġ= Ġnew Se ats Ġ== Ġse ats ĊĠĠĠĠĠĠĠ Ġse ats Ġ= Ġnew Se ats ĊĠĠĠĠĠĠĠ Ġreturn Ġchanged ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcount Occup ied (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġse ats . map Ġ{ Ġit . filter Ġ{ Ġseat Ġ-> Ġseat Ġ== ĠO CC U PI ED Ġ}. count () Ġ}. sum () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" count Ġ: Ġ${ count Occup ied () }\ n ${ seats . join ToString ("\ n ") }\ n " ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġsolve ( f erry : ĠF erry ): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġafter Step Ġ= Ġf erry . count Occup ied () ĊĠĠĠ Ġvar Ġbefore Step : ĠInt ĊĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠ Ġbefore Step Ġ= Ġafter Step ĊĠĠĠĠĠĠĠ Ġf erry . step () ĊĠĠĠĠĠĠĠ Ġafter Step Ġ= Ġf erry . count Occup ied () ĊĠĠĠ Ġ} Ġwhile Ġ( before Step Ġ!= Ġafter Step ) ĊĠĠĠ Ġreturn Ġbefore Step Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġse ats Ġ= Ġ{} :: class . java . getResource ("/ day 1 1 . in ") ĊĠĠĠĠĠĠĠ Ġ. read Text () ĊĠĠĠĠĠĠĠ Ġ. split ("\ n ") ĊĠĠĠ Ġprintln (" Answer Ġpart Ġ 1 : Ġ${ solve ( F erry ( seats , Ġ 4 )) }") ĊĠĠĠ Ġprintln (" Answer Ġpart Ġ 2 : Ġ${ solve ( F erry ( seats , Ġ 5 , Ġfalse )) }") Ċ }