package Ġk Lo ops . examples Ċ Ċ type alias ĠPoint Ġ= ĠPair < Int , ĠInt > Ċ Ċ data Ġclass ĠWorld ( val Ġland Points : ĠSet < Point >, Ġval Ġheight : ĠInt , Ġval Ġwidth : ĠInt ) Ġ{ ĊĠĠĠ Ġfun Ġprint () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġheight ). forEach Ġ{ Ġrow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġwidth ). forEach Ġ{ Ġcolumn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġif Ġ( land Points . contains ( Point ( row , Ġcolumn ))) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint ("$ value Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġne ighbours ( point : ĠPoint ): ĠList < Point > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġne ighbours Ġ= Ġmutable ListOf < Point >() ĊĠĠĠĠĠĠĠ Ġif Ġ( point . first Ġ> Ġ 0 ) Ġne ighbours . add ( point . copy ( first Ġ= Ġpoint . first Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġif Ġ( point . first Ġ< Ġheight Ġ- Ġ 1 ) Ġne ighbours . add ( point . copy ( first Ġ= Ġpoint . first Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġif Ġ( point . second Ġ> Ġ 0 ) Ġne ighbours . add ( point . copy ( second Ġ= Ġpoint . second Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġif Ġ( point . second Ġ> Ġwidth Ġ- Ġ 1 ) Ġne ighbours . add ( point . copy ( second Ġ= Ġpoint . second Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġne ighbours . toList () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġis Per fect Is land ( world : ĠWorld ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġvisited Point Ġ= Ġmutable ListOf ( world . land Points . first ()) ĊĠĠĠ Ġfun Ġtraverse Is land () Ġ{ ĊĠĠĠĠĠĠĠ Ġworld . ne ighbours ( visited Point . last ()). forEach Ġ{ Ġneighbour Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( world . land Points . contains ( ne ighbour ) Ġ&& Ġ! visited Point . contains ( ne ighbour )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisited Point . add ( ne ighbour ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtraverse Is land () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġtraverse Is land () ĊĠĠĠ Ġreturn Ġvisited Point . contains All ( world . land Points ) Ċ } Ċ Ċ val Ġmem mo ization Ġ= Ġmutable Map Of < World , ĠInt >() Ċ fun Ġfind NumberOf Sw itches ( world : ĠWorld , Ġpath : ĠList < World >): ĠInt Ġ{ ĊĠĠĠ Ġmem mo ization [ world ] Ġ= Ġ- 1 ĊĠĠĠ Ġif Ġ( mem mo ization [ world ] ?: Ġ- 1 Ġ> Ġ 0 Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmem mo ization [ world ] !! ĊĠĠĠ Ġ} ĊĠĠĠ Ġval ĠnumberOf Sw itches Ġ= Ġif Ġ( is Per fect Is land ( world )) Ġ{ ĊĊĠĠĠĠĠĠĠĠ 0 ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠ 1 Ġ+ Ġworld . land Points . flatMap Ġ{ Ġpoint Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworld . ne ighbours ( point ). map Ġ{ Ġneighbour Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworld . copy ( land Points Ġ= Ġworld . land Points Ġ- Ġpoint Ġ+ Ġneighbour ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. filter Ġ{ new World Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! path . contains ( new World ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġnew World Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsw Ġ= Ġfind NumberOf Sw itches ( new World , Ġpath Ġ+ Ġworld ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsw ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. min () !! ĊĠĠĠ Ġ} ĊĠĠĠ Ġmem mo ization . put ( world , ĠnumberOf Sw itches ) ĊĠĠĠ Ġreturn ĠnumberOf Sw itches Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġworld Array Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 0 , Ġ 1 , Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 0 , Ġ 0 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 1 , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġheight Ġ= Ġworld Array . size ĊĠĠĠ Ġval Ġwidth Ġ= Ġworld Array [ 0 ]. size ĊĠĠĠ Ġval Ġland Points Ġ= Ġ( 0 Ġuntil Ġheight ). flatMap Ġ{ Ġrow Ġ-> ĊĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġwidth ). flatMap Ġ{ Ġcolumn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( world Array [ row ][ column ] Ġ== Ġ 1 ) ĠlistOf ( Point ( row , Ġcolumn )) Ġelse ĠlistOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. toSet () ĊĠĠĠ Ġval Ġworld Ġ= ĠWorld ( land Points , Ġheight , Ġwidth ) ĊĠĠĠ Ġworld . print () ĊĊĠĠĠ Ġprintln (" F uck Ġ${ find NumberOf Sw itches ( world , ĠlistOf ()) }") ĊĠĠĠ Ġprintln (" F uck Ġ${ find NumberOf Sw itches ( world , ĠlistOf ()) }") Ċ }