package Ġio . github . z eb alu . ad vent 2 0 2 0 Ċ Ċ data Ġclass ĠCoord ( val Ġcoords : ĠInt Array ) Ġ{ ĊĊ ĉ fun Ġne ighbours () Ġ= Ġcluster ( 1 ). drop ( 1 ) ĊĊ ĉ // Ġoriginal Ġidea : Ġhttps :// github . com / p - kov acs / a oc 2 0 2 0 / blob / master / src / main / java / pk ov acs / a oc / util / Point . java Ċ ĉ fun Ġcluster ( size : ĠInt ): ĠList < Coord > Ġ{ Ċĉ ĉ if Ġ( size Ġ< Ġ 0 ) Ġ{ Ċĉĉ ĉ throw ĠIllegalArgumentException (" cluster Ġsize Ġcan Ġnot Ġbe Ġnegative ") Ċĉ ĉ } Ċĉ ĉ val Ġlist Ġ= Ġmutable ListOf ( this ) Ċĉ ĉ if Ġ( size Ġ== Ġ 0 ) Ġ{ Ċĉĉ ĉ return Ġlist Ċĉ ĉ } Ċĉ ĉ for Ġ( coord Id Ġin Ġcoords . indices ) Ġ{ Ċĉĉ ĉ val Ġrange Ġ= Ġ 0 .. list . size Ġ- Ġ 1 Ċĉĉ ĉ for Ġ( change Idx Ġin Ġrange ) Ġ{ Ċĉĉĉ ĉ for Ġ( diff Ġin Ġ 1 .. size ) Ġ{ Ċĉĉĉĉ ĉ val Ġpositive Ġ= Ġlist [ change Idx ]. coords . copyOf () Ċĉĉĉĉ ĉ val Ġnegative Ġ= Ġlist [ change Idx ]. coords . copyOf () Ċĉĉĉĉ ĉ positive [ coord Id ] Ġ+= Ġdiff Ċĉĉĉĉ ĉ negative [ coord Id ] Ġ-= Ġdiff Ċĉĉĉĉ ĉ list . add ( Coord ( positive )) Ċĉĉĉĉ ĉ list . add ( Coord ( negative )) Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉ ĉ } Ċĉ ĉ return Ġlist Ċ ĉ } ĊĊ ĉ override Ġfun ĠhashCode () Ġ= Ġcoords . map Ġ{ Ġ 3 1 Ġ* Ġit Ġ}. fold ( coords . size ) Ġ{ Ġacc , Ġnext Ġ-> Ġacc Ġ* Ġ 1 2 1 Ġ+ Ġnext Ġ} Ċ ĉ override Ġfun Ġequals ( other : ĠAny ?) Ġ= Ċĉ ĉ if Ġ( other Ġ== Ġnull ) Ġfalse Ċĉ ĉ else Ġif Ġ( other Ġis ĠCoord ) Ġcoords . size Ġ== Ġother . coords . size Ġ&& Ġcoords . indices . all Ġ{ Ġcoords [ it ] Ġ== Ġother . coords [ it ] Ġ} Ċĉ ĉ else Ġfalse ĊĊ Ċ } Ċ Ċ abstract Ġclass ĠCube Any D Ġ{ Ċ ĉ var Ġc ubes Ġ= Ġset Of < Coord >() ĊĊ ĉ constructor ( lines : ĠList < String >, Ġdimension : ĠInt ) Ġ{ Ċĉ ĉ if Ġ( dimension Ġ< Ġ 2 ) Ġ{ Ċĉĉ ĉ throw ĠIllegalArgumentException (" dimension Ġmust Ġbe Ġat Ġleast Ġ 2 , Ġbut Ġwas : Ġ$ dimension ") Ċĉ ĉ } Ċĉ ĉ c ubes Ġ= Ġlines . indices . map Ġ{ Ġy Ġ-> Ċĉĉ ĉ lines [ y ]. indices . map Ġ{ Ġx Ġ-> Ċĉĉĉ ĉ if Ġ( lines [ y ][ x ] Ġ== Ġ'# ') Ċĉĉĉĉ ĉ Coord ( Ċĉĉĉĉĉ ĉ IntArray ( dimension ) Ġ{ Ġi Ġ-> Ċĉĉĉĉĉĉ ĉ when Ġ( i ) Ġ{ Ċĉĉĉĉĉĉĉĉ 0 Ġ-> Ġx Ċĉĉĉĉĉĉĉĉ 1 Ġ-> Ġy Ċĉĉĉĉĉĉĉ ĉ else Ġ-> Ġ 0 Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ ) Ġelse ĠCoord ( IntArray ( 0 )) Ċĉĉ ĉ }. filter Ġ{ Ġit . coords . size Ġ> Ġ 0 Ġ} Ċĉ ĉ }. flatten (). toSet () Ċ ĉ } ĊĊ ĉ fun Ġcount Active () Ġ= Ġc ubes . size ĊĊ ĉ fun Ġiterate () Ġ{ Ċĉ ĉ c ubes Ġ= Ġc ubes . map Ġ{ Ġit . ne ighbours () Ġ}. flatten (). toSet (). map Ġ{ Ċĉĉ ĉ calc Activity ( it , Ġvalue At ( it ), Ġit . ne ighbours (). count Ġ{ Ġn Ġ-> Ġc ubes . contains ( n ) Ġ}) Ċĉ ĉ }. filter Ġ{ Ġit . second Ġ== Ġ'#' Ġ}. map Ġ{ Ġit . first Ġ}. toSet () Ċ ĉ } ĊĊ ĉ private Ġfun Ġvalue At ( coord : ĠCoord ) Ġ= Ġif Ġ( c ubes . contains ( coord )) Ġ'#' Ġelse Ġ'.' ĊĊ ĉ private Ġfun Ġcalc Activity ( coord : ĠCoord , Ġcurrent : ĠChar , Ġactive Neighbor Count : ĠInt ) Ġ= Ċĉ ĉ if Ġ( current Ġ== Ġ'.' Ġ&& Ġactive Neighbor Count Ġ== Ġ 3 ) ĠPair ( coord , Ġ'# ') Ċĉ ĉ else Ġif Ġ( current Ġ== Ġ'#' Ġ&& Ġ( active Neighbor Count Ġ== Ġ 2 Ġ|| Ġactive Neighbor Count Ġ== Ġ 3 )) ĠPair ( coord , Ġ'# ') Ċĉ ĉ else ĠPair ( coord , Ġ'.') ĊĊĊ ĉ private Ġfun Ġcount Ne ighbours ( coord : ĠCoord ) Ġ= Ġcoord . ne ighbours (). count Ġ{ Ġc ubes . contains ( it ) Ġ} Ċ }