오버 핸드 셔플 분석


13

로드는 조지와 팀의 두 플레이어 사이에서 카드 게임을 진행하고 있습니다. 현재 팀은 카드를 섞고 있습니다. 로드는 팀이 바람을 피우려고한다고 의심하므로 셔플이 공정한지 확인하는 데 도움이 필요합니다.

팀은 오버 핸드 셔플을하고있다 : 그는 덱 맨 아래에서 카드 더미를 자른 다음, 덱 맨 위에서 데크 맨 위로 다양한 부분을 잘라 내고 몇 번 반복한다.

로드는 독수리 모양이며 팀이 매번 얼마나 많은 카드를 자르고 있는지 정확히 볼 수 있지만 팀이 셔플 링하는 한 빨리 카드를 계산하고 추적 할 수는 없습니다. 로드는 상세한 셔플 링 정보를 얻고 셔플이 공정한지, 약한 지, 트릭인지를 결정하는 프로그램이나 함수를 작성하기를 원합니다.

  • 셔플 링 후, 25 쌍 미만의 인접 카드가 (동일한 순서로) 인접하게 유지되면, 셔플은 공정하며 게임은 계속 될 수 있습니다.
  • 인접 카드가 25 개 이상 (모두는 아님) 쌍으로 인접 해 있으면 셔플은 약해지며로드는 팀을 머리 위로 튕겨서 더 섞을 것을 요청합니다.
  • 모든 카드가 마지막에 같은 위치에 남아 있다면 Tim은 분명히 바람을 피우고 Rod는 큰 송어로 그를 때릴 것입니다.

이것은 코드 골프이므로 가장 짧은 코드가 승리합니다.

입력:

여러 줄에서 공백으로 구분 된 0에서 52 사이의 숫자 (모두 독점) 사이에 일련의 숫자가 표시됩니다. 각 줄은 모든 카드가 쌓여서 시작하고 끝나는 셔플 링 라운드를 나타냅니다.

각 줄에서 첫 번째 숫자는 팀이 덱 맨 아래에서 잘라낸 카드의 수이며, 그 이후의 숫자는 손에서 덱 맨 위에 놓인 카드의 수입니다. 한 줄의 마지막 숫자 뒤에 카드가 남아 있으면 팀이 카드를 덱 위에 놓았다고 가정해야합니다.

입력이 유효합니다. 최소한 한 줄의 숫자가 있으며 각 줄에는 최소한 두 개의 숫자가 포함됩니다. 각 줄의 첫 번째 숫자는 같은 줄의 다른 모든 숫자의 합보다 작지 않습니다. 후행 줄 바꿈은 선택 사항이므로 입력에 하나가 있거나없는 것으로 가정 할 수 있습니다.

산출:

셔플이 공정한 경우 프로그램은 "공정한", 셔플이 약한 경우 "약한", 팀이 모든 카드를 같은 순서로 유지하는 경우 "속임"을 인쇄 / 반환해야합니다. 후행 줄 바꿈은 선택 사항입니다.

예:

덱에는 52 장의 카드가있는 것으로 가정하지만 데모 목적으로 10 장의 더 작은 덱을 사용하겠습니다.

입력:

5 3 1
4 2 2

위에서 본 초기 데크 : 0 1 2 3 4 5 6 7 8 9
50 1 2 3 4( 5 6 7 8 9손)
35 6 7 0 1 2 3 4( 8 9손)
18 5 6 7 0 1 2 3 4( 9손)
선 끝 ➜ 9 8 5 6 7 0 1 2 3 4
49 8 5 6 7 0( 1 2 3 4손)
21 2 9 8 5 6 7 0( 3 4손)
23 4 1 2 9 8 5 6 7 0
4 쌍이 인접 해 있습니다.(3 4) (1 2) (5 6) (6 7)

테스트 사례 :

43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5

산출: fair


43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5

산출: weak


29 24
19 18
38 2 1 8 13 6 4
47 15 16 5 2 1 7
34 22 9 3
44 9 10 11 3 1 7
33 18 4 2 3 3

산출: fair


24 6 12 4
25 3 19
36 4 25 2
19 11 1 3
15 9 3
37 5 27

산출: weak


26 13
26 13
26 13
26 13

산출: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

산출: weak


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

산출: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
49 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

산출: fair

요구 사항 :

  • 함수를 작성하면 표준 입력에서 읽거나 단일 문자열 매개 변수로 입력을 수신 할 수 있습니다. 또한이 함수는 출력을 인쇄하거나 반환 할 수 있습니다.
  • 프로그램은 무료 소프트웨어를 사용하여 Linux에서 실행 가능해야합니다.
  • 소스 코드는 ASCII 문자 만 사용해야합니다.
  • 표준 허점이 없습니다.

2
왜 ASCII로 제한합니까? 많은 언어 (APL, 기계 코드, TI-BASIC)는 ASCII를 전혀 사용하지 않으므로 암묵적으로 허용하지 않습니다.
lirtosiast

@ThomasKwa ASCII가 아닌 문자를 표시하고 계산하는 것과 관련된 문제가 마음에 들지 않기 때문입니다. 이러한 언어 중 일부에는 ASCII 표현 또는 대체가 있습니다. 나는 그것이 매우 가혹한 제한이 아니라고 생각합니다.
SE가 EVIL이기 때문에 Aditsu 종료

"인쇄 가능한 ASCII 문자 만 사용하는 엔터티에는 바이트 수에 log (95) / log (256)를 곱한 바이트 수를 갖습니다"와 같은 스코어링 시스템이 인쇄 가능한 ASCII 제출을 상당히 인센티브 화하려는 경우 더 나은 옵션이라고 생각합니다. 추론은 동일한 점수를 가진 항목의 정보 내용이 동일하기 때문입니다. 개인적으로, 나는 여전히 바이트로 평범한 점수를 선호합니다.
lirtosiast

@ThomasKwa 좋아, 이건 어때? UTF-8 인코딩으로 바이트 수를 세는 인쇄 가능한 유니 코드 문자 만
SE는 EVIL이기 때문에 종료 됨

답변:




2

자바 스크립트, 292 289 바이트

아마도 더 많은 바이트를 짜낼 수는 있지만 지금은 빠른 첫 번째 단계입니다.

d=[];for(i=0;i<52;i+=1)d[i]=i
s=prompt().split('\n')
s.forEach(function(e,i){s[i]=e.split(' ')
h=d.splice(-s[i][0],99)
for(j=1;j<s[i].length;j+=1)d.unshift.apply(d,h.splice(0,s[i][j]))
d.unshift.apply(d,h)})
for(c=0;i>1;i-=1)if(d[i-2]==d[i-1]-1)c+=1
alert(c<25?"fair":c<51?"weak":"trick")

편집 : i인접한 카드 수를 계산할 때 데크 빌딩 루프 의 값을 재사용하여 3 바이트를 절약했습니다 .

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