Description du défi
Un "dérangement" d'une séquence est une permutation où aucun élément n'apparaît dans sa position d'origine. Par exemple, ECABD
est un dérangement de ABCDE
, mais CBEDA
n'est pas:
ABCDE
| | <- B and D are in their orignal positions
CBEDA
Étant donné une séquence, générez-en un dérangement aléatoire.
Remarques
Vous pouvez prendre soit une chaîne en entrée soit un tableau / liste d'éléments (entiers, caractères, objets ...)
Au lieu de renvoyer un nouvel objet, vous pouvez modifier un objet existant en échangeant ses éléments
Chaque dérangement devrait avoir une probabilité égale d'être généré
Vous pouvez supposer qu'il y a plus d'un élément dans la séquence et qu'aucun n'apparaît plus d'une fois
Réponses:
CJam , 14 octets
Essayez-le en ligne!
Continue à mélanger l'entrée jusqu'à ce qu'elle soit un dérangement.
Explication
la source
Gelée , 6 octets
Essayez-le en ligne!
Explication
Jonathan Allan a enregistré un octet.
la source
Ẋ=³S$¿
économise un octet.$
. Merci!Python, 85 octets
Modifie la liste qui lui est passée (autorisée par la méta et dans la question).
Essayez-le en ligne ici!
la source
def D(l):
parl=input()
puis enregistrer les espaces d'indentation dans les lignes suivantes (vous avez donc un programme au lieu d'une fonction). Mais je n'ai pas baissé les voix!ES6 (Javascript),
71, 69 octetsL'entrée et la sortie sont des tableaux, devraient fonctionner avec tous les types d'éléments (chaînes, nombres, etc.), à condition qu'ils puissent être comparés à "==".
Golfé
Tester
Extrait interactif
la source
Perl 6 , 33 octets
Un lambda qui prend en entrée une liste d'entiers ou de caractères et renvoie une nouvelle liste.
S'il doit prendre en charge des listes de valeurs arbitraires , il
ne
devrait être remplacé par!eqv
(+2 octets).( Essayez-le en ligne. )
Explication:
{ }
: Définit un lambda..pick(*)
: Génère une lecture aléatoire de la liste d'entrée..pick(*) xx *
: Crée une séquence infinie paresseuse de tels mélanges.(* Zne $_).all
: Lambda qui zippe deux listes (son argument*
et l' argument externe de lambda$_
) avec l'ne
opérateur (égalité de chaîne négative), produisant une liste de booléens, puis crée uneall
jonction pour les réduire à un seul état booléen.first PREDICATE, SEQUENCE
: Prend le premier élément de notre séquence infinie de permutations qui remplit le test de "dérangement".la source
Brachylog ,
19181513 octetsEssayez-le en ligne!
Explication
la source
Perl 6 , 45 octets
Essayez-le
L'entrée est un tableau de n'importe quoi.
Étendu:
la source
MATL, 7 octets
Ceci est une traduction de mon post Octave (et similaire à certaines des autres soumissions ici). J'ai posté mon premier post MATL hier (crack CNR), donc je suppose que ce n'est pas optimal, mais c'est le meilleur que j'ai eu jusqu'à présent.
Pour être honnête, je ne suis pas tout à fait sûr que cela
t
soit nécessaire, mais c'est la seule façon de faire en sorte que cela fonctionne. Il est utilisé pour que je puisse comparer l'entrée utilisateur (récupérée avecG
), avec la permutation aléatoire. Je pense que je pourrais comparer les deux sans ça, mais ...?Quoi qu'il en soit, voici:
Essayez-le en ligne!
la source
t
ou puis-je m'en débarrasser? C'était amusant d'essayer de jouer au golf en MATL ... :)t
(ou équivalentG
) Vous devez laisser quelque chose sur la pile pour la prochaine itération ou comme résultat finalEn fait , 13 octets
Essayez-le en ligne!
Explication:
la source
Octave,
5655 octetsNous devons utiliser
input('')
car ce n'est pas une fonction. De plus, comme je peux choisir d'avoir l'entrée sous forme de chaîne, nous pouvons utiliser l'astuce quinnz(x)==numel(x)
.Explication:
Merci à Luis d'avoir remarqué que l'entrée peut être une chaîne, donc j'ai pu utiliser
nnz
au lieu d'numel
enregistrer deux octets.la source
MATL, 13 octets
Il s'agit d'un effort conjoint de @LuisMendo et moi. Contrairement à de nombreuses autres réponses, celle-ci est déterministe dans le sens où elle n'échantillonne pas les permutations aléatoires jusqu'à ce qu'elle obtienne un dérangement, mais elle génère tous les dérangements et en choisit une au hasard.
Essayez-le en ligne!
Explication
la source
Pyth -
109 octetsCela continue de mélanger l'entrée tandis que l'un des caractères est égal à celui de son index dans l'entrée.
Essayez-le en ligne ici .
la source
Mathematica, 57 octets
Fonction sans nom prenant une liste de whatevers comme entrée et sortie d'une liste. Après avoir généré toutes les permutations
#
de l'entréex
, nous ne gardons que celles pour lesquelles l'ensemble#-x
des différences élément par élément ne contient pas a0
; puis nous faisons un choix aléatoire (uniforme) à partir de cet ensemble.la source
#/.x_:>NestWhile[RandomSample[#,Length@#]&,#,Not@FreeQ[#-x,0]&]&
évidemment plus rapide à l'entraînement pour les cordes longuesPHP, 85 octets
Copie l'argument chaîne dans deux tableaux, mélange l'un d'eux jusqu'à ce que la différence entre eux (comparant également les index des éléments) soit égale à l'autre. Courez avec
-r
.la source
R, 59 octets
Lit une liste d'éléments dans STDIN, prend la longueur de la liste et commence les plages d'échantillonnage de 1 à la longueur, jusqu'à ce qu'il en trouve un qui ne partage aucun emplacement avec la liste ordonnée. Imprime ensuite cette liste.
la source
Wonder , 32 octets
Usage:
Explication
Plus lisible:
Fonction récursive
f
. Effectue une comparaison élément par élément entref
la liste d'entrée de et une version mélangée de la liste d'entrée. Si la comparaison donne des valeurs égales, ellef
est appelée dans la liste mélangée. Sinon, nous renvoyons simplement la liste mélangée.la source
Rubis, 67 octets
la source
Octave,
5453 octetsGénérez toutes les permutations de
a
et sélectionnez au hasard une ligne qui n'a pas d'élément commun aveca
.note: C'est accidentellement la même chose que la réponse @flawr MATL!
la source
Clojure,
949079 octets-4 octets en changeant le conditionnel à l'intérieur de la réduction en an
and
, et en insérantdone?
.-11 octets en convertissant la réduction en
some
.WOOT! Battez PHP.
Méthode de la force brute. Mélange la liste lorsqu'elle n'est pas valide. Cela se termine rapidement stupide étant donné qu'il s'agit d'une méthode de force brute qui ne fait rien pour empêcher les essais en double. Il a trouvé 1000 dearangments d'une longue liste de 1000 éléments en moins d'une seconde.
Non golfé:
la source
Clojure, 56 octets
Notez qu'une chaîne ne peut pas être mélangée, doit être traversée
seq
ouvec
.A l'origine j'ai essayé
#(first(remove(fn[s]((set(map = % s))true))(iterate shuffle %)))
mais l'recur
approche est en effet plus courte queiterate
.La magie est que
(set(map = % s))
renvoie soit un ensemble de faux, un ensemble de vrais ou un ensemble de vrais et faux. Cela peut être utilisé comme une fonction, s'il contienttrue
alors la réponse esttrue
, sinon faussenil
.=
est heureux de prendre deux arguments d'entrée, pas besoin de l'envelopper avec quelque chose.Peut-être existe-t-il un moyen encore plus court de vérifier si l'une des valeurs est vraie?
la source
APL, 11 octets.
Avec la chaîne dans le bon argument:
⍵[⍋(⍴⍵)?⍴⍵]
Explication
ρ⍵
obtient la longueur (ou la forme) de l'argument de droite.?
renvoie un tableau aléatoire(⍴⍵)
de ces nombres.⍋
retourne la commande d'entre eux afin de s'assurer qu'il n'y a pas de doublons.⍵[..]
représente l'assortiment aléatoire de la chaîne utilisant cet index.la source
⍵
.