package Ġdays Ċ Ċ @ Ad vent Of Code P uzzle ( ĊĠĠĠ Ġname Ġ= Ġ" Con way ĠC ubes ", ĊĠĠĠ Ġurl Ġ= Ġ" https :// ad vent of code . com / 2 0 2 0 / day / 1 7 ", ĊĠĠĠ Ġdate Ġ= ĠDate ( day Ġ= Ġ 1 7 , Ġyear Ġ= Ġ 2 0 2 0 ) Ċ ) Ċ class ĠDay 1 7 ( val Ġinput : ĠList < String >) Ġ: ĠP uzzle Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġpart One (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgenerate Sequence ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Input Ġ{ Ġx , Ġy Ġ-> ĠPoint 3 D ( x , Ġy , Ġ 0 ) Ġ}) Ġ{ Ġspace Ġ-> Ġspace . next () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. drop ( 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first (). size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpart Two (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġhyper Ġ= Ġread Input Ġ{ Ġx , Ġy Ġ-> ĠHyper cube ( x , Ġy , Ġ 0 , Ġ 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġrepeat ( 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhyper Ġ= Ġhyper . next () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġhyper . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Input ( point Function : Ġ( Int , ĠInt ) Ġ-> ĠPoint ): ĠSet < Point > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġspace Ġ= Ġmutable Set Of < Point >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġinput . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġinput [ y ]. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input [ y ][ x ] Ġ== Ġ'# ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspace . add ( point Function ( x , Ġy )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġspace ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠSet < Point >. next (): ĠSet < Point > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġmutable Set Of < Point >() ĊĠĠĠĠĠĠĠ Ġval Ġactive Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġval Ġall Ġ= Ġactive ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġpoint Ġ-> Ġpoint . neighbors () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠĠĠĠĠ Ġall . forEach Ġ{ Ġpoint Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactive Neighbors Ġ= Ġpoint . neighbors (). count Ġ{ Ġneighbor Ġ-> Ġneighbor Ġin Ġactive Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Ġin Ġactive Ġ&& Ġactive Neighbors Ġin Ġset Of ( 2 , Ġ 3 ) Ġ-> Ġnext . add ( point ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Ġ! in Ġactive Ġ&& Ġactive Neighbors Ġin Ġset Of ( 3 ) Ġ-> Ġnext . add ( point ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠPoint Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġneighbors (): ĠList < Point > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠPoint 3 D ( val Ġx : ĠInt , Ġval Ġy : ĠInt , Ġval Ġz : ĠInt ) Ġ: ĠPoint Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġneighbors (): ĠList < Point 3 D > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( x Ġ- Ġ 1 .. x Ġ+ Ġ 1 ). map Ġ{ Ġx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( y Ġ- Ġ 1 .. y Ġ+ Ġ 1 ). map Ġ{ Ġy Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( z Ġ- Ġ 1 .. z Ġ+ Ġ 1 ). map NotNull Ġ{ Ġz Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPoint 3 D ( x , Ġy , Ġz ). take If Ġ{ Ġit Ġ!= Ġthis Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. flatten () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. flatten () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠHyper cube ( val Ġx : ĠInt , Ġval Ġy : ĠInt , Ġval Ġz : ĠInt , Ġval Ġh : ĠInt ) Ġ: ĠPoint Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġneighbors (): ĠList < Hyper cube > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( x Ġ- Ġ 1 .. x Ġ+ Ġ 1 ). map Ġ{ Ġx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( y Ġ- Ġ 1 .. y Ġ+ Ġ 1 ). map Ġ{ Ġy Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( z Ġ- Ġ 1 .. z Ġ+ Ġ 1 ). map Ġ{ Ġz Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( h Ġ- Ġ 1 .. h Ġ+ Ġ 1 ). map NotNull Ġ{ Ġh Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHyper cube ( x , Ġy , Ġz , Ġh ). take If Ġ{ Ġit Ġ!= Ġthis Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. flatten () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. flatten () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. flatten () ĊĠĠĠ Ġ} Ċ }