import Ġio . kot est . core . spec . style . Fun Spec Ċ import Ġio . kot est . data . for All Ċ import Ġio . kot est . data . headers Ċ import Ġio . kot est . data . row Ċ import Ġio . kot est . data . table Ċ import Ġio . kot est . matchers . shouldBe Ċ Ċ /* Ċ --- ĠDay Ġ 5 : ĠBinary ĠBo arding Ġ--- Ċ Ċ See Ġhttps :// ad vent of code . com / 2 0 2 0 / day / 5 ĊĊ Ġ*/ Ċ Ċ fun Ġdecode Board ing Pass ( pass String : ĠString ): ĠInt Ġ= Ġdecode Rows ( pass String . take ( 7 )) Ġ* Ġ 8 Ġ+ Ġdecode Columns ( pass String . drop ( 7 )) Ċ Ċ fun Ġdecode Rows ( row String : ĠString ) Ġ= Ġdecode Binary String ( Ġrow String . map Ġ{ ĊĠĠĠ Ġwhen ( it ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ' B ' Ġ-> Ġ' 1 ' ĊĠĠĠĠĠĠĠ Ġ' F ' Ġ-> Ġ' 0 ' ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unexpected Ġrow Ġchar Ġ$ it ") ĊĠĠĠ Ġ} Ċ }) Ċ Ċ fun Ġdecode Columns ( col String : ĠString ) Ġ= Ġdecode Binary String ( Ġcol String . map Ġ{ ĊĠĠĠ Ġwhen ( it ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ' R ' Ġ-> Ġ' 1 ' ĊĠĠĠĠĠĠĠ Ġ' L ' Ġ-> Ġ' 0 ' ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unexpected Ġrow Ġchar Ġ$ it ") ĊĠĠĠ Ġ} Ċ }) Ċ Ċ fun Ġdecode Binary String ( binary String : ĠList < Char >): ĠInt Ġ= Ġbinary String . fold ( 0 ) Ġ{ Ġcurrent , Ġn Ġ-> ĊĠĠĠ Ġcurrent Ġ* Ġ 2 Ġ Ġ+ Ġwhen ( n ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ' 1 ' Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠDay 0 5 _ Part 1 Ġ: ĠFun Spec ({ ĊĠĠĠ Ġcontext (" decode Ġrow ") Ġ{ ĊĠĠĠĠĠĠĠ Ġtable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheaders (" row ", Ġ" expected "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow (" B FFF BB F ", Ġ 7 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow (" FFF BB BF ", Ġ 1 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow (" BB FF BB F ", Ġ 1 0 2 ) ĊĠĠĠĠĠĠĠ Ġ). for All Ġ{ Ġrow String , Ġexpected Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġdecode Rows ( row String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĠshouldBe Ġexpected ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġcontext (" decode Ġcolumns ") Ġ{ ĊĠĠĠĠĠĠĠ Ġtable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheaders (" columns ", Ġ" expected "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow (" RR R ", Ġ 7 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow (" RL L ", Ġ 4 ), ĊĠĠĠĠĠĠĠ Ġ). for All Ġ{ Ġcol String , Ġexpected Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġdecode Columns ( col String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĠshouldBe Ġexpected ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġcontext (" decode Ġboard ing Ġpass ") Ġ{ ĊĠĠĠĠĠĠĠ Ġtable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheaders (" bo ading Ġpass ", Ġ" expected "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow (" B FFF BB FR RR ", Ġ 5 6 7 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow (" FFF BBB FR RR ", Ġ 1 1 9 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow (" BB FF BB F RL L ", Ġ 8 2 0 ) ĊĠĠĠĠĠĠĠ Ġ). for All Ġ{ Ġpass String , Ġexpected Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġdecode Board ing Pass ( pass String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĠshouldBe Ġexpected ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ Ċ class ĠDay 0 5 _ Part 1 _ Exercise : ĠFun Spec ({ ĊĠĠĠ Ġval Ġinput Ġ= Ġread Resource (" day 0 5 Input . txt ") !! ĊĠĠĠ Ġval Ġpass Strings Ġ= Ġinput . split ("\ n ") ĊĠĠĠ Ġval Ġhighest Id Ġ= Ġpass Strings . map Ġ{ Ġdecode Board ing Pass ( it ) Ġ}. max OrNull () ĊĠĠĠ Ġtest (" solution ") Ġ{ ĊĠĠĠĠĠĠĠ Ġhighest Id ĠshouldBe Ġ 9 7 8 ĊĠĠĠ Ġ} Ċ }) Ċ Ċ class ĠDay 0 5 _ Part 2 _ Exercise : ĠFun Spec ({ ĊĠĠĠ Ġval Ġinput Ġ= Ġread Resource (" day 0 5 Input . txt ") !! ĊĠĠĠ Ġval Ġpass Strings Ġ= Ġinput . split ("\ n ") ĊĠĠĠ Ġval Ġids Ġ= Ġpass Strings . map Ġ{ Ġdecode Board ing Pass ( it ) Ġ} ĊĠĠĠ Ġval Ġids In Row With Empty Seat Ġ= Ġids . groupBy Ġ{ Ġid Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġrow Ġ= Ġid Ġ/ Ġ 8 ĊĠĠĠĠĠĠĠ Ġrow ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. entries . filter Ġ{ Ġ(_, Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . size Ġ< Ġ 8 ĊĠĠĠĠĠĠĠ Ġ}. first Ġ{ Ġ( key , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ!= Ġ 1 Ġ&& Ġkey Ġ!= Ġ 1 2 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. value ĊĠĠĠ Ġval Ġrow Ġ= Ġids In Row With Empty Seat . first () Ġ/ Ġ 8 ĊĠĠĠ Ġval Ġall Se ats In Row Ġ= Ġ( 0 .. 7 ). map Ġ{ Ġrow Ġ* Ġ 8 Ġ+ Ġit Ġ} ĊĠĠĠ Ġval Ġfree Seat Ġ= Ġ( all Se ats In Row Ġ- Ġids In Row With Empty Seat ). first () ĊĠĠĠ Ġtest (" solution ") Ġ{ ĊĠĠĠĠĠĠĠ Ġfree Seat ĠshouldBe Ġ 7 2 7 ĊĠĠĠ Ġ} Ċ }) Ċ