/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠAndrew ĠK re pp s Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . ask re pp s . non o gram . internal Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Sequence ] Ġof Ġ[ List ] s Ġof Ġspaces Ġto Ġinsert Ġbefore Ġthe Ġcells Ġcorresponding Ġto Ġeach Ġhint Ġvalue Ġthat Ċ Ġ* Ġrepresents Ġall Ġpossible Ġcombinations Ġof Ġspacing Ġthat Ġcan Ġbe Ġapplied Ġto Ġthe Ġ[ hints ] Ġin Ġthe Ġgiven Ġ[ line Size ]. Ċ Ġ*/ Ċ internal Ġclass ĠHint Spacing Generator ( private Ġval Ġhints : ĠList < Int >, Ġprivate Ġval Ġline Size : ĠInt ) Ġ: ĠSequence < List < Int >> Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġiterator () Ġ= ĠHint Spacing Iterator ( hints , Ġline Size ) Ċ } Ċ Ċ /** Ċ Ġ* ĠAn Ġ[ Iterator ] Ġthat Ġgenerates Ġthe Ġnext Ġset Ġof Ġsp ac ings Ġto Ġuse . Ċ Ġ* Ċ Ġ* ĠThis Ġcode Ġassumes Ġthe Ġhints Ġare Ġvalid Ġand Ġconsistent Ġw . r . t . Ġthe Ġrules Ġchecked Ġduring Ġpuzzle Ġinitialization . Ċ Ġ*/ Ċ internal Ġclass ĠHint Spacing Iterator ( private Ġval Ġhints : ĠList < Int >, Ġprivate Ġval Ġline Size : ĠInt ) Ġ: ĠIterator < List < Int >> Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcurrent Spacing Ġ= Ġmutable ListOf < Int >() ĊĠĠĠ Ġprivate Ġval Ġslack : ĠInt ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmax Hint Ġ= Ġhints . max OrNull () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġslack Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( max Hint Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Size Ġ- Ġhints . total Hint Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġdone Ġwhen Ġall Ġcells Ġare Ġshifted Ġto Ġthe Ġright Ġas Ġfar Ġas Ġpossible ĊĠĠĠ Ġoverride Ġfun Ġhas Next () Ġ= Ġcurrent Spacing . isEmpty () Ġ|| Ġcurrent Spacing . first () Ġ< Ġslack ĊĊĠĠĠ Ġoverride Ġfun Ġnext (): ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Spacing . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Spaces () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadvance Spaces () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Spacing . toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Spaces () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġstart Ġwith Ġcells Ġshifted Ġas Ġfar Ġto Ġthe Ġleft Ġas Ġpossible ĊĠĠĠĠĠĠĠ Ġcurrent Spacing . add ( 0 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġhints . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Spacing . add ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadvance Spaces () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġhints . indices . reversed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( min Spacing , Ġmax Spacing ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġfirst Ġhint Ġgroup Ġcan Ġbe Ġflush Ġwith Ġthe Ġleft Ġedge Ġof Ġthe Ġgrid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( 0 , Ġslack ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġother Ġhints Ġgroups Ġalways Ġhave Ġan Ġextra Ġspace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ( included Ġin Ġhints . total Hint Length , Ġnot Ġin Ġslack ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( 1 , Ġslack Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Spacing [ index ] Ġ< Ġmax Spacing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Spacing [ index ] ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Spacing [ index ] Ġ= Ġmin Spacing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( current Spacing . sum () Ġ+ Ġhints . sum () Ġ> Ġline Size ) ĊĠĠĠĠĠĠĠ Ġ// Ġskip Ġover Ġspace Ġcombinations Ġthat Ġwill Ġnot Ġfit Ġwithin Ġthe Ġline ĊĠĠĠ Ġ} Ċ } Ċ