Descrição do Desafio
Um "desarranjo" de uma sequência é uma permutação em que nenhum elemento aparece em sua posição original. Por exemplo, ECABD
é um distúrbio de ABCDE
, mas CBEDA
não é:
ABCDE
| | <- B and D are in their orignal positions
CBEDA
Dada uma sequência, gere um desarranjo aleatório.
Notas
Você pode usar uma string como entrada ou uma matriz / lista de elementos (números inteiros, caracteres, objetos ...)
Em vez de retornar um novo objeto, você pode modificar um existente trocando seus elementos
Cada desarranjo deve ter uma probabilidade igual de ser gerado
Você pode assumir que há mais de um elemento na sequência e nenhum aparece mais de uma vez
Respostas:
CJam , 14 bytes
Experimente online!
Continua a embaralhar a entrada até que seja um distúrbio.
Explicação
fonte
Gelatina , 6 bytes
Experimente online!
Explicação
Jonathan Allan salvou um byte.
fonte
Ẋ=³S$¿
economiza um byte.$
. Obrigado!Python, 85 bytes
Modifica a lista passada para ele (permitida pela meta e na pergunta).
Experimente online aqui!
fonte
def D(l):
coml=input()
e depois salvar os espaços de recuo nas seguintes linhas (para você ter um programa em vez de uma função). Mas não diminuiu o voto!ES6 (Javascript),
71, 69 bytesEntrada e saída são matrizes, devem funcionar com qualquer tipo de elemento (seqüências de caracteres, números etc.), desde que possam ser comparados com "==".
Golfe
Teste
Snippet interativo
fonte
Perl 6 , 33 bytes
Um lambda que recebe uma lista de números inteiros ou caracteres como entrada e retorna uma nova lista.
Se ele deve suportar listas de valores arbitrários ,
ne
teria que ser substituído por!eqv
(+2 bytes).( Experimente online. )
Explicação:
{ }
: Define um lambda..pick(*)
: Gera uma aleatória aleatória na lista de entrada..pick(*) xx *
: Cria uma sequência infinita e preguiçosa de tais shuffles.(* Zne $_).all
: Um lambda que fecha duas listas (seu argumento*
e o argumento do lambda externo$_
) com one
operador (igualdade de string negativa), produzindo uma lista de booleanos e, em seguida, cria umaall
junção para recolhê-las em um único estado booleano.first PREDICATE, SEQUENCE
: Obtém o primeiro elemento de nossa sequência infinita de permutações que cumpre o teste de "desarranjo".fonte
Brachylog ,
19181513 bytesExperimente online!
Explicação
fonte
Perl 6 , 45 bytes
Tente
Entrada é uma matriz de qualquer coisa.
Expandido:
fonte
MATL, 7 bytes
Esta é uma tradução do meu post no Oitava (e semelhante a alguns dos outros envios aqui). Eu publiquei meu primeiro post sobre MATL ontem (CNR crack), então acho que isso não é o ideal, mas é o melhor que tenho até agora.
Para ser sincero, não tenho muita certeza de que
t
é necessário, mas é a única maneira de fazer isso funcionar. É usado para que eu possa comparar a entrada do usuário (recuperada comG
), com a permutação aleatória. Eu acho que poderia comparar os dois sem ele, mas ...?Enfim, aqui vai:
Experimente online!
fonte
t
lá ou posso me livrar dele? Foi divertido tentar golfe em MATL ... :)t
(ou equivalentemente outraG
) Você precisa deixar algo na pilha para a próxima iteração ou como resultado finalNa verdade , 13 bytes
Experimente online!
Explicação:
fonte
Oitava,
5655 bytesTemos que usar,
input('')
pois isso não é uma função. Além disso, como eu posso optar por ter a entrada como uma string, podemos usar o truquennz(x)==numel(x)
.Explicação:
Agradeço ao Luis por perceber que a entrada pode ser uma string, portanto, eu poderia usar em
nnz
vez denumel
salvar dois bytes.fonte
MATL, 13 bytes
Este é um esforço conjunto de @LuisMendo e eu. Em contraste com muitas outras respostas aqui, essa é determinística no sentido de que não coleta permutações aleatórias até obter um desarranjo, mas gera todos os desarranjos e escolhe um aleatoriamente.
Experimente Online!
Explicação
fonte
Pitão -
109 bytesIsso continua embaralhando a entrada enquanto qualquer um dos caracteres é igual aos caracteres em seu índice na entrada.
Experimente online aqui .
fonte
Mathematica, 57 bytes
Função sem nome, tendo uma lista de itens como entrada e saída de uma lista. Após gerar todas as permutações
#
da entradax
, mantemos apenas aquelas para as quais o conjunto#-x
de diferenças entre elementos não contém a0
; então fazemos uma escolha aleatória (uniformemente) desse conjunto.fonte
#/.x_:>NestWhile[RandomSample[#,Length@#]&,#,Not@FreeQ[#-x,0]&]&
, obviamente, mais rápido na prática, para longas seqüênciasPHP, 85 bytes
Copia o argumento da string para duas matrizes, embaralha uma delas até que a diferença entre elas (também comparando índices dos elementos) seja igual à outra. Corra com
-r
.fonte
R, 59 bytes
Lê uma lista de elementos para STDIN, pega o comprimento da lista e inicia os intervalos de amostragem de 1 ao comprimento, até encontrar um que não compartilhe lugares com a lista ordenada. Em seguida, imprime essa lista.
fonte
Maravilha , 32 bytes
Uso:
Explicação
Mais legível:
Função recursiva
f
. Faz uma comparação entre elementos entref
a lista de entrada da e uma versão aleatória da lista de entrada. Se a comparação produzir valores iguais, issof
será chamado na lista aleatória. Caso contrário, simplesmente retornamos a lista aleatória.fonte
Ruby, 67 bytes
fonte
Oitava,
5453 bytesGere todas as permutações de
a
e selecione aleatoriamente uma linha que não possui um elemento comuma
.nota: é acidentalmente o mesmo que a resposta do @flawr MATL!
fonte
Clojure,
949079 bytes-4 bytes, alterando o condicional dentro da redução para an
and
, e inliningdone?
.-11 bytes convertendo a redução para
some
.WOOT! Bata o PHP.
Método de força bruta. Embaralha a lista enquanto ela é inválida. Isso termina estupidamente rápido, considerando que é um método de força bruta que não faz nada para impedir tentativas duplicadas. Encontrou 1000 preconceitos de uma lista longa de 1000 elementos em menos de um segundo.
Ungolfed:
fonte
Clojure, 56 bytes
Observe que uma sequência não pode ser embaralhada, deve ser passada por
seq
ouvec
.Originalmente eu tentei,
#(first(remove(fn[s]((set(map = % s))true))(iterate shuffle %)))
mas arecur
abordagem é realmente mais curta queiterate
.A mágica é que
(set(map = % s))
retorna um conjunto de falso, conjunto de verdadeiro ou conjunto de verdadeiro e falso. Isso pode ser usado como uma função, se contiver,true
então a resposta étrue
, caso contrário, é falsonil
.=
tem o prazer de receber dois argumentos de entrada, sem necessidade de envolvê-lo com algo.Talvez haja uma maneira ainda mais curta de verificar se algum dos valores é verdadeiro?
fonte
APL, 11 bytes.
Com a string no argumento correto:
⍵[⍋(⍴⍵)?⍴⍵]
Explicação
ρ⍵
obtém o comprimento (ou a forma) do argumento correto.?
retorna uma matriz aleatória(⍴⍵)
desses números.⍋
retorna a ordem deles para garantir que não haja duplicatas.⍵[..]
representa a variedade aleatória da string usando este índice.fonte
⍵
.