package Ġorg . kot rix . discrete Ċ Ċ fun Ġ< T > ĠList < T >. cart esian Product ( repeat : ĠInt Ġ= Ġ 1 ) Ġ= ĊĠĠĠĠĠĠĠ Ġc Product (* Array ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( repeat Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cartesian ĠProduct Ġoperation Ġcan Ġonly Ġbe Ġapplied Ġa Ġpositive Ġnumber Ġof Ġtimes " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġthis Ġ}) Ċ Ċ fun Ġ< T > ĠList < T >. cart esian Product ( var arg Ġlists : ĠList < T >) Ġ= ĊĠĠĠĠĠĠĠ Ġc Product ( this , Ġ* lists ) Ċ Ċ private Ġfun Ġ< T > Ġc Product ( var arg Ġlists : ĠList < T >): ĠSequence < List < T >> Ġ= Ġsequence Ġ{ ĊĠĠĠ Ġrequire ( lists . map Ġ{ Ġit . size . to Long () Ġ}. reduce ( Long :: times ) Ġ<= ĠInt . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Cartesian ĠProduct Ġcan Ġnot Ġproduce Ġresults Ġwho 's Ġsize Ġexceed ĠInt . MAX _ VALUE " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġnum Ġ= Ġlists . size ĊĠĠĠ Ġval Ġlengths Ġ= Ġmutable ListOf < Int >() ĊĠĠĠ Ġval Ġremaining Ġ= Ġmutable ListOf ( 1 ) ĊĊĠĠĠ Ġlists . reversed (). forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġlengths . add ( 0 , Ġit . size ) ĊĠĠĠĠĠĠĠ Ġremaining . add ( 0 , Ġit . size Ġ* Ġremaining [ 0 ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġn Ġ= Ġremaining . remove At ( 0 ) ĊĊĠĠĠ Ġ( 0 Ġuntil Ġn ). forEach Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġmutable ListOf < T >() ĊĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġnum ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġi Ġ/ Ġremaining [ it ] Ġ% Ġlengths [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret . add ( lists [ it , Ġe ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġyield ( ret . toList ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġoperator Ġfun Ġ< T > ĠArray < out ĠList < T >> . get ( r : ĠInt , Ġc : ĠInt ): ĠT Ġ= Ġthis [ r ][ c ] Ċ