Cambie los índices, cree el siguiente número más alto utilizando los mismos 9 dígitos exactos presentados

Así que recibí un desafío que dice lo siguiente: “Diseñe un progtwig que tome como entrada un número de 9 dígitos donde ningún dígito aparezca dos veces y produzca como salida una disposición de los mismos 9 dígitos correspondientes al siguiente número más alto. Si no existe tal número , el algoritmo debería indicar esto. Entonces, por ejemplo, si la entrada es 781623954, la salida sería 781624359. ”

Entonces se me ocurrió esta idea de voltear los índices, así que verifique el último índice con el derecho anterior para ver cuál es más grande y compare, luego voltéelo si es necesario, pero por alguna razón, mi código no funciona. Solo hice el trabajo para verificar los últimos dos dígitos, no todos los dígitos, así que si puede ayudarme y comprobarlo por mí y si tiene alguna mejor idea sobre cómo abordar este problema, por favor comparta.

input = raw_input("Enter 9 Digits: ") x = 9 while x>0: x-=1 if input[8] > input[7]: temp = input[8] input[8] == input[7] input[7] == temp print input break 

No estoy convencido de que su enfoque de voltear dígitos esté garantizado para encontrar el siguiente número más alto (al menos no sin más controles)

Aquí hay una solución simple: simplemente incremente el número de entrada y verifique si se cumplen las condiciones o si no se puede encontrar ningún número.

set() se puede usar para obtener el conjunto de dígitos únicos en el número.

 input_num = '781623954' next_num = int(input_num) + 1 input_digits = set(input_num) found = False while not found: next_num += 1 next_digits = set(str(next_num)) found = len(next_digits) == 9 and input_digits == next_digits if next_num > 987654321: break if found: print(next_num) else: print("No number was found.") 

Este es un enfoque más eficiente, utilizando el algoritmo del matemático indio Narayana Pandita, del siglo XIV, que se puede encontrar en el artículo de Wikipedia sobre Permutación . Este antiguo algoritmo sigue siendo una de las formas más rápidas conocidas para generar permutaciones en orden, y es bastante robusto, ya que maneja apropiadamente las permutaciones que contienen elementos repetidos.

El siguiente código incluye una función simple de test() que genera todas las permutaciones de una cadena numérica ordenada.

 #! /usr/bin/env python ''' Find the next permutation in lexicographic order after a given permutation This algorithm, due to Narayana Pandita, is from https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order 1. Find the largest index j such that a[j] < a[j + 1]. If no such index exists, the permutation is the last permutation. 2. Find the largest index k greater than j such that a[j] < a[k]. 3. Swap the value of a[j] with that of a[k]. 4. Reverse the sequence from a[j + 1] up to and including the final element a[n]. Implemented in Python by PM 2Ring 2015.07.28 ''' import sys def next_perm(a): ''' Advance permutation a to the next one in lexicographic order ''' n = len(a) - 1 #1. Find the largest index j such that a[j] < a[j + 1] for j in range(n-1, -1, -1): if a[j] < a[j + 1]: break else: #This must be the last permutation return False #2. Find the largest index k greater than j such that a[j] < a[k] v = a[j] for k in range(n, j, -1): if v < a[k]: break #3. Swap the value of a[j] with that of a[k]. a[j], a[k] = a[k], a[j] #4. Reverse the tail of the sequence a[j+1:] = a[j+1:][::-1] return True def test(n): ''' Print all permutations of an ordered numeric string (1-based) ''' a = [str(i) for i in range(1, n+1)] i = 0 while True: print('%2d: %s' % (i, ''.join(a))) i += 1 if not next_perm(a): break def main(): s = sys.argv[1] if len(sys.argv) > 1 else '781623954' a = list(s) next_perm(a) print('%s -> %s' % (s, ''.join(a))) if __name__ == '__main__': #test(4) main() 
 input[8] == input[7] input[7] == temp 

probablemente quiso decir:

 input[8] = input[7] input[7] = temp 

no lo hiciste

Lo cual, como se indica en los comentarios, no funcionaría directamente en la cadena, ya que es inmutable en Python. Entonces, como primer paso, podrías hacer una lista de los caracteres de esa cadena:

 input = list(input) 

y como último paso, recupera una cadena de la lista modificada:

 input = ''.join(input) 

Por cierto, es posible que desee beneficiarse del desempaquetado de la tupla de Python, que le permite intercambiar dos variables sin tener que introducir una tercera:

 input[7], input[8] = input[8], input[7]