package Ġnet . o leg g . a oc . year 2 0 1 7 . day 2 3 Ċ Ċ import Ġnet . o leg g . a oc . so med ay . Some Day Ċ import Ġnet . o leg g . a oc . year 2 0 1 7 . Day Of 2 0 1 7 Ċ import Ġjava . math . BigInteger Ċ Ċ /** Ċ Ġ* ĠSee Ġ[ Year Ġ 2 0 1 7 , ĠDay Ġ 2 3 ]( https :// ad vent of code . com / 2 0 1 7 / day / 2 3 ) Ċ Ġ*/ Ċ object ĠDay 2 3 Ġ: ĠDay Of 2 0 1 7 ( 2 3 ) Ġ{ ĊĠ Ġoverride Ġfun Ġfirst ( data : ĠString ): ĠAny ? Ġ{ ĊĠĠĠ Ġval Ġops Ġ= Ġdata ĊĠĠĠĠĠ Ġ. trim () ĊĠĠĠĠĠ Ġ. lines () ĊĠĠĠĠĠ Ġ. map Ġ{ Ġit . split (" Ġ") Ġ} ĊĊĠĠĠ Ġvar Ġposition Ġ= Ġ 0 ĊĠĠĠ Ġval Ġregs Ġ= Ġmutable Map Of < String , ĠBigInteger >() ĊĠĠĠ Ġvar Ġmul s Ġ= Ġ 0 ĊĊĠĠĠ Ġwhile Ġ( position Ġin Ġops . indices ) Ġ{ ĊĠĠĠĠĠ Ġval Ġop Ġ= Ġops [ position ] ĊĠĠĠĠĠ Ġwhen Ġ( op [ 0 ]) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" set " Ġ-> Ġregs [ op [ 1 ]] Ġ= Ġextract ( regs , Ġop [ 2 ]) ĊĠĠĠĠĠĠĠ Ġ" sub " Ġ-> Ġregs [ op [ 1 ]] Ġ= Ġextract ( regs , Ġop [ 1 ]) Ġ- Ġextract ( regs , Ġop [ 2 ]) ĊĠĠĠĠĠĠĠ Ġ" mul " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġregs [ op [ 1 ]] Ġ= Ġextract ( regs , Ġop [ 1 ]) Ġ* Ġextract ( regs , Ġop [ 2 ]); Ġmul s Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ" j nz " Ġ-> Ġif Ġ( extract ( regs , Ġop [ 1 ]) Ġ!= ĠBigInteger . ZERO ) Ġposition Ġ+= Ġ( extract ( regs , Ġop [ 2 ]). toInt () Ġ- Ġ 1 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġposition Ġ+= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġmul s ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġsecond ( data : ĠString ): ĠAny ? Ġ{ ĊĠĠĠ Ġval Ġops Ġ= Ġdata ĊĠĠĠĠĠ Ġ. trim () ĊĠĠĠĠĠ Ġ. lines () ĊĠĠĠĠĠ Ġ. map Ġ{ Ġit . split (" Ġ") Ġ} ĊĊĠĠĠ Ġvar Ġposition Ġ= Ġ 0 ĊĠĠĠ Ġval Ġregs Ġ= Ġmutable Map Of (" a " Ġto ĠBigInteger . ONE ) ĊĊĠĠĠ Ġwhile Ġ( position Ġin Ġops . indices ) Ġ{ ĊĠĠĠĠĠ Ġval Ġop Ġ= Ġops [ position ] ĊĠĠĠĠĠ Ġwhen Ġ( op [ 0 ]) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" set " Ġ-> Ġregs [ op [ 1 ]] Ġ= Ġextract ( regs , Ġop [ 2 ]) ĊĠĠĠĠĠĠĠ Ġ" sub " Ġ-> Ġregs [ op [ 1 ]] Ġ= Ġextract ( regs , Ġop [ 1 ]) Ġ- Ġextract ( regs , Ġop [ 2 ]) ĊĠĠĠĠĠĠĠ Ġ" mul " Ġ-> Ġregs [ op [ 1 ]] Ġ= Ġextract ( regs , Ġop [ 1 ]) Ġ* Ġextract ( regs , Ġop [ 2 ]) ĊĠĠĠĠĠĠĠ Ġ" j nz " Ġ-> Ġif Ġ( extract ( regs , Ġop [ 1 ]) Ġ!= ĠBigInteger . ZERO ) Ġposition Ġ+= Ġ( extract ( regs , Ġop [ 2 ]). toInt () Ġ- Ġ 1 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġposition Ġ+= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġextract ( regs , Ġ" h ") ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġextract ( map : ĠMap < String , ĠBigInteger >, Ġfield : ĠString ): ĠBigInteger Ġ{ ĊĠĠĠ Ġreturn Ġfield . to BigInteger OrNull () Ġ?: Ġmap . get OrDefault ( field , ĠBigInteger . ZERO ) ĊĠ Ġ} Ċ } Ċ Ċ fun Ġmain () Ġ= ĠSome Day . main ify ( Day 2 3 ) Ċ