package Ġio . github . ps he g ger . a oc . y 2 0 1 5 Ċ Ċ import Ġio . github . ps he g ger . a oc . common . Base Solver Ċ Ċ class ĠY 2 0 1 5 D 7 Ġ: ĠBase Solver () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġyear Ġ= Ġ 2 0 1 5 ĊĠĠĠ Ġoverride Ġval Ġday Ġ= Ġ 7 ĊĊĠĠĠ Ġoverride Ġfun Ġpart 1 (): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcircuit Ġ= Ġparse Input () ĊĠĠĠĠĠĠĠ Ġcircuit . em ulate () ĊĠĠĠĠĠĠĠ Ġreturn Ġcircuit [" a "] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpart 2 (): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcircuit Ġ= Ġparse Input () ĊĠĠĠĠĠĠĠ Ġcircuit . em ulate () ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġcircuit [" a "] Ġ?: Ġerror (" a Ġis Ġmissing ") ĊĠĠĠĠĠĠĠ Ġcircuit . reset () ĊĠĠĠĠĠĠĠ Ġcircuit . override Wire (" b ", Ġa ) ĊĠĠĠĠĠĠĠ Ġcircuit . em ulate () ĊĠĠĠĠĠĠĠ Ġreturn Ġcircuit [" a "] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Input () Ġ= Ġread Input Ġ{ ĊĠĠĠĠĠĠĠ ĠCircuit ( read Lines (). map Ġ{ ĠInstruction . parse String ( it . trim ()) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠCircuit ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinstructions : ĠList < Instruction >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġwire s : ĠMutable Map < String , ĠInt > Ġ= Ġempty Map < String , ĠInt >(). to Mutable Map () ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġremaining Instructions Ġ= Ġinstructions . indices . to Mutable Set () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġoverrides Ġ= Ġempty Map < String , ĠInt >(). to Mutable Map () ĊĊĠĠĠĠĠĠĠ Ġfun Ġem ulate () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( remaining Instructions . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( instruction Index Ġin Ġremaining Instructions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( instructions [ instruction Index ]. apply ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Instructions . remove ( instruction Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġoverride Wire ( wire Name : ĠString , Ġsignal Strength : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwire s [ wire Name ] Ġ= Ġsignal Strength ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverrides [ wire Name ] Ġ= Ġsignal Strength ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwire s . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverrides . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Instructions . addAll ( instructions . indices ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġget ( wire Name : ĠString ) Ġ= Ġwire s [ wire Name ] ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġset ( wire Name : ĠString , Ġsignal Strength : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwire s [ wire Name ] Ġ= Ġoverrides [ wire Name ] Ġ?: Ġsignal Strength ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsealed Ġclass ĠOper and Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠSignal ( private Ġval Ġstrength : ĠInt ) Ġ: ĠOper and () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Signal Strength ( circuit : ĠCircuit ): ĠInt Ġ= Ġstrength ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠWire ( private Ġval Ġname : ĠString ) Ġ: ĠOper and () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Signal Strength ( circuit : ĠCircuit ): ĠInt ? Ġ= Ġcircuit [ name ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġget Signal Strength ( circuit : ĠCircuit ): ĠInt ? ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġparse String ( str : ĠString ) Ġ= Ġstr . toInt OrNull ()?. let Ġ{ ĠSignal ( it ) Ġ} Ġ?: ĠWire ( str ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsealed Ġclass ĠInstruction ( protected Ġopen Ġval Ġresult Wire : ĠString ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠAssign ( private Ġval Ġop : ĠOper and , Ġoverride Ġval Ġresult Wire : ĠString ) Ġ: ĠInstruction ( result Wire ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( circuit : ĠCircuit ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġop . get Signal Strength ( circuit ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircuit [ result Wire ] Ġ= Ġv ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠAnd ( private Ġval Ġop 1 : ĠOper and , Ġprivate Ġval Ġop 2 : ĠOper and , Ġoverride Ġval Ġresult Wire : ĠString ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInstruction ( result Wire ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( circuit : ĠCircuit ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġop 1 . get Signal Strength ( circuit ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 2 Ġ= Ġop 2 . get Signal Strength ( circuit ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircuit [ result Wire ] Ġ= Ġ( v 1 Ġand Ġv 2 ) Ġand ĠBIT _ MASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠL Shift ( private Ġval Ġop 1 : ĠOper and , Ġprivate Ġval Ġop 2 : ĠOper and , Ġoverride Ġval Ġresult Wire : ĠString ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInstruction ( result Wire ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( circuit : ĠCircuit ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġop 1 . get Signal Strength ( circuit ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 2 Ġ= Ġop 2 . get Signal Strength ( circuit ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircuit [ result Wire ] Ġ= Ġ( v 1 Ġshl Ġv 2 ) Ġand ĠBIT _ MASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠR Shift ( private Ġval Ġop 1 : ĠOper and , Ġprivate Ġval Ġop 2 : ĠOper and , Ġoverride Ġval Ġresult Wire : ĠString ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInstruction ( result Wire ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( circuit : ĠCircuit ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġop 1 . get Signal Strength ( circuit ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 2 Ġ= Ġop 2 . get Signal Strength ( circuit ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircuit [ result Wire ] Ġ= Ġ( v 1 Ġshr Ġv 2 ) Ġand ĠBIT _ MASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠOr ( private Ġval Ġop 1 : ĠOper and , Ġprivate Ġval Ġop 2 : ĠOper and , Ġoverride Ġval Ġresult Wire : ĠString ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInstruction ( result Wire ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( circuit : ĠCircuit ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġop 1 . get Signal Strength ( circuit ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 2 Ġ= Ġop 2 . get Signal Strength ( circuit ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircuit [ result Wire ] Ġ= Ġ( v 1 Ġor Ġv 2 ) Ġand ĠBIT _ MASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠNot ( private Ġval Ġop : ĠOper and , Ġoverride Ġval Ġresult Wire : ĠString ) Ġ: ĠInstruction ( result Wire ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( circuit : ĠCircuit ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġop . get Signal Strength ( circuit ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircuit [ result Wire ] Ġ= Ġv . inv () Ġand ĠBIT _ MASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġapply ( circuit : ĠCircuit ): ĠBoolean ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġparse String ( str : ĠString ): ĠInstruction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsers Ġ= ĠlistOf < Pair < Regex , Ġ( List < String >) Ġ-> ĠInstruction >>( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( and Regex ) Ġ{ Ġgroups Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnd ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOper and . parse String ( groups [ 1 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOper and . parse String ( groups [ 2 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroups [ 3 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( or Regex ) Ġ{ Ġgroups Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOr ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOper and . parse String ( groups [ 1 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOper and . parse String ( groups [ 2 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroups [ 3 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( l Shift Regex ) Ġ{ Ġgroups Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL Shift ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOper and . parse String ( groups [ 1 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOper and . parse String ( groups [ 2 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroups [ 3 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( r Shift Regex ) Ġ{ Ġgroups Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR Shift ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOper and . parse String ( groups [ 1 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOper and . parse String ( groups [ 2 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroups [ 3 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( not Regex ) Ġ{ Ġgroups Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNot ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOper and . parse String ( groups [ 1 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroups [ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( assign Regex ) Ġ{ Ġgroups Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssign ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOper and . parse String ( groups [ 1 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroups [ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( regex , Ġconst ) Ġ= Ġparsers . first Ġ{ Ġit . first . matches ( str ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroups Ġ= Ġ( regex . match Ent ire ( str ) Ġ?: Ġerror (" This Ġshould Ġnever Ġhappen ")). group Values ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconst ( groups ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBIT _ MASK Ġ= Ġ 0 xFFFF ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġand Regex Ġ= Ġ"( . +) ĠAND Ġ(. +) Ġ-> Ġ( \\ w +) ". to Regex () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġor Regex Ġ= Ġ"( . +) ĠOR Ġ(. +) Ġ-> Ġ( \\ w +) ". to Regex () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġl Shift Regex Ġ= Ġ"( . +) ĠL SHIFT Ġ(. +) Ġ-> Ġ( \\ w +) ". to Regex () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġr Shift Regex Ġ= Ġ"( . +) ĠR SHIFT Ġ(. +) Ġ-> Ġ( \\ w +) ". to Regex () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnot Regex Ġ= Ġ" NOT Ġ(. +) Ġ-> Ġ( \\ w +) ". to Regex () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġassign Regex Ġ= Ġ"( . +) Ġ-> Ġ( \\ w +) ". to Regex () ĊĠĠĠ Ġ} Ċ } Ċ