Riffle shuffle คือ shuffle แบบหนึ่งที่แบ่งเด็คออกเป็นสองพาร์ติชั่นและพาร์ติชั่นจะรวมกันเพื่อสร้างเด็คสับแบบใหม่
บัตรจะได้แต่งงานกันในลักษณะดังกล่าวว่าบัตรรักษาลำดับญาติของพวกเขาภายในพาร์ทิชันที่พวกเขาเป็นสมาชิกของ ตัวอย่างเช่นหากการ์ดAอยู่ก่อนการ์ดBในสำรับและการ์ดAและBอยู่ในพาร์ทิชันเดียวกันการ์ดAต้องอยู่ก่อนการ์ดBในผลลัพธ์สุดท้ายแม้ว่าจำนวนการ์ดระหว่างการ์ดจะเพิ่มขึ้น หากAและBอยู่ในพาร์ติชั่นต่างกันพวกเขาสามารถอยู่ในลำดับใดก็ได้โดยไม่คำนึงถึงลำดับเริ่มต้นในผลลัพธ์สุดท้าย
การสลับแบบสุ่มแต่ละอันนั้นสามารถถูกมองว่าเป็นการเปลี่ยนแปลงไพ่สำรับดั้งเดิม ตัวอย่างเช่นการเปลี่ยนแปลง
1,2,3 -> 1,3,2
เป็นการสลับแบบ riffle ถ้าคุณแยกดาดฟ้าเช่นนั้น
1, 2 | 3
เราเห็นว่าการ์ดทุกใบใน1,3,2
นั้นมีลำดับที่เหมือนกันกับการ์ดอื่น ๆ ในพาร์ติชั่น ยังคงเป็นหลังจากที่2
1
ในทางกลับกันการเรียงสับเปลี่ยนต่อไปนี้ไม่ใช่การสลับแบบ riffle
1,2,3 -> 3,2,1
เราสามารถเห็นสิ่งนี้ได้เพราะพาร์ติชั่นทั้งสอง (ไม่สำคัญ)
1, 2 | 3
1 | 2, 3
มีคู่ของการ์ดที่ไม่รักษาลำดับญาติของพวกเขา ในพาร์ติชันแรก1
และ2
เปลี่ยนลำดับของพวกเขาในขณะที่พาร์ติชันที่สอง2
และ3
เปลี่ยนลำดับของพวกเขา
อย่างไรก็ตามเราจะเห็นว่า3, 2, 1
สามารถทำได้โดยการเขียนสอง riffle shuffles
1, 3, 2 + 2, 3, 1 = 3, 2, 1
ในความเป็นจริงความจริงง่ายๆที่จะพิสูจน์คือการเรียงสับเปลี่ยนใด ๆ ที่สามารถทำให้ฉันรวมจำนวนสับเปลี่ยนสับเปลี่ยน riffle จำนวนหนึ่ง
งาน
งานของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นที่ใช้การเปลี่ยนรูป (ขนาดN ) เป็นอินพุทและเอาท์พุทจำนวนสับเปลี่ยนสับเปลี่ยนแบบ riffle จำนวนน้อยที่สุด (ขนาดN ) ที่สามารถรวมกันเป็นรูปแบบของการเปลี่ยนแปลงอินพุต คุณไม่จำเป็นต้องเอาท์พุฟ ruffle shuffles ด้วยตัวเอง
นี่คือcode-golfดังนั้นคำตอบจะได้คะแนนเป็นไบต์ด้วยจำนวนไบต์ที่น้อยกว่าจะดีกว่า
คุณสามารถส่งออก 1 หรือ 0 สำหรับการเปลี่ยนแปลงตัวตน
กรณีทดสอบ
1,3,2 -> 1
3,2,1 -> 2
3,1,2,4 -> 1
2,3,4,1 -> 1
4,3,2,1 -> 2
4,3,2,1
จะเป็น2
? ก่อนอื่นเราแบ่งตรงกลางและได้กำไร3,1,4,2
จากนั้นเราแยกกลางอีกครั้งและใช้การเรียงสับเปลี่ยนแบบเดียวกัน