import Ġjava . lang . Math . max Ċ Ċ class ĠSeries ( private Ġval Ġdigits : ĠString ) Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( digits . all Ġ{ Ġit . is Digit () Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget L argest Product ( span : ĠInt ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( span Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġrequire ( digits . length Ġ>= Ġspan ) ĊĊĠĠĠĠĠĠĠ Ġif ( digits . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcalculate Rec ( digits . map Ġ{ Ġit . intValue () Ġ}, Ġspan , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġcalculate Rec ( digits : ĠList < Int >, Ġspan : ĠInt , Ġmax So Far : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Product Ġ= Ġdigits . sub List ( 0 , Ġspan ). prod () ĊĠĠĠĠĠĠĠ Ġval Ġnew Max Ġ= Ġkotlin . math . max ( current Product , Ġmax So Far ) ĊĠĠĠĠĠĠĠ Ġif ( digits . size Ġ== Ġspan ) Ġ{ Ġ// since Ġwe Ġwon 't Ġbe Ġchecking Ġ' remain ders ' Ġof Ġthe Ġlist , Ġthe Ġend Ġcondition Ġis Ġsimply Ġwhen Ġthe Ġsize Ġis Ġthe Ġsame Ġas Ġthe Ġspan ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Max ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcalculate Rec ( digits . tail (), Ġspan , Ġnew Max ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ fun ĠChar . intValue () Ġ: ĠInt Ġ Ġ{ ĊĠĠĠ Ġif (! this . is Digit ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Char Ġ${ this } Ġis Ġnot Ġa Ġlegal ĠDEC Ġcharacter ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġthis . int Diff (' 0 ') Ċ } Ċ Ċ fun ĠChar . int Diff ( other : ĠChar ) Ġ= Ġthis . code Ġ- Ġother . code Ċ Ċ fun ĠList < Int >. prod () Ġ: ĠLong Ġ= Ġthis . fold ( 1 L ) Ġ{ product So Far , Ġitem Ġ-> Ġitem * product So Far } Ċ Ċ fun Ġ< T > ĠList < T >. tail () Ġ= Ġthis . sub List ( 1 , Ġthis . size ) Ċ