package Ġru . tim ak den . ad vent of code . year 2 0 1 5 . day 0 7 Ċ Ċ import Ġru . tim ak den . ad vent of code . is Letter Ċ import Ġru . tim ak den . ad vent of code . isNumber Ċ import Ġru . tim ak den . ad vent of code . measure Ċ import Ġkotlin . time . Experimental Time Ċ Ċ @ Experimental Time Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġmeasure Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" a Ġ= Ġ${ solve ( input , ĠlistOf (" a ")) [" a "] }") ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġsolve ( input : ĠList < String >, Ġwire sTo Return : ĠList < String >): ĠMap < String , ĠU Short > Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < String , ĠU Short >() ĊĠĠĠ Ġwhile Ġ( map . size Ġ!= Ġinput . size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinput . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpressions Ġ= Ġit . split ("\\ s -> \\ s ". to Regex ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Part Ġ= Ġexpressions [ 0 ]. split ("\\ s (? ! or | and | l shift | r shift ) ". to Regex ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( left Part . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexample : Ġ 4 4 4 3 0 Ġ-> Ġb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Part [ 0 ]. isNumber ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ expressions [ 1 ]] Ġ= Ġleft Part [ 0 ]. to U Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( left Part [ 0 ]. is Letter ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ left Part [ 0 ]] ?. let Ġ{ Ġvalue Ġ-> Ġmap [ expressions [ 1 ]] Ġ= Ġvalue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexample : ĠNOT Ġdi Ġ-> Ġdj ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Part [ 1 ]. isNumber ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ expressions [ 1 ]] Ġ= Ġleft Part [ 1 ]. to U Short (). inv () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( left Part [ 1 ]. is Letter ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ left Part [ 1 ]] ?. let Ġ{ Ġvalue Ġ-> Ġmap [ expressions [ 1 ]] Ġ= Ġvalue . inv () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexample : Ġdd ĠOR Ġdo Ġ-> Ġdp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġval 1 : ĠU Short ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġval 2 : ĠU Short ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Part [ 0 ]. isNumber ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval 1 Ġ= Ġleft Part [ 0 ]. to U Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( left Part [ 0 ]. is Letter ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval 1 Ġ= Ġmap [ left Part [ 0 ]] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Part [ 2 ]. isNumber ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval 2 Ġ= Ġleft Part [ 2 ]. to U Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( left Part [ 2 ]. is Letter ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval 2 Ġ= Ġmap [ left Part [ 2 ]] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( val 1 Ġ!= Ġnull Ġ&& Ġval 2 Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( left Part [ 1 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" AND " Ġ-> Ġmap [ expressions [ 1 ]] Ġ= Ġval 1 Ġand Ġval 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" OR " Ġ-> Ġmap [ expressions [ 1 ]] Ġ= Ġval 1 Ġor Ġval 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" L SHIFT " Ġ-> Ġmap [ expressions [ 1 ]] Ġ= Ġval 1 Ġshl Ġval 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" R SHIFT " Ġ-> Ġmap [ expressions [ 1 ]] Ġ= Ġval 1 Ġshr Ġval 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġmap . filter Ġ{ Ġit . key Ġin Ġwire sTo Return Ġ} Ċ } Ċ Ċ private Ġin fix Ġfun ĠU Short . sh l ( shift : ĠU Short ): ĠU Short Ġ= Ġ( this . toInt () Ġshl Ġshift . toInt ()). to U Short () Ċ Ċ private Ġin fix Ġfun ĠU Short . shr ( shift : ĠU Short ): ĠU Short Ġ= Ġ( this . toInt () Ġshr Ġshift . toInt ()). to U Short () Ċ