package Ġcom . luc as z eta . ad vent of code 2 0 2 0 . day 1 6 Ċ Ċ import Ġcom . luc as z eta . ad vent of code 2 0 2 0 . ext . getResource As Text Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġinput Ġ= ĠgetResource As Text ("/ day 1 6 / ticket - notes . txt ") ĊĊĠĠĠ Ġval Ġticket Fields Ġ= Ġextract Ticket Fields ( input ) ĊĠĠĠ Ġval Ġnearby Tickets Ġ= Ġextract Near by Tickets ( input ) ĊĊĠĠĠ Ġval Ġinvalid Values Ġ= Ġfind Invalid Fields ( near by Tickets , Ġticket Fields ) ĊĊĠĠĠ Ġprintln (" Ticket Ġscanning Ġerror Ġrate : Ġ${ invalid Values . reduce ( Int :: plus )} ") ĊĊĠĠĠ Ġval Ġmy Ticket Ġ= Ġextract Your Ticket ( input ) ĊĠĠĠ Ġval Ġvalid Tickets Ġ= Ġfilter Valid Tickets ( near by Tickets , Ġticket Fields ) ĊĠĠĠ Ġval Ġfields Index Ġ= Ġidentify Field Index ( valid Tickets , Ġticket Fields ) ĊĊĠĠĠ Ġval Ġresult Ġ= Ġfields Index ĊĠĠĠĠĠĠĠ Ġ. filter Keys Ġ{ Ġit . startsWith (" depart ure ") Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġmy Ticket [ it . value ]. to Long () Ġ} ĊĠĠĠĠĠĠĠ Ġ. reduce ( Long :: times ) ĊĊĠĠĠ Ġprintln (" Product Ġof Ġdepart ure Ġfields : Ġ$ result ") Ċ } Ċ Ċ fun Ġextract Your Ticket ( input : ĠString ): ĠList < Int > Ġ{ ĊĠĠĠ Ġval Ġlines Ġ= Ġinput . split ("\ n ") ĊĠĠĠ Ġval Ġindex Ġ= Ġlines . indexOf (" your Ġticket :") ĊĊĠĠĠ Ġreturn Ġlines [ index Ġ+ Ġ 1 ]. split ("," ). map Ġ{ Ġit . toInt () Ġ} Ċ } Ċ Ċ fun Ġextract Near by Tickets ( input : ĠString ): ĠList < List < Int >> Ġ{ ĊĠĠĠ Ġval Ġlines Ġ= Ġinput . split ("\ n ") ĊĠĠĠ Ġval Ġindex Ġ= Ġlines . indexOf (" near by Ġtickets :") ĊĠĠĠ Ġval Ġnearby Tickets Ġ= Ġmutable ListOf < List < Int >>() ĊĊĠĠĠ Ġfor Ġ( i Ġin Ġ( index Ġ+ Ġ 1 ) Ġuntil Ġlines . size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( lines [ i ]. isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnearby Tickets . add ( lines [ i ]. split ("," ). map Ġ{ Ġit . toInt () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnearby Tickets . toList () Ċ } Ċ Ċ fun Ġextract Ticket Fields ( input : ĠString ): ĠMap < String , ĠList < Int Range >> Ġ{ ĊĠĠĠ Ġval Ġticket Field Result Ġ= Ġ" ([ a - z Ġ] * ): Ġ( \\ d +) -( \\ d +) Ġor Ġ( \\ d +) -( \\ d + )" ĊĠĠĠĠĠĠĠ Ġ. to Regex () ĊĠĠĠĠĠĠĠ Ġ. findAll ( input ) ĊĊĠĠĠ Ġval Ġticket Fields Ġ= Ġmutable Map Of < String , ĠList < Int Range >>() ĊĊĠĠĠ Ġticket Field Result . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġit . group Values [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġfirst Range Ġ= Ġit . group Values [ 2 ]. toInt () .. it . group Values [ 3 ]. toInt () ĊĠĠĠĠĠĠĠ Ġval Ġsecond Range Ġ= Ġit . group Values [ 4 ]. toInt () .. it . group Values [ 5 ]. toInt () ĊĊĠĠĠĠĠĠĠ Ġticket Fields [ name ] Ġ= ĠlistOf ( first Range , Ġsecond Range ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġticket Fields . toMap () Ċ } Ċ