package Ġkom u . ad vent of code . a oc 2 0 1 7 Ċ Ċ import Ġkom u . ad vent of code . utils . Direction Ċ import Ġkom u . ad vent of code . utils . Point Ċ import Ġkom u . ad vent of code . utils . non Empty Lines Ċ Ċ fun Ġsp or ifica V irus 1 ( input : ĠString ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġinf ected Points Ġ= ĠV irus Map ( input . non Empty Lines ()) ĊĠĠĠ Ġvar Ġpoint Ġ= ĠPoint . ORIGIN ĊĠĠĠ Ġvar Ġdir Ġ= ĠDirection . UP ĊĠĠĠ Ġvar Ġin fe ctions Ġ= Ġ 0 ĊĊĠĠĠ Ġrepeat ( 1 0 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( inf ected Points [ point ] Ġ== ĠV irus State . INF ECT ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdir Ġ= Ġdir . right ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinf ected Points [ point ] Ġ= ĠV irus State . CLEAN ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdir Ġ= Ġdir . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinf ected Points [ point ] Ġ= ĠV irus State . INF ECT ED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin fe ctions ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpoint Ġ+= Ġdir ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġin fe ctions Ċ } Ċ Ċ fun Ġsp or ifica V irus 2 ( input : ĠString ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġinf ected Points Ġ= ĠV irus Map ( input . non Empty Lines ()) ĊĠĠĠ Ġvar Ġpoint Ġ= ĠPoint . ORIGIN ĊĠĠĠ Ġvar Ġdir Ġ= ĠDirection . UP ĊĠĠĠ Ġvar Ġin fe ctions Ġ= Ġ 0 ĊĊĠĠĠ Ġrepeat ( 1 0 0 0 0 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġinf ected Points [ point ] ĊĊĠĠĠĠĠĠĠ Ġdir Ġ= Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠV irus State . CLEAN Ġ-> Ġdir . left ĊĠĠĠĠĠĠĠĠĠĠĠ ĠV irus State . WE AK EN ED Ġ-> Ġdir ĊĠĠĠĠĠĠĠĠĠĠĠ ĠV irus State . INF ECT ED Ġ-> Ġdir . right ĊĠĠĠĠĠĠĠĠĠĠĠ ĠV irus State . FLAG GED Ġ-> Ġdir . op pos ite ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinf ected Points [ point ] Ġ= Ġstate . next ĊĊĠĠĠĠĠĠĠ Ġif Ġ( state . next Ġ== ĠV irus State . INF ECT ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin fe ctions ++ ĊĊĠĠĠĠĠĠĠ Ġpoint Ġ+= Ġdir ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġin fe ctions Ċ } Ċ Ċ private Ġenum Ġclass ĠV irus State Ġ{ ĊĠĠĠ ĠC LEAN , ĠWE AK EN ED , ĠINF ECT ED , ĠFLAG GED ; ĊĊĠĠĠ Ġval Ġnext : ĠV irus State ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġvalues ()[ ( ordinal Ġ+ Ġ 1 ) Ġ% Ġ 4 ] Ċ } Ċ Ċ private Ġclass ĠV irus Map ( lines : ĠList < String >) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġinf ected Points Ġ= Ġmutable Map Of < Point , ĠV irus State >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġlines . size Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġlines [ 0 ]. length Ġ/ Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġlines . forEach Indexed Ġ{ Ġy , Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . forEach Indexed Ġ{ Ġx , Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'# ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinf ected Points [ Point ( x Ġ- Ġdx , Ġy Ġ- Ġdy )] Ġ= ĠV irus State . INF ECT ED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( point : ĠPoint ) Ġ= Ġinf ected Points [ point ] Ġ?: ĠV irus State . CLEAN ĊĊĠĠĠ Ġoperator Ġfun Ġset ( point : ĠPoint , Ġstate : ĠV irus State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinf ected Points [ point ] Ġ= Ġstate ĊĠĠĠ Ġ} Ċ } ĊĊ