Mục tiêu của câu đố này là lấy một bộ bài gồm 52 lá bài và xáo trộn nó sao cho mỗi lá bài ở một vị trí ngẫu nhiên.
Được:
- Một mảng,
deck
gồm 52 số nguyên khác nhau đại diện cho các thẻ. Khi bạn bắt đầu,deck
chứa chính xác một trong mỗi thẻ theo thứ tự không xác định. - Hàm,
int rand(min, max)
trả về một số nguyên ngẫu nhiên giữa intsmin
vàmax
, đã bao gồm. Bạn có thể cho rằng chức năng này là thực sự ngẫu nhiên. - Một chức năng,
void swap(x, y)
hoán đổi hai thẻ trong bộ bài. Nếu bạn gọiswap(x, y)
, các thẻ tại các vị tríx
vày
sẽ chuyển đổi địa điểm.
Khi nào:
- Các cuộc gọi chương trình
shuffle()
(hoặcshuffle(deck)
hoặcdeck.shuffle()
hoặc tuy nhiên thực hiện của bạn thích để chạy),
Sau đó:
deck
nên chứa chính xác một trong mỗi thẻ theo thứ tự hoàn toàn ngẫu nhiên.
Cuộc đuổi bắt:
Bạn không thể khai báo bất kỳ biến nào. Gọi swap
và rand
bao nhiêu tùy thích, nhưng bạn không thể khai báo bất kỳ biến nào của riêng bạn. Điều này bao gồm các for
bộ đếm vòng lặp - thậm chí những cái ẩn như trong a foreach
.
Làm rõ:
- Bạn có thể thay đổi các chi tiết nhỏ cho phù hợp với ngôn ngữ bạn đã chọn. Ví dụ: bạn có thể viết
swap
để chuyển đổi hai số nguyên bằng cách tham chiếu. Thay đổi nên làm cho điều này hoạt động với ngôn ngữ của bạn, không làm cho câu đố dễ dàng hơn. deck
có thể là một biến toàn cục hoặc bạn có thể lấy nó làm tham số.- Bạn có thể làm bất cứ điều gì bạn muốn với nội dung của nó
deck
, nhưng bạn không thể thay đổi độ dài của nó. - Thẻ của bạn có thể được đánh số 0-51, 1-52 hoặc bất cứ thứ gì bạn thích.
- Bạn có thể viết điều này bằng bất kỳ ngôn ngữ nào, nhưng không gian lận với
shuffle
chức năng tích hợp sẵn trong ngôn ngữ của bạn . - Có, bạn có thể viết cùng một dòng 52 lần. Sẽ không có ai ấn tượng.
- Thời gian thực hiện không thành vấn đề, nhưng sự ngẫu nhiên thực sự thì có.
- Đây không thực sự là mã golf, nhưng hãy thoải mái giảm thiểu / làm xáo trộn mã của bạn.
Chỉnh sửa: Mã nồi hơi và trình hiển thị
Nếu bạn đã sử dụng .NET hoặc JavaScript, đây là một số mã kiểm tra bạn có thể thấy hữu ích:
JavaScript:
- Trình hiển thị JavaScript nhanh và bẩn, với nguồn CoffeeScript: https://gist.github.com/JustinMorgan/3989752bdfd579291cca
- Phiên bản chạy được (chỉ cần dán vào
shuffle()
chức năng của bạn ): http://jsfiddle.net/4zxjmy42/
C #:
- Trình hiển thị ASP.NET với C # codebehind: https://gist.github.com/JustinMorgan/4b630446a43f28eb5559
- Sơ khai chỉ với các phương thức
swap
vàrand
tiện ích: https://gist.github.com/JustinMorgan/3bb4e6b058d70cc07d41
Mã này sắp xếp và xáo trộn bộ bài vài nghìn lần và thực hiện một số thử nghiệm vệ sinh cơ bản: Đối với mỗi lần xáo trộn, nó xác minh rằng có chính xác 52 lá bài trong bộ bài không lặp lại. Sau đó, trình hiển thị biểu đồ tần số của mỗi thẻ kết thúc tại mỗi vị trí trong bộ bài, hiển thị bản đồ nhiệt độ xám.
Đầu ra của trình hiển thị sẽ trông giống như tuyết không có hoa văn rõ ràng. Rõ ràng nó không thể chứng minh tính ngẫu nhiên thực sự, nhưng đó là cách nhanh chóng và dễ dàng để kiểm tra tại chỗ. Tôi khuyên bạn nên sử dụng nó hoặc một cái gì đó tương tự, bởi vì một số lỗi nhất định trong thuật toán xáo trộn dẫn đến các mẫu rất dễ nhận ra trong đầu ra. Đây là một ví dụ về đầu ra từ hai triển khai, một với một lỗ hổng chung:
Phiên bản không hoàn hảo sẽ xáo trộn một phần bộ bài, vì vậy có thể sẽ ổn nếu bạn kiểm tra mảng bằng tay. Trình hiển thị giúp dễ dàng nhận thấy một mẫu.
deck
chính nó.
swap
nào bạn thích, miễn là nó hoàn thành mục đích cơ bản của nó. Một phần lý do của tôi để đưa swap
ra là để mọi người có thể coi nó là "ma thuật" và tập trung vào vấn đề chính mà không phải lo lắng về việc nó hoạt động theo ngôn ngữ của họ. Bạn có thể làm điều đó hoặc tự viết swap
, tùy bạn.