On se retrouve aujourd'hui pour la solution du précédent #KataOfTheWeek proposé par Jordan en début de semaine !

Ma solution perso en Kotlin avec une entrée et une sortie en Long. Cette solution est très basique et pas optimisée, je compte sur vous pour proposer quelque chose de mieux.

fun isNotValid(nbList: Array<String>): Boolean {
    val arrayTmp = nbList.clone()
    arrayTmp.reverse()
    arrayTmp.forEachIndexed { idx, elmt -> if (elmt > arrayTmp[idx + 1]) return false}
    return true
}

fun findFirstSmallestFromRight(nbToList: Array<String>, size: Int): Int {
    var i = size - 1
    while (i > 0) {
        if (nbToList[i] > nbToList[i - 1]) {
            break
        }
        i--
    }
    return i
}

fun swap(ar: Array<String>, i: Int, j: Int) {
    val temp = ar[i]
    ar[i] = ar[j]
    ar[j] = temp
}

fun findFirstSmallestDigitOnRight(min: Int, size: Int, nbToList: Array<String>): Int {
    val x = nbToList[min - 1].toInt()
    for (j in min + 1 until size) {
        if (nbToList[j] > x.toString() && nbToList[j] < nbToList[min]) {
            return j
        }
    }
    return min
}

fun findNext(nb: Long):Long {
    val nbToList = nb.toString().split("").filter { it.isNotEmpty() }.toTypedArray()
    val size = nbToList.size
    val isNotValid = isNotValid(nbToList)

    if (isNotValid) {
        print("Impossible")
        return -1
    }

    val firstSmallest = findFirstSmallestFromRight(nbToList, size)

    val secondSmallest = findFirstSmallestDigitOnRight(firstSmallest, size, nbToList)

    swap(nbToList, firstSmallest - 1, secondSmallest)

    nbToList.sort(firstSmallest, size)
    return nbToList.joinToString(separator = "").toLong()
}

Et les tests:

import org.junit.Assert.*
import org.junit.Test

class NexBigNumberTest {

    @Test
    fun isTrue_AssertTrue_True() {
        assertTrue(true)
    }

    @Test
    fun isFalse_AssertFalse_True() {
        assertFalse(false)
    }

    @Test
    fun basicTests() {
      assertEquals(21, findNext(12))
      assertEquals(531, findNext(513))
      assertEquals(2071, findNext(2017))
      assertEquals(-1, findNext(111))
      assertEquals(-1, findNext(531))
      assertEquals(441, findNext(414))
      assertEquals(414, findNext(144))
    }
}

Update : La solution ne semble pas satisfaire le test suivant assertEquals(21134, findNext(14321)) , pour corriger cela Nassim OUHENIA une solution en python :

from itertools import permutations

def findNext(number):    
    permutations_generator = 
    	(int(''.join(permutation)) for permutation in permutations(str(number)))
    bigger_permutations_generator = 
    	(permutation for permutation in permutations_generator if permutation>number)    
    return min(bigger_permutations_generator, default=-1)

A bientôt pour un nouveau #KataOfTheWeek !