package Ġde . mb development . ad vent of code . year 2 0 2 1 . sol vers . day 1 9 Ċ Ċ import Ġde . mb development . ad vent of code . year 2 0 2 1 . sol vers . P uzzle Solver Ċ Ċ class ĠDay 1 9 P uzzle 1 Ġ: ĠP uzzle Solver Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġsolve ( input Lines : ĠSequence < String >) Ġ= ĠnumberOf Be ac ons ( input Lines ). toString () ĊĊĠĠĠ Ġprivate Ġfun ĠnumberOf Be ac ons ( scanner Data : ĠSequence < String >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsc anners Ġ= Ġparse Sc anners ( scanner Data ) ĊĠĠĠĠĠĠĠ Ġval Ġf lipped Sc anners Ġ= Ġsc anners . map Ġ{ Ġflip All Axis ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġf lipped And Rot ated Sc anners Ġ= Ġf lipped Sc anners . map Ġ{ Ġscanner Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscanner Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscanner . map Ġ{ Ġrotate Around X ( it , Ġ 1 ) Ġ}. toSet () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscanner . map Ġ{ Ġrotate Around X ( it , Ġ 2 ) Ġ}. toSet () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscanner . map Ġ{ Ġrotate Around X ( it , Ġ 3 ) Ġ}. toSet () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscanner . map Ġ{ Ġrotate Around Y ( it , Ġ 1 ) Ġ}. toSet () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscanner . map Ġ{ Ġrotate Around Y ( it , Ġ 2 ) Ġ}. toSet () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscanner . map Ġ{ Ġrotate Around Y ( it , Ġ 3 ) Ġ}. toSet () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscanner . map Ġ{ Ġrotate Around Z ( it , Ġ 1 ) Ġ}. toSet () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscanner . map Ġ{ Ġrotate Around Z ( it , Ġ 2 ) Ġ}. toSet () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscanner . map Ġ{ Ġrotate Around Z ( it , Ġ 3 ) Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO ĠSome Ġother Ġday . ĠI Ġdon 't Ġhave Ġtime Ġfor Ġthis ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Sc anners ( scanner Data : ĠSequence < String >): ĠList < Set < Point >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsc anners Ġ= Ġmutable ListOf < Set < Point >>() ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Scanner Ġ= Ġmutable Set Of < Point >() ĊĠĠĠĠĠĠĠ Ġscanner Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. drop ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotBlank () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġdata Line Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Line . startsWith (" --- Ġscanner ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsc anners Ġ+= Ġcurrent Scanner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Scanner Ġ= Ġmutable Set Of () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoordinates Ġ= Ġdata Line . split (',' ). map Ġ{ Ġit . toInt () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Scanner Ġ+= ĠPoint ( coordinates [ 0 ], Ġcoordinates [ 1 ], Ġcoordinates [ 2 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġsc anners Ġ+= Ġcurrent Scanner Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsc anners ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflip All Axis ( points : ĠSet < Point >) Ġ= ĊĠĠĠĠĠĠĠ Ġset Of ( points , Ġflip X ( points )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġset Of ( it , Ġflip Y ( it )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġset Of ( it , Ġflip Z ( it )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠ Ġprivate Ġfun Ġflip X ( points : ĠSet < Point >) Ġ= Ġpoints . map Ġ{ Ġit Ġ* ĠPoint (- 1 , Ġ 1 , Ġ 1 ) Ġ}. toSet () ĊĊĠĠĠ Ġprivate Ġfun Ġflip Y ( points : ĠSet < Point >) Ġ= Ġpoints . map Ġ{ Ġit Ġ* ĠPoint ( 1 , Ġ- 1 , Ġ 1 ) Ġ}. toSet () ĊĊĠĠĠ Ġprivate Ġfun Ġflip Z ( points : ĠSet < Point >) Ġ= Ġpoints . map Ġ{ Ġit Ġ* ĠPoint ( 1 , Ġ 1 , Ġ- 1 ) Ġ}. toSet () ĊĊĠĠĠ Ġprivate Ġfun Ġrotate Around X ( points : ĠSet < Point >, Ġtimes 9 0 Degrees : ĠInt ) Ġ= Ġpoints . map Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġx Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġ// Ġy Ġ= Ġy Ġ* Ġcos ( angle ) Ġ- Ġz Ġ* Ġsin ( angle ) ĊĠĠĠĠĠĠĠ Ġ// Ġz Ġ= Ġy Ġ* Ġsin ( angle ) Ġ+ Ġz Ġ* Ġcos ( angle ) ĊĠĠĠĠĠĠĠ Ġ// ĠHard coded , Ġno Ġtime Ġfor Ġmath ĊĠĠĠĠĠĠĠ Ġwhen Ġ( times 9 0 Degrees ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠPoint ( it . x , Ġit . z , Ġit . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠPoint ( it . x , Ġ- 1 Ġ* Ġit . y , Ġ- 1 Ġ* Ġit . z ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> ĠPoint ( it . x , Ġ- 1 Ġ* Ġit . z , Ġ- 1 Ġ* Ġit . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" times 9 0 Degrees Ġmust Ġbe Ġin Ġ{ 1 , Ġ 2 , Ġ 3 }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. toSet () ĊĊĠĠĠ Ġprivate Ġfun Ġrotate Around Y ( points : ĠSet < Point >, Ġtimes 9 0 Degrees : ĠInt ) Ġ= Ġpoints . map Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġx Ġ= Ġz Ġ* Ġsin ( angle ) Ġ+ Ġx Ġ* Ġcos ( angle ) ĊĠĠĠĠĠĠĠ Ġ// Ġy Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġ// Ġz Ġ= Ġy Ġ* Ġcos ( angle ) Ġ- Ġx Ġ* Ġsin ( angle ) ĊĠĠĠĠĠĠĠ Ġ// ĠHard coded , Ġno Ġtime Ġfor Ġmath ĊĠĠĠĠĠĠĠ Ġwhen Ġ( times 9 0 Degrees ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠPoint ( it . z , Ġit . y , Ġ- 1 Ġ* Ġit . x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠPoint (- 1 Ġ* Ġit . x , Ġit . y , Ġ- 1 Ġ* Ġit . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> ĠPoint (- 1 Ġ* Ġit . z , Ġit . y , Ġit . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" times 9 0 Degrees Ġmust Ġbe Ġin Ġ{ 1 , Ġ 2 , Ġ 3 }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. toSet () ĊĊĠĠĠ Ġprivate Ġfun Ġrotate Around Z ( points : ĠSet < Point >, Ġtimes 9 0 Degrees : ĠInt ) Ġ= Ġpoints . map Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġx Ġ= Ġx Ġ* Ġcos ( angle ) Ġ- Ġy Ġ* Ġsin ( angle ) ĊĠĠĠĠĠĠĠ Ġ// Ġy Ġ= Ġx Ġ* Ġsin ( angle ) Ġ+ Ġy Ġ* Ġcos ( angle ) ĊĠĠĠĠĠĠĠ Ġ// Ġz Ġ= Ġz ĊĠĠĠĠĠĠĠ Ġ// ĠHard coded , Ġno Ġtime Ġfor Ġmath ĊĠĠĠĠĠĠĠ Ġwhen Ġ( times 9 0 Degrees ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠPoint (- 1 Ġ* Ġit . y , Ġit . x , Ġit . z ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠPoint (- 1 Ġ* Ġit . x , Ġ- 1 Ġ* Ġit . y , Ġit . z ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> ĠPoint ( it . y , Ġ- 1 Ġ* Ġit . x , Ġit . z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" times 9 0 Degrees Ġmust Ġbe Ġin Ġ{ 1 , Ġ 2 , Ġ 3 }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. toSet () Ċ Ċ } Ċ Ċ data Ġclass ĠPoint ( val Ġx : ĠInt , Ġval Ġy : ĠInt , Ġval Ġz : ĠInt ) Ġ{ ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠPoint ) Ġ= ĠPoint ( x Ġ* Ġother . x , Ġy Ġ* Ġother . y , Ġz Ġ* Ġother . z ) ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠPoint ) Ġ= ĠPoint ( x Ġ+ Ġother . x , Ġy Ġ+ Ġother . y , Ġz Ġ+ Ġother . z ) Ċ } Ċ