package Ġno . u ib . inf 2 7 3 . extra Ċ Ċ import Ġno . u ib . inf 2 7 3 . Main Ċ import Ġkotlin . random . Random ĊĊ Ċ /** Ċ Ġ* ĠExchange Ġthe Ġelements Ġat Ġthe Ġtwo Ġgiven Ġindices . Ċ Ġ*/ Ċ fun ĠInt Array . exchange ( first : ĠInt , Ġsecond : ĠInt ) Ġ{ ĊĠĠĠ Ġ// we Ġdon 't Ġchange Ġthe Ġarray Ġso Ġdo Ġnothing ĊĠĠĠ Ġif Ġ( first Ġ!= Ġsecond ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// swap Ġthe Ġtwo Ġelements , Ġyes Ġthis Ġis Ġkotlin Ġmagic ĊĠĠĠĠĠĠĠ Ġthis [ first ] Ġ= Ġthis [ second ]. also Ġ{ Ġthis [ second ] Ġ= Ġthis [ first ] Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSwap Ġtwo Ġelements Ġwithin Ġthe Ġgiven Ġrange . ĠAllows Ġ[ from ] Ġto Ġbe Ġequal Ġto Ġ[ until ] Ċ Ġ*/ Ċ fun ĠInt Array . random ize Exchange ( from : ĠInt Ġ= Ġ 0 , Ġuntil : ĠInt Ġ= Ġsize , Ġrng : ĠRandom Ġ= ĠMain . rand ) Ġ{ ĊĠĠĠ Ġcheck ( from Ġ<= Ġuntil ) Ġ{ Ġ" From Ġis Ġstrictly Ġgreater Ġthan Ġuntil : Ġ$ from Ġ> Ġ$ until " Ġ} ĊĊĠĠĠ Ġ// Cannot Ġrandomize Ġan Ġempty Ġarray , Ġso Ġwe Ġjust Ġreturn ĊĠĠĠ Ġif Ġ( from Ġ!= Ġuntil ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// generate Ġtwo Ġindices Ġwithin Ġthe Ġsub - range Ġthen Ġswap Ġthem ĊĠĠĠĠĠĠĠ Ġexchange ( rng . nextInt ( from , Ġuntil ), Ġrng . nextInt ( from , Ġuntil )) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠRemove Ġexactly Ġ[ amount ] Ġfrom Ġthis Ġarray Ċ Ġ*/ Ċ fun ĠInt Array . filter ( un wanted : ĠInt , Ġamount : ĠInt ): ĠInt Array Ġ{ ĊĠĠĠ Ġreturn Ġfilter ( un wanted , ĠInt Array ( size Ġ- Ġamount ), Ġamount ) Ċ } Ċ Ċ /** Ċ Ġ* ĠFilter Ġout Ġthe Ġun wanted Ġinteger Ġand Ġprint Ġcollect Ġall Ġremaining Ġelements Ġin Ġ[ to ] Ċ Ġ* Ċ Ġ* Ġ@ return Ġ[ to ] Ċ Ġ*/ Ċ fun ĠInt Array . filter ( un wanted : ĠInt , Ġto : ĠInt Array , Ġmax Removed : ĠInt Ġ= ĠInteger . MAX _ VALUE ): ĠInt Array Ġ{ ĊĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġremoved Ġ= Ġ 0 ĊĠĠĠ Ġfor Ġ( e Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( e Ġ!= Ġun wanted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto [ index ++] Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(++ removed Ġ== Ġmax Removed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġto Ċ } Ċ Ċ /** Ċ Ġ* ĠInsert Ġ[ element ] Ġat Ġ[ index ], Ġpushing Ġeverything Ġright Ġof Ġ[ index ] Ġto Ġthe Ġright . ĠThe Ġelement Ġat Ġ[ IntArray . size ]` Ġ- Ġ 1 ` Ġwill Ġbe Ġremoved Ċ Ġ*/ Ċ fun ĠInt Array . insert ( index : ĠInt , Ġelement : ĠInt ) Ġ{ ĊĠĠĠ Ġthis . copy Into ( this , Ġindex Ġ+ Ġ 1 , Ġindex , Ġsize Ġ- Ġ 1 ) ĊĠĠĠ Ġthis [ index ] Ġ= Ġelement Ċ } Ċ Ċ /** Ċ Ġ* ĠAdapt ed Ġfrom Ġc - code Ġfound Ġ[ here ]( https :// www . ge eks forge eks . org / print - all - per mutations - of - a - string - with - duplicates - allowed - in - input - string /) Ċ Ġ*/ Ċ fun ĠInt Array . forEach Per mutation ( copy : ĠBoolean Ġ= Ġtrue , Ġaction : ĠInt Array . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġarr Ġ= Ġif Ġ( copy ) Ġthis . copyOf () Ġelse Ġthis ĊĊĠĠĠ Ġfun Ġfind Ce il ( arr : ĠInt Array , Ġfirst : ĠInt , Ġl : ĠInt , Ġh : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġceil Index Ġ= Ġl ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġl Ġ+ Ġ 1 .. h ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arr [ i ] Ġ> Ġfirst Ġ&& Ġarr [ i ] Ġ< Ġarr [ ceil Index ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġceil Index Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġceil Index ; ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġprintln (" finding Ġall Ġper mutations Ġof Ġarr Ġsize Ġ${ arr . size }: Ġ${ arr . content ToString () }") ĊĊĠĠĠ Ġ// ĠSort Ġthe Ġstring Ġin Ġincreasing Ġorder ĊĠĠĠ Ġarr . sort () ĊĊĠĠĠ Ġ// ĠPrint Ġper mutations Ġone Ġby Ġone ĊĠĠĠ Ġvar Ġis Finished Ġ= Ġfalse ; ĊĠĠĠ Ġwhile Ġ(! is Finished ) Ġ{ ĊĠĠĠĠĠĠĠ Ġarr . action () ĊĊĠĠĠĠĠĠĠ Ġvar Ġi : ĠInt Ġ= Ġsize Ġ- Ġ 2 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arr [ i ] Ġ< Ġarr [ i Ġ+ Ġ 1 ]) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ-- i ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġis Ġno Ġsuch Ġcharacter , Ġall ĊĠĠĠĠĠĠĠ Ġ// Ġare Ġsorted Ġin Ġde creasing Ġorder , ĊĠĠĠĠĠĠĠ Ġ// Ġmeans Ġwe Ġjust Ġprinted Ġthe Ġlast ĊĠĠĠĠĠĠĠ Ġ// Ġpermutation Ġand Ġwe Ġare Ġdone . ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Finished Ġ= Ġtrue ; ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġceil Ġof Ġ' first Ġchar ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġright Ġof Ġfirst Ġcharacter . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCe il Ġof Ġa Ġcharacter Ġis Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsmallest Ġcharacter Ġgreater ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthan Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġceil Index Ġ= Ġfind Ce il ( arr , Ġarr [ i ], Ġi Ġ+ Ġ 1 , Ġsize Ġ- Ġ 1 ); ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSwap Ġfirst Ġand Ġsecond Ġcharacters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarr . exchange ( i , Ġceil Index ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSort Ġthe Ġstring Ġon Ġright Ġof Ġ' first Ġchar ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarr . sort ( from Index Ġ= Ġi Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ