import Ġutils . Grid Ċ import Ġutils . Parser Ċ import Ġutils . Solution Ċ import Ġutils . wrap Ċ Ċ fun Ġmain () Ġ{ ĊĠ ĠDay 2 5 Func . run () Ċ } Ċ Ċ object ĠDay 2 5 Func Ġ: ĠSolution < Grid >() Ġ{ ĊĠ Ġoverride Ġval Ġname Ġ= Ġ" day 2 5 " ĊĊĠ Ġprivate Ġconst Ġval ĠEMPTY Ġ= Ġ 0 ĊĠ Ġprivate Ġconst Ġval ĠE AST Ġ= Ġ 1 ĊĠ Ġprivate Ġconst Ġval ĠS OUT H Ġ= Ġ 2 ĊĊĠ Ġoverride Ġval Ġparser Ġ= ĠParser Ġ{ Ġinput Ġ-> Ġinput ĊĠĠĠ Ġ. replace ('.', Ġ' 0 ') ĊĠĠĠ Ġ. replace (' >', Ġ' 1 ') ĊĠĠĠ Ġ. replace (' v ', Ġ' 2 ') ĊĠ Ġ}. map Ġ{ ĠGrid . single Digits ( it ) Ġ} ĊĊĠ Ġprivate Ġfun Ġtry Move ( grid : ĠGrid , Ġtype : ĠInt ): ĠGrid Ġ{ ĊĠĠĠ Ġval Ġx Axis Ġ= Ġtype Ġ== ĠE AST ĊĠĠĠ Ġreturn Ġgrid . map Ġ{ Ġcoord , Ġvalue Ġ-> ĊĠĠĠĠĠ Ġif Ġ( value Ġ== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġmove Ġif Ġnext Ġis Ġempty ĊĠĠĠĠĠĠĠ Ġval Ġto X Ġ= Ġif Ġ( xAxis ) Ġ( coord . x Ġ+ Ġ 1 ). wrap ( grid . width ) Ġelse Ġcoord . x ĊĠĠĠĠĠĠĠ Ġval Ġto Y Ġ= Ġif Ġ(! xAxis ) Ġ( coord . y Ġ+ Ġ 1 ). wrap ( grid . height ) Ġelse Ġcoord . y ĊĠĠĠĠĠĠĠ Ġif Ġ( grid [ to X ][ to Y ] Ġ== ĠEMPTY ) ĠEMPTY Ġelse Ġtype ĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( value Ġ== ĠEMPTY ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfrom X Ġ= Ġif Ġ( xAxis ) Ġ( coord . x Ġ- Ġ 1 ). wrap ( grid . width ) Ġelse Ġcoord . x ĊĠĠĠĠĠĠĠ Ġval Ġfrom Y Ġ= Ġif Ġ(! xAxis ) Ġ( coord . y Ġ- Ġ 1 ). wrap ( grid . height ) Ġelse Ġcoord . y ĊĠĠĠĠĠĠĠ Ġif Ġ( grid [ from X ][ from Y ] Ġ== Ġtype ) Ġtype Ġelse ĠEMPTY ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġstep ( grid : ĠGrid ): ĠGrid Ġ{ ĊĠĠĠ Ġreturn Ġtry Move ( try Move ( grid , ĠE AST ), ĠS OUT H ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġpart 1 ( input : ĠGrid ): ĠNumber ? Ġ{ ĊĠĠĠ Ġreturn Ġgenerate Sequence ( Grid . EMPTY Ġto Ġinput ) Ġ{ Ġit . second Ġto Ġstep ( it . second ) Ġ} ĊĠĠĠĠĠ Ġ. take While Ġ{ Ġit . first Ġ!= Ġit . second Ġ} ĊĠĠĠĠĠ Ġ. count () ĊĠ Ġ} Ċ } Ċ