21. Desordenando con criterio

Crea una función que desordene una lista (mezcle sus elementos aleatoriamente) de manera que se garantice que ningún elemento quede en su posición original.

La función debe aceptar una lista y devolver una nueva lista desordenada. Si no es posible desordenar la lista bajo esta condición (por ejemplo, si la lista tiene un solo elemento), debe manejarlo adecuadamente.

import random

def desordenar_sin_posicion_original(lista: list) -> list:
    # Tu código aquí
    pass

# Ejemplo (el resultado será aleatorio, pero ningún elemento estará en su posición original)
desordenar_sin_posicion_original([1, 2, 3])
# Posibles resultados: [2, 3, 1] o [3, 1, 2]
# Imposibles: [1, 3, 2] (1 está en su posición)

desordenar_sin_posicion_original(["A", "B", "C", "D"])
# Ejemplo: ["B", "C", "D", "A"]

Ratoncito

Implementa una función que intente desordenar la lista y compruebe si cumple la condición. Si no la cumple, que lo intente de nuevo. Ten en cuenta que esto podría ser ineficiente para listas grandes.

Dragón

Implementa el desorden de forma eficiente para garantizar que ningún elemento quede en su posición original (esto se conoce como "derangement"). Investiga algoritmos para derangements o técnicas de Fisher-Yates modificadas para asegurar esta propiedad.

This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.

Will you buy me a coffee?

Visitors in real time

You are alone: 🐱