Descripción del desafío
Un "trastorno" de una secuencia es una permutación donde ningún elemento aparece en su posición original. Por ejemplo, ECABD
es un trastorno de ABCDE
, pero CBEDA
no es:
ABCDE
| | <- B and D are in their orignal positions
CBEDA
Dada una secuencia, genera un desorden aleatorio de la misma.
Notas
Puede tomar una cadena como entrada o una matriz / lista de elementos (enteros, caracteres, objetos ...)
En lugar de devolver un nuevo objeto, puede modificar uno existente intercambiando sus elementos
Cada trastorno debe tener la misma probabilidad de ser generado
Puede suponer que hay más de un elemento en la secuencia y ninguno aparece más de una vez
Respuestas:
CJam , 14 bytes
Pruébalo en línea!
Sigue barajando la entrada hasta que sea un trastorno.
Explicación
fuente
Jalea , 6 bytes
Pruébalo en línea!
Explicación
Jonathan Allan salvó un byte.
fuente
Ẋ=³S$¿
ahorra un byte.$
. ¡Gracias!Python, 85 bytes
Modifica la lista que se le pasa (permitido por meta y en la pregunta).
Pruébelo en línea aquí!
fuente
def D(l):
conl=input()
y luego guardar los espacios de sangría en las siguientes líneas (por lo que tiene un programa en lugar de una función). Sin embargo, ¡no voté en contra!ES6 (Javascript),
71, 69 bytesLa entrada y la salida son matrices, deberían funcionar con cualquier tipo de elemento (cadenas, números, etc.), siempre que puedan compararse con "==".
Golfed
Prueba
Fragmento interactivo
fuente
Perl 6 , 33 bytes
Una lambda que toma una lista de enteros o caracteres como entrada y devuelve una nueva lista.
Si debe admitir listas de valores arbitrarios ,
ne
debería reemplazarse por!eqv
(+2 bytes).( Pruébelo en línea )
Explicación:
{ }
: Define una lambda..pick(*)
: Genera un aleatorio aleatorio de la lista de entrada..pick(*) xx *
: Crea una secuencia infinita perezosa de tales barajaduras.(* Zne $_).all
: Una lambda que comprime dos listas (su argumento*
y el argumento de la lambda externa$_
) con elne
operador (igualdad de cadena negativa), produciendo una lista de booleanos, y luego crea unaall
unión para colapsarlos a un solo estado booleano.first PREDICATE, SEQUENCE
: Toma el primer elemento de nuestra secuencia infinita de permutaciones que cumple con la prueba de "trastorno".fuente
Brachylog ,
19181513 bytesPruébalo en línea!
Explicación
fuente
Perl 6 , 45 bytes
Intentalo
La entrada es una matriz de cualquier cosa.
Expandido:
fuente
MATL, 7 bytes
Esta es una traducción de mi publicación Octave (y similar a algunas de las otras presentaciones aquí). Publiqué mi primera publicación MATL ayer (crack CNR), así que supongo que esto no es óptimo, pero es lo mejor que tengo hasta ahora.
Para ser honesto, no estoy completamente seguro de que
t
sea necesario, pero es la única forma en que puedo hacer que esto funcione. Se utiliza para poder comparar la entrada del usuario (recuperada conG
), con la permutación aleatoria. Creo que podría comparar los dos sin él, pero ...?De todos modos, aquí va:
Pruébalo en línea!
fuente
t
allí o puedo deshacerme de él? Fue divertido intentar jugar al golf en MATL ... :)t
(o equivalentemente otroG
) Necesitas dejar algo en la pila para la próxima iteración o como resultado finalEn realidad , 13 bytes
Pruébalo en línea!
Explicación:
fuente
Octava,
5655 bytesTenemos que usar
input('')
ya que esto no es una función. Además, dado que puedo elegir tener la entrada como una cadena, podemos usar el truco quennz(x)==numel(x)
.Explicación:
Gracias a Luis por notar que la entrada puede ser una cadena, por lo que podría usar en
nnz
lugar denumel
guardar dos bytes.fuente
MATL, 13 bytes
Este es un esfuerzo conjunto de @LuisMendo y yo. A diferencia de muchas otras respuestas aquí, esta es determinista en el sentido de que no muestrea permutaciones aleatorias hasta que obtiene un trastorno, pero genera todos los trastornos y elige uno aleatoriamente.
¡Pruébelo en línea!
Explicación
fuente
Pyth -
109 bytesEsto sigue barajando la entrada mientras cualquiera de los caracteres es igual a los caracteres en su índice en la entrada.
Pruébelo en línea aquí .
fuente
Mathematica, 57 bytes
Función sin nombre que toma una lista de lo que sea como entrada y genera una lista. Después de generar todas las permutaciones
#
de la entradax
, conservamos solo aquellas para las cuales el conjunto#-x
de diferencias entre elementos no contiene a0
; entonces hacemos una elección aleatoria (uniformemente) de ese conjunto.fuente
#/.x_:>NestWhile[RandomSample[#,Length@#]&,#,Not@FreeQ[#-x,0]&]&
obviamente, más rápido en la práctica para cuerdas largasPHP, 85 bytes
Copia el argumento de cadena en dos matrices, baraja una de ellas hasta que la diferencia entre ellas (también comparando índices de los elementos) sea igual a la otra. Corre con
-r
.fuente
R, 59 bytes
Lee una lista de elementos en STDIN, toma la longitud de la lista y comienza los rangos de muestreo de 1 a la longitud, hasta que encuentra uno que no comparte lugares con la lista ordenada. Luego imprime esa lista.
fuente
Maravilla , 32 bytes
Uso:
Explicación
Más legible:
Función recursiva
f
. Hace una comparación por elementos entref
la lista de entrada de y una versión aleatoria de la lista de entrada. Si la comparación arroja algún valor igual,f
se llama a la lista aleatoria. De lo contrario, simplemente devolvemos la lista aleatoria.fuente
Ruby, 67 bytes
fuente
Octava,
5453 bytesGenere todas las permutaciones de
a
y seleccione aleatoriamente una fila que no tenga un elemento común cona
.nota: ¡Es accidentalmente lo mismo que @flawr MATL answer!
fuente
Clojure,
949079 bytes-4 bytes cambiando el condicional dentro de la reducción a un
and
, y en líneadone?
.-11 bytes convirtiendo la reducción a
some
.WOOT! Batir PHP.
Método de fuerza bruta. Baraja la lista mientras no es válida. Esto termina estúpidamente rápido considerando que es un método de fuerza bruta que no hace nada para evitar intentos duplicados. Encontró 1000 dearangments de una larga lista de 1000 elementos en menos de un segundo.
Sin golf:
fuente
Clojure, 56 bytes
Tenga en cuenta que una cadena no se puede mezclar, se debe pasar por
seq
ovec
.Originalmente lo intenté
#(first(remove(fn[s]((set(map = % s))true))(iterate shuffle %)))
perorecur
enfoque es más cortoiterate
.La magia es que
(set(map = % s))
devuelve un conjunto de falso, un conjunto de verdadero o un conjunto de verdadero y falso. Esto puede usarse como una función, si contiene,true
entonces la respuesta estrue
, de lo contrario, es falsanil
.=
se complace en tomar dos argumentos de entrada, no es necesario envolverlo con algo.¿Quizás haya una forma aún más corta de verificar si alguno de los valores es verdadero?
fuente
APL, 11 bytes.
Con la cadena en el argumento correcto:
⍵[⍋(⍴⍵)?⍴⍵]
Explicación
ρ⍵
obtiene la longitud (o forma) del argumento correcto.?
devuelve una matriz aleatoria(⍴⍵)
de estos números.⍋
devuelve el orden de ellos para garantizar que no haya duplicados.⍵[..]
representa el surtido aleatorio de la cadena usando este índice.fuente
⍵
.