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
[3,1,4,2,5]
.
[2,3,6,1,4,5]
.
[0, ..., n-1]
vez de [1, ..., n]
como entrada?
0
para falso, mas qualquer número inteiro[1, +∞)
para verdade?