เป้าหมายของปริศนานี้คือการสำรับไพ่ 52 ใบและสับไพ่เพื่อให้ไพ่แต่ละใบอยู่ในตำแหน่งสุ่ม
ได้รับ:
- อาเรย์
deck
, ของจำนวนเต็ม 52 ที่แตกต่างกันที่เป็นตัวแทนของการ์ด เมื่อคุณเริ่มต้นให้deck
ประกอบด้วยหนึ่งในบัตรแต่ละใบในลำดับที่ไม่รู้จักบางอย่าง - ฟังก์ชั่น
int rand(min, max)
ที่จะส่งกลับจำนวนเต็มแบบสุ่มระหว่าง intsmin
และ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 ครั้ง ไม่มีใครจะประทับใจ
- เวลาในการดำเนินการไม่สำคัญ แต่จะมีการสุ่มที่แท้จริง
- นี่ไม่ใช่การเข้ารหัสกอล์ฟ แต่คุณสามารถย่อ / ทำให้งงงวยรหัสของคุณได้
แก้ไข: รหัสหม้อไอน้ำและ Visualizer
หากคุณใช้. NET หรือ JavaScript นี่คือรหัสทดสอบบางส่วนที่คุณอาจพบว่ามีประโยชน์:
JavaScript:
- visualizer ของ JavaScript ที่รวดเร็วและสกปรกพร้อมด้วยแหล่งที่มาของ CoffeeScript: https://gist.github.com/JustinMorgan/3989752bdfd579291cca
- เวอร์ชันที่รันได้ (เพียงวางใน
shuffle()
ฟังก์ชั่นของคุณ): http://jsfiddle.net/4zxjmy42/
ค#:
- ASP.NET visualizer พร้อม C # codebehind: https://gist.github.com/JustinMorgan/4b630446a43f28eb5559
- ต้นขั้วเพียง
swap
และrand
อรรถประโยชน์ : https://gist.github.com/JustinMorgan/3bb4e6b058d70cc07d41
รหัสนี้จัดเรียงและสับไพ่หลายพันครั้งและทำการทดสอบสติพื้นฐาน: สำหรับการสุ่มแต่ละครั้งจะตรวจสอบว่ามีไพ่ 52 ใบในสำรับโดยไม่มีการทำซ้ำ จากนั้น Visualizer จะแปลงความถี่ของการ์ดแต่ละใบที่สิ้นสุดในแต่ละสถานที่บนดาดฟ้าโดยแสดงแผนที่ความร้อนระดับสีเทา
เอาต์พุตของ visualizer ควรมีลักษณะเหมือนหิมะที่ไม่มีลวดลายชัดเจน เห็นได้ชัดว่ามันไม่สามารถพิสูจน์การสุ่มอย่างแท้จริง แต่เป็นวิธีที่รวดเร็วและง่ายดายในการตรวจสอบสปอต ฉันแนะนำให้ใช้มันหรืออะไรทำนองนี้เพราะความผิดพลาดบางอย่างในอัลกอริธึมการสับเปลี่ยนทำให้เกิดรูปแบบที่เป็นที่รู้จักมากในผลลัพธ์ ต่อไปนี้เป็นตัวอย่างของเอาต์พุตจากการปรับใช้สองแบบโดยส่วนที่มีข้อบกพร่องทั่วไป:
รุ่นที่มีข้อบกพร่องจะสับเปลี่ยนสำรับได้บางส่วนดังนั้นอาจดูดีถ้าคุณตรวจสอบอาร์เรย์ด้วยมือ เครื่องมือสร้างภาพช่วยให้สังเกตรูปแบบได้ง่ายขึ้น
deck
ตัวเอง
swap
คุณต้องการตราบใดที่มันตอบสนองวัตถุประสงค์พื้นฐานของมัน ส่วนหนึ่งของเหตุผลของฉันในการswap
รับมอบคือเพื่อให้ผู้คนสามารถปฏิบัติต่อมันเป็น 'เวทมนตร์' และมุ่งเน้นไปที่ปัญหาหลักโดยไม่ต้องกังวลว่ามันจะทำงานในภาษาที่พวกเขาเลือก คุณสามารถทำได้หรือเขียนเองswap
ก็ขึ้นอยู่กับคุณ