셔플인가요?


19

어제 나는 리플 셔플에 대해이 질문을했다. 어제 질문이 너무 어려워서이 질문은 관련이 있지만 훨씬 쉬운 작업입니다.

오늘은 순열이 실제로 리플 셔플인지 확인해야합니다. 리플 셔플에 대한 우리의 정의는 마지막 질문에서 수정되었습니다.

셔플의 첫 번째 부분은 나누기입니다. 분할 파티션에서 두 개의 카드 덱. 두 개의 하위 섹션은 연속적이고 상호 배타적이며 철저해야합니다. 실제로는 파티션을 가능한 한 가깝게 만들고자하지만,이 과제에서는 이것이 고려되지 않으며, 성능이 저하 된 파티션 (하나의 파티션이 비어 있음)을 포함하는 모든 파티션은 동일하게 고려됩니다.

카드가 분할 된 후에는 카드가 구성원 인 파티션 내에서 상대 순서를 유지하는 방식으로 카드가 서로 연결됩니다 . 예를 들어, 카드 A 가 데크의 카드 B 보다 앞에 있고 카드 AB 가 동일한 파티션에있는 경우, 카드 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 

상대 순서를 유지하지 않는 한 쌍의 카드가 있습니다. 첫 번째 파티션에 12있는 동안 두 번째 파티션에, 자신의 순서를 변경 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

1
결과가 일관성이 없지만 우리 언어에서 진실 / 거짓 일 수 있습니까? 거짓에 대해서는 (Python, 정수 중 0 만 거짓 인 곳) 0과 비슷하지만 [1, +∞)진실 에 대한 정수는 무엇입니까?
Mr. Xcoder

1
@ Mr.Xcoder 나는 잘 정의하기가 어렵 기 때문에 진실 / 거짓 값을 좋아하지 않습니다. 답변은 현재 규칙을 준수해야합니다.
밀 마법사

권장 테스트 사례 : [3,1,4,2,5].
Ørjan Johansen

9
이것에 대해 죄송하지만 : [2,3,6,1,4,5].
Ørjan Johansen

1
입력 값 [0, ..., n-1]대신 치환을 사용할 수 있습니까 [1, ..., n]?
Dennis

답변:


8

자바 스크립트 (ES6), 47 바이트

정수 배열로 입력을받습니다. 부울을 반환합니다.

([x,...a],y)=>a.every(z=>z+~x?y?z==++y:y=z:++x)

테스트 사례

어떻게?

입력 배열 A 는 연속 정수의 최대 2 개의 서로 다른 인터레이스 시퀀스로 구성된 경우 유효한 리플 셔플입니다.

도전 규칙은 우리가 주어진하고 지정 순열[1 ... N]을 . 따라서 이러한 시퀀스의 정렬 된 합집합이 실제로 이러한 범위에 속하는지 추가로 확인할 필요가 없습니다.

우리는 A [0]으로 초기화 된 카운터 x 와 초기에 정의되지 않은 카운터 y를 사용 합니다.

A의 각 항목 z 에 대해 두 번째 항목 부터 시작하십시오.

  • zx + 1 또는 y + 1 과 같은지 확인합니다 . 그렇다면 해당 카운터를 증가시킵니다.
  • 그렇지 않은 경우 : y 가 아직 정의되지 않은 경우 z로 초기화합니다 .
  • 그렇지 않으면 : 우리는 시험을 실패로 만듭니다.


5

하스켈 , 43 바이트

sOP 예제에서와 같이 정수 목록을 가져 와서를 반환합니다 Bool.

s p=or[f(<x)p++f(>=x)p<[1..]|x<-p]
f=filter

온라인으로 사용해보십시오!

작동 원리

  • 목록 이해는 각 요소 xp차례로 시도 하여 셔플의 두 번째 파티션에서 첫 번째 요소가 될 수 있는지 확인합니다. 그런 다음 or반환 True검사 중 하나가 있다면 True.
  • 이해는을 보다 작거나 큰 (또는 같은 filter) p요소로 분할하고 (와 ) x, 결과 목록이 [1..length p]요소 (예 : 순서대로) 인지 확인하고 연결하여 수행합니다 .
  • 결과 목록이 [1..length p]무한 목록보다 엄격하게 작은 지 확인하여 결과 목록이 수행 되는지 확인하여 [1..] == [1,2,3,etc.]순열에 대해 동일한 결과를 제공합니다.

5

젤리 , 13 6 바이트

ỤIṢḊRẠ

온라인으로 사용해보십시오!

대체 버전, 게시일 챌린지, 5 바이트

Ụ>ƝSỊ

온라인으로 사용해보십시오!

작동 원리

ỤIṢḊRẠ  Main link. Argument: A (permutation of [1, ..., n])

Ụ       Grade up; sort the indices of A by their respective values.
        For shuffles, the result is the concatenation of up to two increasing
        sequences of indices.
 I      Compute the forward differences.
        In a shuffle, only one difference may be negative.
  Ṣ     Sort the differences.
   Ḋ    Dequeue; remove the first (smallest) difference.
    R   Range; map each k to [1, ..., k].
        This yields an empty array for non-positive values of k.
     Ạ  All; check if all resulting ranges are non-empty.


4

Brachylog , 9 바이트

o~cĊ⟨⊆⊇⟩?

온라인으로 사용해보십시오!

입력이 리플 셔플을 나타내는 경우 술어가 성공하고 그렇지 않은 경우 실패합니다. 술어가 전체 프로그램으로 실행되면 성공이 인쇄 true.되고 실패가 인쇄 false.됩니다. 입력은 모든 종류의 항목 목록으로 취하여 정렬 된 순열을 나타내는 것으로 해석합니다.

   Ċ         Some length-two list
 ~c          which concatenated
o            is the input sorted
    ⟨        satisfies the condition that its first element
     ⊆       is an ordered not-necessarily-contiguous sublist
        ?    of the input
      ⊇      which is an ordered superlist of
       ⟩     the list's second element.

⊆ᵐ4 바이트짜리 "샌드위치"구조 대신 작동해야 할 것이 있다고 생각 합니다 ⟨⊆⊇⟩.


1
나는 당신이 PPCG 답변에 샌드위치를 ​​사용한 최초의 사람이라고 생각합니다 (그리고 그것은 아름다운 대칭입니다) :
치명적인


2

루비 , 35 바이트

->l{l.any?{|a|l&[*1..a]|l==l.sort}}

온라인으로 사용해보십시오!

어떻게?

  • l & [*1..a] | l교차로 한 다음 조합을 적용 첫 번째의 요소 얻을 수 l있는 것을 <=a의 나머지 요소를 추가 다음과 l순서를 변경하지 않고. a가 찾고자하는 숫자 인 경우이 작업은 sorting과 동일합니다 l.


2

Pyth, 5 바이트

}SQy+

테스트 스위트

}SQy+

    +QQ  concatenated two copies of the (implicit) input
   y     all subsequences of it
}        contain an element equaling
 SQ      the input list sorted 

배가 된 입력 목록에 자체 정렬 된 버전이 하위 시퀀스로 포함되어 있는지 확인합니다.

에릭 덕분에이 Outgolfer는 1 바이트에 대한 함축적 입력을 더 잘 활용 +QQ하기보다는 *2Q.


5 바이트 : }SQy+. 로 확장됩니다 }SQy+QQ.
Outgolfer Erik

@EriktheOutgolfer 감사합니다. 감사합니다.
xnor

1

Pyth , 9 바이트

!t-.+xLQS

테스트 스위트.

isaacg 덕분에 3 바이트를 절약했습니다 .

Pyth , 14 바이트

}SQm.nS.Tcd2./

여기 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오.

출력 TrueFalse리플 셔플 및 비 리플 셔플 각각.

어떻게?

} SQm.nS.Tcd2./ ~ 전체 프로그램. STDIN에서 입력을 읽고 STDOUT으로 출력합니다.

            ./ ~ 입력의 모든 나누기를 분리 된 하위 문자열 (파티션)로 반환합니다.
   m ~ 변수 d를 사용하여 위의 매핑.
         cd2 ~ d를 두 개의 요소 목록으로 자릅니다.
       .T ~ 부재를 무시하고 정당한 전치사.
      S ~ 정렬 (사전 순).
    .n ~ 깊게 평평하게합니다.
} ~ 위의 내용을 확인하십시오 ...
 SQ ~ 정렬 된 입력.

또한 2 바이트를 더 <#0대체 할 수 있습니다 -.
isaacg

@isaacg 오 예 facepalm 감사합니다. 편집했습니다. 편집했습니다.
Mr. Xcoder



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.