Ontem, fiz essa pergunta sobre embaralhamento de rifles. Parece que a pergunta de ontem foi um pouco difícil, então essa é uma tarefa relacionada, mas muito mais fácil.
Hoje, você é solicitado a determinar se uma permutação é de fato uma reprodução aleatória. Nossa definição de riffle shuffle é adaptada de nossa última pergunta:
A primeira parte do shuffle é a divisão. Na partição dividida, o baralho de cartas em dois. As duas subseções devem ser contínuas, mutuamente exclusivas e exaustivas. No mundo real, deseja tornar sua partição o mais próxima possível, no entanto, neste desafio, isso não é uma consideração, todas as partições, incluindo as que são degeneradas (uma partição está vazia), são de igual consideração.
Depois de terem sido particionados, os cartões são unidos de maneira que os cartões mantenham sua ordem relativa na partição da qual são membros . Por exemplo, se o cartão A estiver antes do cartão B no baralho e os cartões A e B estiverem na mesma partição, o cartão A deverá estar antes do cartão B no resultado final, mesmo que o número de cartões entre eles tenha aumentado. Se A e B estiverem em partições diferentes, eles poderão estar em qualquer ordem, independentemente da ordem inicial, no resultado final.
Cada baralhamento de rifles pode ser visto como uma permutação do baralho de cartas original. Por exemplo, a permutação
1,2,3 -> 1,3,2
é uma reprodução aleatória. Se você dividir o baralho assim
1, 2 | 3
vemos que cada cartão 1,3,2
tem a mesma ordem relativa a todos os outros cartões em sua partição. 2
ainda está depois 1
.
Por outro lado, a permutação a seguir não é uma reprodução aleatória.
1,2,3 -> 3,2,1
Podemos ver isso porque para todas as duas partições (não triviais)
1, 2 | 3
1 | 2, 3
há um par de cartas que não mantêm suas ordens relativas. Na primeira partição 1
e 2
altere sua ordem, enquanto na segunda partição 2
e 3
altere sua ordem.
Tarefa
Dada uma permutação por qualquer método razoável, determine se ele representa um embaralhamento válido da espingarda. Você deve gerar dois valores constantes distintos, um para "Sim, este é um shuffle aleatório" e um para "Não, este não é um aleatório aleatório".
Isso é código-golfe, então as respostas serão pontuadas em bytes, com menos bytes sendo melhores.
Casos de teste
1,3,2 -> True
3,2,1 -> False
3,1,2,4 -> True
2,3,4,1 -> True
4,3,2,1 -> False
1,2,3,4,5 -> True
1,2,5,4,3 -> False
5,1,4,2,3 -> False
3,1,4,2,5 -> True
2,3,6,1,4,5 -> False
fonte
0
para falso, mas qualquer número inteiro[1, +∞)
para verdade?[3,1,4,2,5]
.[2,3,6,1,4,5]
.[0, ..., n-1]
vez de[1, ..., n]
como entrada?Respostas:
JavaScript (ES6), 47 bytes
Recebe a entrada como uma matriz de números inteiros. Retorna um booleano.
Casos de teste
Mostrar snippet de código
Quão?
A matriz de entrada A é uma ordem aleatória de rifles válida se consistir em no máximo duas seqüências entrelaçadas distintas de números inteiros consecutivos.
As regras de desafio especificam que recebemos uma permutação de [1 ... N] . Portanto, não precisamos verificar adicionalmente se a união classificada dessas seqüências realmente resulta em um intervalo desse tipo.
Usamos um contador x inicializado para A [0] e um contador y inicialmente indefinido.
Para cada entrada z em A , começando com a segunda:
fonte
Haskell , 41 bytes
Experimente online!
Verifica se a lista concatenada para si mesma contém os números
0..n-1
em ordem como uma subsequência.fonte
Haskell , 43 bytes
s
pega uma lista de números inteiros como nos exemplos de OP e retorna aBool
.Experimente online!
Como funciona
x
dep
sua vez e verifica se ele pode ser o primeiro elemento da segunda partição do shuffle. Em seguida,or
retornaTrue
se alguma das verificações foiTrue
.filter
)p
em elementos menores e maiores que (ou iguais a)x
, concatenando e verificando se a lista resultante é[1..length p]
, ou seja, os elementos em ordem.[1..length p]
é feita é verificando se o resultado é estritamente menor que a lista infinita[1..] == [1,2,3,etc.]
, o que fornece o mesmo resultado para qualquer permutação.fonte
Geléia ,
136 bytesExperimente online!
Versão alternativa, desafio pós-datas, 5 bytes
Experimente online!
Como funciona
fonte
Python 2 , 39 bytes
Experimente online!
Pega a lista indexada em 0 e sai pelo código de saída.
fonte
Braquilog , 9 bytes
Experimente online!
O predicado será bem-sucedido se a entrada representar uma reprodução aleatória e falhar se não ocorrer, o que significa, entre outras coisas, que se o predicado for executado como um programa inteiro, o sucesso será impresso
true.
e a falha será impressafalse.
. A entrada é tomada como uma lista de qualquer tipo de item e a interpreta como representando uma permutação de si mesma classificada.Sinto que há algo no espírito
⊆ᵐ
que deve funcionar no lugar da construção "sanduíche" de quatro bytes⟨⊆⊇⟩
.fonte
Python 2 ,
756047 bytesgraças a Dennis por -13 bytes
Experimente online!
A saída é via código de saída.
fonte
Ruby , 35 bytes
Experimente online!
Quão?
l & [*1..a] | l
aplica uma interseção e depois uma união: primeiro obtenha os elementosl
que são<=a
e, em seguida, adicione os elementos restantesl
sem alterar a ordem. Se a é o número que estamos procurando, essa operação é igual à classificaçãol
.fonte
Limpo ,
5655 bytesExperimente online!
fonte
Pitão, 5 bytes
Suíte de teste
Verifica se a lista de entrada dobrada contém uma versão classificada de si mesma como uma subsequência.
Graças a Erik, o Outgolfer, por 1 byte, aproveitando melhor as entradas implícitas em
+QQ
vez de*2Q
.fonte
}SQy+
. É expandido para}SQy+QQ
.Pitão , 9 bytes
Suíte de teste.
Economizou 3 bytes graças a isaacg .
Pitão , 14 bytes
Experimente aqui!ou Verifique todos os casos de teste.
Saídas
True
eFalse
para reprodução aleatória e reprodução aleatória, respectivamente.Quão?
fonte
<#0
pode ser substituído por-
mais 2 bytes.Casca , 7 bytes
Suíte de teste!
fonte
Perl, 28 bytes
Inclui
+1
paraa
Entrada em STDIN, 1 baseada
Usa o algoritmo do xnor
fonte
C (gcc) , 61 bytes
Experimente online!
fonte