diff --git a/src/codewars/kata_next_bigger_number_same_digits.py b/src/codewars/kata_next_bigger_number_same_digits.py index 4ed4307..57e8802 100644 --- a/src/codewars/kata_next_bigger_number_same_digits.py +++ b/src/codewars/kata_next_bigger_number_same_digits.py @@ -1,22 +1,34 @@ def next_bigger(n): + # get number as digits in list digits = [int(x) for x in list(str(n))] + # find index of pivot. return -1 if there is no pivot, meaning number is alreadig biggest pivot = -1 for i in range(1, len(digits)): - if digits[-1] > digits[-2 * i]: - pivot = -2 * i + if digits[-i] > digits[-i - 1]: + pivot = -i - 1 break + if pivot == -1: return -1 + # find the smallest digit to the right that is bigger than the pivot right = digits[pivot + 1 :] - swamp = right.index(min(right)) - print(digits) - digits[pivot], digits[len(digits) - len(right) + swamp] = ( - right[swamp], + swap = right.index(min([x for x in right if x > digits[pivot]])) + + # swap pivot with found digit + digits[pivot], digits[len(digits) - len(right) + swap] = ( + right[swap], digits[pivot], ) - return digits + + # sort right side of new swapped pivot and replace it at the end + right = digits[pivot + 1 :] + right.sort() + digits[pivot + 1 :] = right + + # return number + return int("".join([str(x) for x in digits])) -print(next_bigger(534976)) +print(next_bigger(5113455566888)) diff --git a/tests/codewars/test_next_bigger_number_same_digits.py b/tests/codewars/test_next_bigger_number_same_digits.py index 9b5583d..a1793a5 100644 --- a/tests/codewars/test_next_bigger_number_same_digits.py +++ b/tests/codewars/test_next_bigger_number_same_digits.py @@ -8,4 +8,8 @@ def test_next_bigger(): assert next_bigger(2017) == 2071 assert next_bigger(414) == 441 assert next_bigger(144) == 414 - assert next_bigger(84876644310) == 86013446784 + assert next_bigger(1234567890) == 1234567908 + assert next_bigger(59884848459853) == 59884848483559 + assert next_bigger(7600201336) == 7600201363 + assert next_bigger(5113455566888) == 5113455568688 + assert next_bigger(4769560370633) == 4769560373036