어제 나는 리플 셔플에 대해이 질문을했다. 어제 질문이 너무 어려워서이 질문은 관련이 있지만 훨씬 쉬운 작업입니다.
오늘은 순열이 실제로 리플 셔플인지 확인해야합니다. 리플 셔플에 대한 우리의 정의는 마지막 질문에서 수정되었습니다.
셔플의 첫 번째 부분은 나누기입니다. 분할 파티션에서 두 개의 카드 덱. 두 개의 하위 섹션은 연속적이고 상호 배타적이며 철저해야합니다. 실제로는 파티션을 가능한 한 가깝게 만들고자하지만,이 과제에서는 이것이 고려되지 않으며, 성능이 저하 된 파티션 (하나의 파티션이 비어 있음)을 포함하는 모든 파티션은 동일하게 고려됩니다.
카드가 분할 된 후에는 카드가 구성원 인 파티션 내에서 상대 순서를 유지하는 방식으로 카드가 서로 연결됩니다 . 예를 들어, 카드 A 가 데크의 카드 B 보다 앞에 있고 카드 A 와 B 가 동일한 파티션에있는 경우, 카드 A 는 카드 사이에 카드 수가 증가하더라도 최종 결과에서 카드 B 보다 앞에 있어야합니다 . 경우 와 B가 서로 다른 파티션에들은 최종 결과에 관계없이 시작 순서의 임의의 순서 일 수있다.
그런 다음 각 리플 셔플은 원본 카드 덱의 순열로 볼 수 있습니다. 예를 들어 순열
1,2,3 -> 1,3,2
리플 셔플입니다. 이렇게 갑판을 나누면
1, 2 | 3
우리는 모든 카드 1,3,2
가 파티션의 다른 모든 카드 와 동일한 상대 순서를 가지고 있음을 알 수 있습니다. 2
여전히 뒤에 1
있습니다.
반면에 다음 순열은 리플 셔플 이 아닙니다 .
1,2,3 -> 3,2,1
두 개의 (사소하지 않은) 파티션 모두에 대해 이것을 볼 수 있습니다.
1, 2 | 3
1 | 2, 3
상대 순서를 유지하지 않는 한 쌍의 카드가 있습니다. 첫 번째 파티션에 1
와 2
있는 동안 두 번째 파티션에, 자신의 순서를 변경 2
하고 3
자신의 순서를 변경합니다.
직무
합리적인 방법을 통해 순열이 주어지면 유효한 리플 셔플을 나타내는 지 확인하십시오. "예, 이것은 리플 셔플입니다"와 "아니오, 이것은 리플 셔플이 아닙니다"에 대해 두 개의 고유 한 상수 값을 출력해야합니다.
이것은 코드 골프 이므로 바이트 수가 적을수록 답이 바이트로 표시됩니다.
테스트 사례
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]
대신 치환을 사용할 수 있습니까 [1, ..., n]
?
0
과 비슷하지만[1, +∞)
진실 에 대한 정수는 무엇입니까?