이 퍼즐의 목적은 52 장의 카드를 가져 와서 섞어서 각 카드가 임의의 위치에 있도록하는 것입니다.
주어진:
deck
카드를 나타내는 52 개의 고유 정수로 구성된 배열 입니다. 시작할 때,deck
알 수없는 순서로 각 카드 중 하나를 정확히 포함합니다.- 함수,
int rand(min, max)
즉 수익률의 int 사이의 임의의 정수min
및max
포함,. 이 기능이 실제로 임의라고 가정 할 수 있습니다. void swap(x, y)
갑판에서 두 장의 카드를 교환 하는 기능 입니다. 당신이 호출 할 경우swap(x, y)
, 위치에서 카드x
와y
장소를 전환합니다.
언제:
- 이 프로그램은 전화
shuffle()
(또는shuffle(deck)
또는deck.shuffle()
또는 그러나 구현이 실행 좋아)
그때:
deck
각 카드 중 하나를 정확히 임의의 순서로 포함해야합니다.
캐치 :
변수를 선언 할 수 없습니다. 전화 swap
및 rand
만큼 당신이 원하는대로,하지만 당신은 당신의 자신의 변수를 선언 할 수 없습니다. 여기에는 for
루프 카운터와 같은 암시 적 카운터가 포함됩니다 foreach
.
설명 :
- 선택한 언어에 맞게 사소한 세부 사항을 변경할 수 있습니다. 예를 들어,
swap
참조로 두 정수를 전환하도록 작성할 수 있습니다 . 퍼즐을 쉽게 만들지 말고 언어로 작업 할 수 있도록 변경해야합니다. deck
전역 변수이거나 매개 변수로 사용할 수 있습니다.- 의 내용에 대해 원하는 작업을 수행
deck
할 수 있지만 길이는 변경할 수 없습니다. - 카드 번호는 0-51, 1-52 또는 원하는 번호로 지정할 수 있습니다.
- 어떤 언어로도 작성할 수 있지만 언어의 내장
shuffle
함수를 사용하여 부정 행위를 할 수는 없습니다 . - 예, 같은 줄을 52 번 쓸 수 있습니다. 아무도 감동하지 않을 것입니다.
- 실행 시간은 중요하지 않지만 진정한 임의성은 중요합니다.
- 이것은 실제로 코드 골프는 아니지만 코드를 최소화 / 난독 화 할 수 있습니다.
편집 : 상용구 코드 및 시각화 프로그램
.NET 또는 JavaScript를 사용한 경우 유용한 테스트 코드가 있습니다.
자바 스크립트 :
- CoffeeScript 소스가 포함 된 빠르고 더러운 JavaScript 비주얼 라이저 : https://gist.github.com/JustinMorgan/3989752bdfd579291cca
- 실행 가능한 버전 (
shuffle()
기능에 붙여 넣기 ) : http://jsfiddle.net/4zxjmy42/
씨#:
- C # 코드 숨김이있는 ASP.NET Visualizer : https://gist.github.com/JustinMorgan/4b630446a43f28eb5559
- https://gist.github.com/JustinMorgan/3bb4e6b058d70cc07d41 :
swap
및rand
유틸리티 방법으로 스텁
이 코드는 덱을 수천 번 분류하고 섞으며 기본적인 위생 테스트를 수행합니다. 각 셔플마다 덱에 반복없이 정확히 52 개의 카드가 있는지 확인합니다. 그런 다음 비주얼 라이저는 데크의 각 위치에서 끝나는 각 카드의 빈도를 플롯하여 회색조 히트 맵을 표시합니다.
비주얼 라이저의 출력은 명백한 패턴이없는 눈처럼 보입니다. 분명히 그것은 임의의 무작위성을 증명할 수는 없지만 빠르고 쉽게 스팟 확인하는 방법입니다. 셔플 링 알고리즘의 특정 실수로 인해 출력에서 인식 가능한 패턴이 생길 수 있으므로 이와 같은 것을 사용하는 것이 좋습니다. 다음은 일반적인 결함이있는 두 가지 구현의 출력 예입니다.
결함이있는 버전은 데크를 부분적으로 섞기 때문에 어레이를 직접 살펴보면 괜찮아 보일 수 있습니다. 비주얼 라이저를 사용하면 패턴을보다 쉽게 확인할 수 있습니다.
deck
자체 이외의 매개 변수없이 수행 할 수 있다는 것을 알고 있습니다.
swap
기본 목적을 달성하는 한 원하는 구현을 가정 할 수 있다는 것입니다. swap
주어진 것을 만든 나의 이유 중 일부는 사람들이 그것을 '매직'으로 취급하고 그들이 선택한 언어로 작동하는 것에 대해 걱정할 필요없이 주요 문제에 집중할 수 있도록하기 위해서였습니다. 당신이 할 수 있거나 자신의 것을 쓸 수 있습니다 swap
, 그것은 당신에게 달려 있습니다.