package Ġgroup net . util Ċ Ċ import Ġorg . pa uk ov . combinator ics 3 . Generator Ċ Ċ /** Ċ Ġ* Ċ Ġ* Ġ@ author ĠAl mas ĠB aim ag amb et ov Ġ( al mas lvl @ gmail . com ) Ċ Ġ*/ Ċ Ċ /** Ċ Ġ* ĠThere Ġis Ġa Ġperformance Ġreason Ġto Ġrepresent Ġa Ġcombination Ġusing Ġa ĠList , Ċ Ġ* Ġrather Ġthan Ġa ĠSet . Ċ Ġ* ĠHowever , Ġall Ġcombinations Ġare Ġg ur ante ed Ġto Ġbe Ġsets . Ċ Ġ*/ Ċ type alias ĠCombin ation < T > Ġ= ĠList < T > Ċ Ċ /** Ċ Ġ* ĠA Ġk - combin ation Ġof Ġa Ġset ĠT Ġis Ġa Ġsubset Ġof Ġk Ġdistinct Ġelements Ġof ĠT . Ċ Ġ*/ Ċ fun Ġ< T > Ġcombinations Of ( elements : ĠCollection < T >, Ġrange : ĠInt Range ): ĠList < Combination < T >> Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠArrayList < Combination < T >>() ĊĊĠĠĠ Ġfor Ġ( k Ġin Ġrange ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . addAll ( Generator . combin ation ( elements ). simple ( k ). toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun Ġ< T > Ġcombinations 2 ( elements : ĠCollection < T >): ĠList < ĠPair < T , ĠT > Ġ> Ġ{ ĊĠĠĠ Ġreturn Ġcombinations Of ( elements , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . first () Ġto Ġit . last () Ġ} Ċ } Ċ Ċ fun Ġ< T > Ġcombinations Of ( elements : ĠCollection < T >, Ġcombination Size : ĠInt ): ĠList < Combination < T >> Ġ{ ĊĠĠĠ Ġreturn Ġcombinations Of ( elements , Ġcombination Size .. combin ation Size ) Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġpartition Ġof Ġa Ġset ĠT Ġis Ġa Ġset Ġof Ġnon - empty Ġsub sets Ġof ĠT Ċ Ġ* Ġsuch Ġthat Ġevery Ġelement Ġt Ġin ĠT Ġis Ġin Ġexactly Ġone Ġof Ġthese Ġsub sets . Ċ Ġ*/ Ċ fun Ġ< T > Ġpartition 2 ( elements : ĠCollection < T >): ĠList < ĠPair < List < T >, ĠList < T >> Ġ> Ġ{ ĊĠĠĠ Ġreturn Ġcombinations Of ( elements , Ġ 1 .. elements . size Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġto Ġ( elements Ġ- Ġit ) Ġ} Ċ } Ċ Ċ fun Ġ< T > Ġpartition 2 Lazy ( elements : ĠCollection < T >): ĠIterable < ĠPair < List < T >, ĠList < T >> Ġ> Ġ{ ĊĊĠĠĠ Ġreturn Ġobject Ġ: ĠIterable < Pair < List < T >, ĠList < T >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġiterator (): ĠIterator < Pair < List < T >, ĠList < T >>> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠIterator < Pair < List < T >, ĠList < T >>> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġgen : ĠIterator < List < T >> Ġ= ĠGenerator . combin ation ( elements ). simple ( index ). iterator () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġindex Ġ<= Ġelements . size Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠPair < List < T >, ĠList < T >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Set Ġ= Ġgen . next () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! gen . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgen Ġ= ĠGenerator . combin ation ( elements ). simple ( index ). iterator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleft Set Ġto Ġ( elements Ġ- Ġleft Set ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }