import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ import Ġkotlin . system . measure Time Millis Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġpart One Millis Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Part ĠOne ĠSolution : Ġ${ part One () }") ĊĠĠĠ Ġ} ĊĠĠĠ Ġprintln (" Part ĠOne ĠS olved Ġin : Ġ$ part One Millis Ġms ") ĊĊĠĠĠ Ġval Ġpart Two Millis Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Part ĠTwo ĠSolution : Ġ${ part Two () }") ĊĠĠĠ Ġ} ĊĠĠĠ Ġprintln (" Part ĠTwo ĠS olved Ġin : Ġ$ part Two Millis Ġms ") Ċ } Ċ Ċ private Ġfun Ġpart One (): ĠInt Ġ{ ĊĊĠĠĠ Ġval Ġinstructions Ġ= Ġread Instructions () ĊĊĠĠĠ Ġval Ġon Ġ= Ġmutable Set Of < Triple < Int , ĠInt , ĠInt >>() ĊĠĠĠ Ġval Ġvalid Range Ġ= Ġ- 5 0 .. 5 0 ĊĠĠĠ Ġfor Ġ( i Ġin Ġinstructions ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġi . x Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ! in Ġvalid Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġi . y Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y Ġ! in Ġvalid Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( z Ġin Ġi . z Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( z Ġ! in Ġvalid Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcub oid Ġ= ĠTrip le ( x , Ġy , Ġz ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i . switch Ġ== Ġ" on ") Ġon . add ( cub oid ) Ġelse Ġon . remove ( cub oid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġon . size Ċ } Ċ Ċ private Ġfun Ġpart Two (): ĠLong Ġ{ ĊĊĠĠĠ Ġval Ġinstructions Ġ= Ġread Instructions () ĊĊĠĠĠ Ġval Ġon Ġ= Ġmutable Set Of < Triple < Int Range , ĠInt Range , ĠInt Range >>() ĊĠĠĠ Ġfor Ġ( i Ġin Ġinstructions ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( i . switch Ġ== Ġ" on ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon . add ( Triple ( i . x Range , Ġi . y Range , Ġi . z Range )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Off With On Collision ( on , Ġi . to Triple ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġwraps Ġ= Ġfind Wrap s ( on ) ĊĠĠĠ Ġon . removeAll ( wrap s ) ĊĊĠĠĠ Ġcorrect On Coll isions ( on ) ĊĊĠĠĠ Ġreturn Ġon . sum Of Ġ{ ĊĠĠĠĠĠĠĠ Ġit . first . count (). to Long () Ġ* Ġit . second . count () Ġ* Ġit . third . count () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġfind Wrap s ( on : ĠMutable Set < Triple < Int Range , ĠInt Range , ĠInt Range >> ): ĠSet < Triple < Int Range , ĠInt Range , ĠInt Range >> Ġ{ ĊĠĠĠ Ġval Ġwraps Ġ= Ġmutable Set Of < Triple < Int Range , ĠInt Range , ĠInt Range >>() ĊĠĠĠ Ġfor Ġ( i Ġin Ġon ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġon ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġj ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i . wrap s ( j )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwraps . add ( j ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( j . wrap s ( i )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwraps . add ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġwraps Ċ } Ċ Ċ fun Ġcorrect On Coll isions ( on : ĠMutable Set < Triple < Int Range , ĠInt Range , ĠInt Range >>) Ġ{ ĊĠĠĠ Ġval Ġalready Correct ed Ġ= Ġmutable Set Of < Triple < Int Range , ĠInt Range , ĠInt Range >>() ĊĠĠĠ Ġout @ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġon . iterator ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġin Ġalready Correct ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġon . iterator ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġj ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i . col lide sWith ( j )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle On With On Collision ( i , Ġj , Ġon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue @ out ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalready Correct ed . add ( i ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbreak @ out ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġhandle On With On Collision ( ĊĠĠĠ Ġi : ĠTrip le < Int Range , ĠInt Range , ĠInt Range >, ĊĠĠĠ Ġj : ĠTrip le < Int Range , ĠInt Range , ĠInt Range >, ĊĠĠĠ Ġon : ĠMutable Set < Triple < Int Range , ĠInt Range , ĠInt Range >> Ċ ) Ġ{ ĊĠĠĠ Ġif Ġ( i . wrap s ( j )) Ġ{ ĊĠĠĠĠĠĠĠ Ġon . remove ( j ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( j . wrap s ( i )) Ġ{ ĊĠĠĠĠĠĠĠ Ġon . remove ( i ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġon . remove ( i ) ĊĠĠĠ Ġon . remove ( j ) ĊĊĠĠĠ Ġmerge On With On ( i , Ġj )?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġon . add ( it ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġx Ranges Ġ= Ġget Non Coll iding Ranges ( i . first , Ġj . first ) ĊĠĠĠ Ġval Ġy Ranges Ġ= Ġget Non Coll iding Ranges ( i . second , Ġj . second ) ĊĠĠĠ Ġval Ġz Ranges Ġ= Ġget Non Coll iding Ranges ( i . third , Ġj . third ) ĊĊĠĠĠ Ġadd Range Combin ations ( ĊĠĠĠĠĠĠĠ Ġon , ĊĠĠĠĠĠĠĠ Ġx Ranges . filter Ġ{ Ġit . in Range ( i . first ) Ġ&& Ġit . count () Ġ> Ġ 0 Ġ}, ĊĠĠĠĠĠĠĠ Ġy Ranges . filter Ġ{ Ġit . in Range ( i . second ) Ġ&& Ġit . count () Ġ> Ġ 0 Ġ}, ĊĠĠĠĠĠĠĠ Ġz Ranges . filter Ġ{ Ġit . in Range ( i . third ) Ġ&& Ġit . count () Ġ> Ġ 0 Ġ}, ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġadd Range Combin ations ( ĊĠĠĠĠĠĠĠ Ġon , ĊĠĠĠĠĠĠĠ Ġx Ranges . filter Ġ{ Ġit . in Range ( j . first ) Ġ&& Ġit . count () Ġ> Ġ 0 Ġ}, ĊĠĠĠĠĠĠĠ Ġy Ranges . filter Ġ{ Ġit . in Range ( j . second ) Ġ&& Ġit . count () Ġ> Ġ 0 Ġ}, ĊĠĠĠĠĠĠĠ Ġz Ranges . filter Ġ{ Ġit . in Range ( j . third ) Ġ&& Ġit . count () Ġ> Ġ 0 Ġ}, ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun Ġget Non Coll iding Ranges ( i : ĠInt Range , Ġj : ĠInt Range ): ĠSet < Int Range > Ġ{ ĊĠĠĠ Ġval Ġcommon Ġ= Ġi . intersect ( j ). to Sorted Set () ĊĠĠĠ Ġif Ġ( common . isEmpty ()) Ġreturn Ġempty Set () ĊĠĠĠ Ġval Ġcommon Range Ġ= Ġcommon . first () .. common . last () ĊĠĠĠ Ġval Ġmin First Ġ= Ġmin ( i . first , Ġj . first ) ĊĠĠĠ Ġval Ġmax Last Ġ= Ġmax ( i . last , Ġj . last ) ĊĠĠĠ Ġval Ġfirst Range Ġ= Ġmin First Ġuntil Ġcommon . first () ĊĠĠĠ Ġval Ġlast Range Ġ= Ġcommon . last () Ġ+ Ġ 1 .. max Last ĊĠĠĠ Ġreturn Ġset Of ( common Range , Ġfirst Range , Ġlast Range ) Ċ } Ċ Ċ private Ġfun Ġmerge On With On ( ĊĠĠĠ Ġi : ĠTrip le < Int Range , ĠInt Range , ĠInt Range >, ĊĠĠĠ Ġj : ĠTrip le < Int Range , ĠInt Range , ĠInt Range >, Ċ ): ĠTrip le < Int Range , ĠInt Range , ĠInt Range >? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( i . first Ġ== Ġj . first Ġ&& Ġi . second Ġ== Ġj . second ) Ġ{ ĊĠĠĠĠĠĠĠ Ġi . copy ( third Ġ= Ġmin ( i . third . first , Ġj . third . first ) .. max ( i . third . last , Ġj . third . last )) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( i . first Ġ== Ġj . first Ġ&& Ġi . third Ġ== Ġj . third ) Ġ{ ĊĠĠĠĠĠĠĠ Ġi . copy ( second Ġ= Ġmin ( i . second . first , Ġj . second . first ) .. max ( i . second . last , Ġj . second . last )) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( i . second Ġ== Ġj . second Ġ&& Ġi . third Ġ== Ġj . third ) Ġ{ ĊĠĠĠĠĠĠĠ Ġi . copy ( first Ġ= Ġmin ( i . first . first , Ġj . first . first ) .. max ( i . first . last , Ġj . first . last )) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġadd Range Combin ations ( ĊĠĠĠ Ġon : ĠMutable Set < Triple < Int Range , ĠInt Range , ĠInt Range >>, ĊĠĠĠ Ġx Ranges : ĠList < Int Range >, ĊĠĠĠ Ġy Ranges : ĠList < Int Range >, ĊĠĠĠ Ġz Ranges : ĠList < Int Range >, Ċ ) Ġ{ ĊĠĠĠ Ġfor Ġ( x Ġin Ġx Ranges ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġy Ranges ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( z Ġin Ġz Ranges ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon . add ( Triple ( x , Ġy , Ġz )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġhandle Off With On Collision ( ĊĠĠĠ Ġon : ĠMutable Set < Triple < Int Range , ĠInt Range , ĠInt Range >>, ĊĠĠĠ Ġi : ĠTrip le < Int Range , ĠInt Range , ĠInt Range >, Ċ ) Ġ{ ĊĠĠĠ Ġval Ġon Copy Ġ= Ġon . toSet () ĊĠĠĠ Ġfor Ġ( triple Ġin Ġon Copy ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( i . col lide sWith ( triple )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon . remove ( triple ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i . wrap s ( triple )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ranges Ġ= Ġget Non Coll iding Ranges ( i . first , Ġtriple . first ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ranges Ġ= Ġget Non Coll iding Ranges ( i . second , Ġtriple . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz Ranges Ġ= Ġget Non Coll iding Ranges ( i . third , Ġtriple . third ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Range Combin ations Off ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ranges . filter Ġ{ Ġit . count () Ġ> Ġ 0 Ġ&& Ġtriple . first . wrap s ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ranges . filter Ġ{ Ġit . count () Ġ> Ġ 0 Ġ&& Ġtriple . second . wrap s ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz Ranges . filter Ġ{ Ġit . count () Ġ> Ġ 0 Ġ&& Ġtriple . third . wrap s ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġadd Range Combin ations Off ( ĊĠĠĠ Ġon : ĠMutable Set < Triple < Int Range , ĠInt Range , ĠInt Range >>, ĊĠĠĠ Ġx Ranges : ĠList < Int Range >, ĊĠĠĠ Ġy Ranges : ĠList < Int Range >, ĊĠĠĠ Ġz Ranges : ĠList < Int Range >, ĊĠĠĠ Ġoff Triple : ĠTrip le < Int Range , ĠInt Range , ĠInt Range >, Ċ ) Ġ{ ĊĠĠĠ Ġfor Ġ( x Ġin Ġx Ranges ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġy Ranges ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( z Ġin Ġz Ranges ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x . in Range ( off Triple . first ) Ġ&& Ġy . in Range ( off Triple . second ) Ġ&& Ġz . in Range ( off Triple . third )) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon . add ( Triple ( x , Ġy , Ġz )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠInt Range . in Range ( other : ĠInt Range ) Ġ= ĊĠĠĠ Ġthis . first Ġin Ġother Ġ|| Ġthis . last Ġin Ġother Ġ|| Ġother . first Ġin Ġthis Ġ|| Ġother . last Ġin Ġthis Ċ Ċ fun ĠInt Range . wrap s ( other : ĠInt Range ) Ġ= Ġthis . first Ġ<= Ġother . first Ġ&& Ġthis . last Ġ>= Ġother . last Ċ Ċ fun ĠTrip le < Int Range , ĠInt Range , ĠInt Range >. wrap s ( other : ĠTrip le < Int Range , ĠInt Range , ĠInt Range >): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġthis . first . wrap s ( other . first ) Ġ&& Ġthis . second . wrap s ( other . second ) Ġ&& Ġthis . third . wrap s ( other . third ) Ċ } Ċ Ċ fun ĠTrip le < Int Range , ĠInt Range , ĠInt Range >. col lide sWith ( other : ĠTrip le < Int Range , ĠInt Range , ĠInt Range >): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġthis . first . in Range ( other . first ) Ġ&& Ġthis . second . in Range ( other . second ) Ġ&& Ġthis . third . in Range ( other . third ) Ċ } Ċ Ċ fun Ġread Instructions (): ĠList < Instruction > Ġ{ ĊĠĠĠ Ġval Ġregex Ġ= ĊĠĠĠĠĠĠĠ ĠRegex (" ([ a - z ]+ )\\ sx = (- ?[ 0 - 9 ]+) \\. \\. (- ?[ 0 - 9 ]+ ), y = (- ?[ 0 - 9 ]+) \\. \\. (- ?[ 0 - 9 ]+ ), z = (- ?[ 0 - 9 ]+) \\. \\. (- ?[ 0 - 9 ]+ )") ĊĠĠĠ Ġreturn Ġread Input Lines (). map Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġregex . match Ent ire ( it ) !! ĊĠĠĠĠĠĠĠ Ġval Ġswitch Ġ= Ġresult . groups [ 1 ] !!. value ĊĠĠĠĠĠĠĠ Ġval Ġx From Ġ= Ġresult . groups [ 2 ] !!. value . toInt () ĊĠĠĠĠĠĠĠ Ġval Ġx To Ġ= Ġresult . groups [ 3 ] !!. value . toInt () ĊĠĠĠĠĠĠĠ Ġval Ġy From Ġ= Ġresult . groups [ 4 ] !!. value . toInt () ĊĠĠĠĠĠĠĠ Ġval Ġy To Ġ= Ġresult . groups [ 5 ] !!. value . toInt () ĊĠĠĠĠĠĠĠ Ġval Ġz From Ġ= Ġresult . groups [ 6 ] !!. value . toInt () ĊĠĠĠĠĠĠĠ Ġval Ġz To Ġ= Ġresult . groups [ 7 ] !!. value . toInt () ĊĠĠĠĠĠĠĠ ĠInstruction ( switch , Ġx From .. x To , Ġy From .. y To , Ġz From .. z To ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠInstruction ( ĊĠĠĠ Ġval Ġswitch : ĠString , ĊĠĠĠ Ġval Ġx Range : ĠInt Range , ĊĠĠĠ Ġval Ġy Range : ĠInt Range , ĊĠĠĠ Ġval Ġz Range : ĠInt Range , Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġto Triple () Ġ= ĠTrip le ( x Range , Ġy Range , Ġz Range ) Ċ } Ċ Ċ private Ġfun Ġread Input Lines (): ĠList < String > Ġ{ ĊĠĠĠ Ġreturn Ġ{} :: class . java . class Loader . getResource (" input . txt ") !! ĊĠĠĠĠĠĠĠ Ġ. read Text () ĊĠĠĠĠĠĠĠ Ġ. split ("\ n ") ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotBlank () Ġ} Ċ } Ċ