Pyth, 17 bytes
uXGhaf>FT.:G2]Z)Q
Cambiar elementos en una lista es realmente costoso en Pyth. Así que aquí hay una solución divertida, que estira un poco las reglas. Probablemente no sea válido.
Pruébelo en línea: Pyth Compiler / Executor
Explicación
En primer lugar, la complejidad temporal de mi código es O(n^3)
. Pero esta no es la parte interesante. La pregunta no dice nada sobre la complejidad.
La parte crítica es cómo cambio dos elementos en la lista. Digamos que quiero cambiar los elementos m[3]
y m[4]
. No me importan los índices 3
y 4
en absoluto. Simplemente creo una segunda lista, que reemplaza cada elemento igual m[3]
con el número m[4]
y cada número igual m[4]
con el valor m[3]
. Como la lista no contiene duplicados, esto simula cambiar estos dos valores. Si hubiera duplicados, como en la entrada [1, 3, 2, 2]
, la salida sería [1, 2, 3, 3]
. Y si das la entrada [1, 2, 1]
, terminaría en un bucle infinito. No creo explícitamente la segunda lista, es solo parte de la implementación de Pyth del método de traducción. Si imprime las listas actuales ( consulte aquí), proporciona los valores correctos, que usted esperaría.
implicit: Q = input list
u Q set G = Q, update G as long with the following statements,
until it stops changing:
.:G2 all pairs (G[i],G[i+1])
f>FT filter for pairs T, where T[0] > T[1]
a ]Z add to this list of pairs [0]
(ensures that the filtered list is always non-empty)
h take the first element
XG ) translate G by this pair (switches the values T[0] with T[1])
print implicitly at the end