package Ġio . github . k mak ma . ad vent of code . y 2 0 2 0 Ċ Ċ import Ġio . github . k mak ma . ad vent of code . utils . Day Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ ĠY 2 0 2 0 Day 1 9 (). solve And Print () Ċ } Ċ Ċ class ĠY 2 0 2 0 Day 1 9 Ġ: ĠDay ( 2 0 2 0 , Ġ 1 9 , Ġ" Monster ĠMessages ") Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrule List : ĠList < String > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmessages : ĠList < String > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġinput Lines : ĠList < String > ĊĊĊĠĠĠ Ġoverride Ġfun Ġinitialize Day () Ġ{ ĊĠĠĠĠĠĠĠ Ġinput Lines Ġ= Ġinput In String Lines () ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġinput Lines ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . isBlank () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. partition Ġ{ Ġline Ġ-> Ġ( line . startsWith (" a ") Ġ|| Ġline . startsWith (" b ")) Ġ} ĊĠĠĠĠĠĠĠ Ġmessages Ġ= Ġinput . first ĊĠĠĠĠĠĠĠ Ġrule List Ġ= Ġinput . second ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsolve Task 1 (): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcount Matches ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsolve Task 2 (): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcount Matches ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcount Matches ( special Rules : ĠBoolean ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrules Ġ= Ġrule List . map Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( no , Ġrule ) Ġ= Ġline . split (": Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno . toInt () Ġto Ġrule . split (" Ġ"). to Mutable List () ĊĠĠĠĠĠĠĠ Ġ}. toMap (). to Mutable Map () ĊĠĠĠĠĠĠĠ Ġreduce Rule ( rules , Ġ 1 1 , Ġspecial Rules ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( rule Ġin Ġrules . keys . filter Ġ{ Ġit Ġ!= Ġ 0 Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreduce Rule ( rules , Ġrule , Ġspecial Rules ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġregex Ġ= Ġ( rules [ 0 ] Ġ?: Ġerror (" missing Ġrule Ġno Ġ 0 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( StringBuilder ()) Ġ{ Ġsb , Ġs Ġ-> Ġsb . append ( s ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Regex () ĊĠĠĠĠĠĠĠ Ġvar Ġmatches Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( message Ġin Ġmessages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . matches ( regex )) Ġmatches ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmatches ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtoken Regex Ġ= ĠRegex (" """ [ ab ] """ ") ĊĊĠĠĠ Ġprivate Ġfun Ġreduce Rule ( rules : ĠMutable Map < Int , ĠMutable List < String >>, Ġrule No : ĠInt , Ġspecial Rules : ĠBoolean ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġrule : ĠMutable List < String > Ġ= Ġif Ġ( rule No Ġ== Ġ 1 1 Ġ&& Ġspecial Rules ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġassumption : Ġlongest Ġmessage Ġhas Ġ 8 8 Ġchars ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrule Ġ 1 1 Ġconsists Ġof Ġat Ġleast Ġ 4 Ġchars Ġ( 1 1 : Ġ 4 2 Ġ 3 1 Ġwith Ġ 4 2 Ġand Ġ 3 1 Ġat Ġleast Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġworst Ġcase Ġfor Ġ 1 1 : Ġ 4 2 Ġ 1 1 Ġ 3 1 Ġ-> Ġ 2 2 x 4 2 Ġand Ġ 2 2 x 3 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrules . remove ( rule No ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Rule Ġ= Ġmutable ListOf < String >(" (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 2 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Rule . addAll ( listOf (" (", Ġ" (", Ġ" 4 2 ", Ġ" )", Ġ" {$ i }", Ġ" (", Ġ" 3 1 ", Ġ" )", Ġ" {$ i }", Ġ" )", Ġ"| ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Rule . remove Last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Rule . add (" )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Rule ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrules . remove ( rule No ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Null OrEmpty () Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst (). matches ( token Regex ) Ġ-> Ġreplace All Ġ{ Ġit . substring ( 1 , Ġit . last Index ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ> Ġ 1 Ġ-> Ġapply Ġ{ Ġadd ( 0 , Ġ"(" ); Ġadd (" )") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( rule No Ġ== Ġ 8 Ġ&& Ġspecial Rules ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrule . add ("+ ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġold Rule ) Ġin Ġrules ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġold Rule . indexOf ( rule No . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( index Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Rule . remove At ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Rule . addAll ( index , Ġrule ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġold Rule . indexOf ( rule No . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ