package Ġad vent of code . y 2 0 1 8 Ċ Ċ import Ġad vent of code . Ad vent Solution Ċ import Ġad vent of code . solve Ċ Ċ fun Ġmain () Ġ= ĠDay 2 4 . solve () Ċ Ċ object ĠDay 2 4 Ġ: ĠAd vent Solution ( 2 0 1 8 , Ġ 2 4 , Ġ" Imm une ĠSystem ĠSimulator Ġ 2 0 XX ") Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġsolve Part One ( input : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( im mune , Ġdisease ) Ġ= Ġparse ( input ). chunk ed ( 1 0 ). toList () ĊĊĠĠĠĠĠĠĠ Ġval Ġ( rem I , Ġrem D ) Ġ= Ġrun Combat ( im mune , Ġdisease ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmax Of ( rem I , Ġrem D ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsolve Part Two ( input : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( im mune , Ġdisease ) Ġ= Ġparse ( input ). chunk ed ( 1 0 ). toList () ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġ 6 1 Ġ// binary Ġsearch Ġrun Ġby Ġhand Ġfor Ġnow ĊĠĠĠĠĠĠĠ Ġval Ġ( rem I , Ġ_) Ġ= Ġrun Combat ( im mune . map Ġ{ Ġit . copy ( damage Ġ= Ġit . damage Ġ+ Ġx ) Ġ}, Ġdisease ) ĊĠĠĠĠĠĠĠ Ġreturn Ġrem I ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun Combat ( im mune : ĠList < Group >, Ġdisease : ĠList < Group >): ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( im mune . any Ġ{ Ġit . count Ġ> Ġ 0 Ġ} Ġ&& Ġdisease . any Ġ{ Ġit . count Ġ> Ġ 0 Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( select Targets ( im mune , Ġdisease ) Ġ+ Ġselect Targets ( d isease , Ġim mune )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Descending Ġ{ Ġit . first . initi ative Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( att , Ġdef ) Ġ-> Ġatt . deal Damage ( def ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( im mune . sum Of ( Group :: count ), Ġdisease . sum Of ( Group :: count )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġselect Targets ( attack ers : ĠList < Group >, Ġdef enders : ĠList < Group >): ĠList < Pair < Group , ĠGroup >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalid Targets Ġ= Ġdef enders . filter Ġ{ Ġit . count Ġ> Ġ 0 Ġ}. to Mutable Set () ĊĠĠĠĠĠĠĠ Ġreturn Ġattack ers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted With ( compare By Descending ( Group :: effective Power ). then By Descending ( Group :: initi ative )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġattacker Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattacker . choose Target ( valid Targets )?. let Ġ{ Ġtarget Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Targets Ġ-= Ġtarget ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattacker Ġto Ġtarget ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġdata Ġclass ĠGroup ( ĊĠĠĠĠĠĠĠ Ġvar Ġcount : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġhp : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġweak : ĠSet < Damage >, ĊĠĠĠĠĠĠĠ Ġval Ġim mune : ĠSet < Damage >, ĊĠĠĠĠĠĠĠ Ġval Ġdamage : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġtype : ĠDamage , ĊĠĠĠĠĠĠĠ Ġval Ġiniti ative : ĠInt Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġeffective Power () Ġ= Ġcount Ġ* Ġdamage ĊĊĠĠĠ Ġfun Ġchoose Target ( targets : ĠIterable < Group >): ĠGroup ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtargets . sorted With ( compare By Descending ( Group :: effective Power ). then By Descending ( Group :: initi ative )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. max By OrNull ( this :: calc Damage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take Unless Ġ{ Ġcalc Damage ( it ) Ġ== Ġ 0 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdeal Damage ( target : ĠGroup ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtarget . count Ġ-= Ġmin Of ( calc Damage ( target ) Ġ/ Ġtarget . hp , Ġtarget . count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalc Damage ( target : ĠGroup ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġtarget . im mune Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġtarget . weak Ġ-> Ġeffective Power () Ġ* Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġeffective Power () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ private Ġenum Ġclass ĠDamage Ġ{ ĠSl ashing , ĠBl udge oning , ĠC old , ĠFire , ĠRad iation Ġ} Ċ Ċ private Ġfun ĠString . to Damage Type () Ġ= ĠDamage . valueOf ( replace First Char ( Char :: title case )) Ċ Ċ private Ġfun Ġparse ( input : ĠString ): ĠSequence < Group > Ġ{ ĊĠĠĠ Ġval Ġregex Ġ= Ġ"( \\ d +) Ġunits Ġeach Ġwith Ġ( \\ d +) Ġhit Ġpoints (.* ) Ġwith Ġan Ġattack Ġthat Ġdoes Ġ( \\ d +) Ġ( .* ) Ġdamage Ġat Ġiniti ative Ġ( \\ d +) ". to Regex () ĊĠĠĠ Ġreturn Ġinput ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. line Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġregex . match Ent ire ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . de structured Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( c , Ġh , Ġimm , Ġd , Ġt , Ġi ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweak Ġ= Ġimm . parse Imm unity List (" weak ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġim mune Ġ= Ġimm . parse Imm unity List (" im mune ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGroup ( c . toInt (), Ġh . toInt (), Ġweak , Ġim mune , Ġd . toInt (), Ġt . to Damage Type (), Ġi . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠString . parse Imm unity List ( modifier : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġsubstring After ("$ modifier Ġto Ġ", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring Before (' ; ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim (' Ġ', Ġ') ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. split To Sequence (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotBlank () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to Damage Type () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet ()