package Ġcom . cur tis lb . ad vent of code . year 2 0 2 1 . day 0 8 . display Ċ Ċ import Ġcom . cur tis lb . ad vent of code . common . math . digits ToInt Ċ Ċ /** Ċ Ġ* ĠA Ġnumerical Ġseven - segment Ġdisplay Ġwhose Ġsignal Ġwire s Ġhave Ġbeen Ġmixed Ġup . Ċ Ġ* Ċ Ġ* Ġ@ param Ġdisplay String ĠA Ġstring Ġrepresenting Ġthe Ġstate Ġand Ġoutput Ġof Ġthe Ġdisplay . ĠThis Ġstring Ġmust Ċ Ġ* Ġ Ġbe Ġof Ġthe Ġform Ġ`" $ digit A Ġ$ digit B Ġ... Ġ$ digit G Ġ| Ġ$ output A Ġ..." `, Ġwere Ġeach Ġ` digit X ` Ġrepresents Ġthe Ċ Ġ* Ġ Ġ[ Signal Pattern ] Ġfor Ġa Ġdifferent Ġdecimal Ġdigit Ġand Ġeach Ġ` output X ` Ġrepresents Ġthe Ġpattern Ġfor Ġa Ċ Ġ* Ġ Ġsingle Ġdigit Ġof Ġthe Ġdisplay 's Ġoutput . Ċ Ġ* Ċ Ġ* Ġ@ throws ĠIllegalArgumentException ĠIf Ġthe Ġdisplay Ġstring Ġdoes Ġnot Ġmatch Ġthe Ġrequired Ġformat . Ċ Ġ*/ Ċ class ĠSe ven Segment Display ( display String : ĠString ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSignal Ġpatterns Ġfor Ġeach Ġdecimal Ġdigit Ġfrom Ġ 0 Ġto Ġ 9 , Ġin Ġno Ġparticular Ġorder . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġdigit Patterns : ĠList < Signal Pattern > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSignal Ġpatterns Ġfor Ġthe Ġdecimal Ġdigits Ġof Ġthe Ġdisplay Ġoutput , Ġin Ġbig - endian Ġorder . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġoutput Patterns : ĠList < Signal Pattern > ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatch Result Ġ= ĠDISPLAY _ REGEX . match Ent ire ( display String ) ĊĠĠĠĠĠĠĠ Ġrequire ( match Result Ġ!= Ġnull ) Ġ{ Ġ" Malformed Ġdisplay Ġstring : Ġ$ display String " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ( digit Patterns String , Ġoutput Patterns String ) Ġ= Ġmatch Result . de structured ĊĠĠĠĠĠĠĠ Ġdigit Patterns Ġ= Ġdigit Patterns String . to Signal Patterns () ĊĠĠĠĠĠĠĠ Ġoutput Patterns Ġ= Ġoutput Patterns String . to Signal Patterns () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġmap Ġfrom Ġeach Ġpossible Ġsignal Ġpattern Ġfor Ġthis Ġdisplay Ġto Ġthe Ġdigit Ġthat Ġit Ġrepresents . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġdigit Mapping : ĠMap < Signal Pattern , ĠInt > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmapping Ġ= Ġmutable Map Of < Signal Pattern , ĠInt >() ĊĠĠĠĠĠĠĠ Ġval Ġknown Patterns Ġ= ĠMutable List ( 1 0 ) Ġ{ ĠSignal Pattern . NONE Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠGroup Ġpatterns Ġby Ġtheir Ġwire / segment Ġcounts ĊĠĠĠĠĠĠĠ Ġval Ġpattern sBy Wire Count Ġ= Ġdigit Patterns . groupBy Ġ{ Ġit . count W ires () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIdent ify Ġdigits Ġwith Ġunique Ġsegment Ġcounts Ġ( 1 , Ġ 4 , Ġ 7 , Ġand Ġ 8 ) ĊĠĠĠĠĠĠĠ ĠUNIQUE _ COUNT S _ MAP . forEach Ġ{ Ġ( wire Count , Ġdigit ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġpattern Ġexists Ġand Ġis Ġunique ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpatterns Ġ= Ġpattern sBy Wire Count [ wire Count ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" No Ġpattern Ġfor Ġdigit : Ġ$ digit ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( patterns . size Ġ== Ġ 1 ) Ġ{ Ġ" Multiple Ġpatterns Ġfor Ġdigit Ġ$ digit : Ġ$ patterns " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġto Ġmapping Ġand Ġto Ġthe Ġlist Ġof Ġknown Ġdigit Ġpatterns Ġ( for Ġlater Ġde duction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= Ġpatterns . single () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapping [ pattern ] Ġ= Ġdigit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġknown Patterns [ digit ] Ġ= Ġpattern ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIdent ify Ġdigits Ġwith Ġfive Ġsegments Ġ( 2 , Ġ 3 , Ġand Ġ 5 ) ĊĠĠĠĠĠĠĠ Ġpattern sBy Wire Count [ 5 ]?. let Ġ{ Ġpatterns Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfour One Diff Ġ= Ġknown Patterns [ 4 ] Ġ- Ġknown Patterns [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatterns . forEach Ġ{ Ġpattern Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdigit Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġknown Patterns [ 1 ] Ġin Ġpattern Ġ-> Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfour One Diff Ġin Ġpattern Ġ-> Ġ 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmapping [ pattern ] Ġ= Ġdigit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIdent ify Ġdigits Ġwith Ġsix Ġsegments Ġ( 0 , Ġ 6 , Ġand Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġpattern sBy Wire Count [ 6 ]?. let Ġ{ Ġpatterns Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatterns . forEach Ġ{ Ġpattern Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdigit Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġknown Patterns [ 4 ] Ġin Ġpattern Ġ-> Ġ 9 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġknown Patterns [ 1 ] Ġin Ġpattern Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmapping [ pattern ] Ġ= Ġdigit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġmapping Ġcontains Ġexactly Ġone Ġpattern Ġfor Ġeach Ġdigit ĊĠĠĠĠĠĠĠ Ġcheck ( mapping . values . size Ġ== Ġ 1 0 Ġ&& Ġ( 0 .. 9 ). all Ġ{ Ġit Ġin Ġmapping . values Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Invalid Ġdigit Ġmapping : Ġ$ mapping " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmapping ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġdecoded Ġinteger Ġoutput Ġof Ġthis Ġdisplay . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException ĠIf Ġthe Ġdisplay Ġwas Ġinitialized Ġwith Ġincorrect Ġdigit Ġor Ġoutput ĊĠĠĠĠ Ġ* Ġ Ġpatterns , Ġmeaning Ġthe Ġoutput Ġcan 't Ġbe Ġdecoded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdecode Output (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Digits Ġ= Ġoutput Patterns . map Ġ{ Ġpattern Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdigit Mapping [ pattern ] Ġ?: Ġthrow ĠIllegalStateException (" Unrecognized Ġpattern : Ġ$ pattern ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput Digits . digits ToInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRegex Ġused Ġto Ġparse Ġthe Ġdigit Ġand Ġoutput Ġsub strings Ġfrom Ġa Ġdisplay Ġstring . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDISPLAY _ REGEX Ġ= ĠRegex (""" \ s *(( ?: [ a - z ]+ \ s *) +)\ s +\ |\ s + (( ?: [ a - z ]+ \ s *) +)\ s * """) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRegex Ġfor Ġthe Ġseparator Ġbetween Ġsignal Ġpatterns Ġin Ġa Ġdisplay Ġstring . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠP ATTERN _ SEPARATOR _ REGEX Ġ= ĠRegex (""" \ s + """) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠA Ġmap Ġfrom Ġeach Ġsegment Ġcount Ġthat Ġuniquely Ġidentifies Ġa Ġdigit Ġto Ġthat Ġdigit . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠUNIQUE _ COUNT S _ MAP Ġ= Ġmap Of ( 2 Ġto Ġ 1 , Ġ 4 Ġto Ġ 4 , Ġ 3 Ġto Ġ 7 , Ġ 7 Ġto Ġ 8 ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturns Ġa Ġlist Ġof Ġspace - separated Ġsignal Ġpatterns Ġcontained Ġin Ġthis Ġstring . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠString . to Signal Patterns (): ĠList < Signal Pattern > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrim (). split ( PATTERN _ SEPARATOR _ REGEX ). map Ġ{ ĠSignal Pattern . fromString ( it ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ