งานจะนำมาจากการบรรยายโดยศ MIT Devadas เรียกว่าคุณสามารถอ่านใจ คำอธิบายโดยละเอียดของเคล็ดลับสามารถพบได้ในวิดีโอที่เชื่อมโยงหรือในเอกสารนี้ ฉันจะพยายามอธิบายให้ง่ายขึ้น
มันจะเปิดออกนี้ถูกประดิษฐ์ขึ้นในปี 1930 และเป็นที่รู้จักในฐานะ"เคล็ดลับห้าบัตรของฟิทช์เชนีย์"
เคล็ดลับไปเช่นนี้:
- สุ่มเลือกไพ่ห้าใบจากสำรับไพ่ ผู้ชมและผู้ช่วยของคุณจะได้เห็นพวกเขา แต่คุณทำไม่ได้
- ผู้ช่วยของคุณ (ซึ่งคุณฝึกมาแล้ว) จะเลือกไพ่สี่ใบจากนั้นแสดงให้คุณตามลำดับที่เฉพาะเจาะจง โปรดทราบว่าการ์ดที่ซ่อนอยู่จะไม่ถูกสุ่มเลือกจากไพ่ 5 ใบ ผู้ช่วยเลือกการ์ด / ที่จะทำให้การหลอกลวง
- คุณจะอนุมานจากข้อมูลที่คุณสามารถรวบรวมจากไพ่สี่ใบที่ไพ่ใบที่ห้าคืออะไร
อย่างไร?
ระลึกถึงสองประเด็นต่อไปนี้:
เมื่อเลือกไพ่ 5 ใบสุ่มคุณจะรับประกันว่าอย่างน้อยสองใบมีชุดเดียวกัน1
ภาพด้านล่างแสดงวงกลมที่มีอันดับ2ทั้งหมด เนื่องจากเป็นวงกลมจึงสามารถนับได้: J, Q, K, A, 2, 3 (เช่นการนับแบบแยกส่วน) คุณรับประกันได้ว่าการ์ดที่ซ่อนไม่ได้อยู่ในอันดับเดียวกันกับการ์ดใบแรกเนื่องจากการ์ดจะเป็นชุดเดียวกัน (อธิบายไว้ด้านล่าง) เป็นไปได้เสมอที่จะเลือกไพ่ใบแรกและการ์ดที่ซ่อนอยู่ซึ่งการ์ดที่ซ่อนอยู่ระหว่าง 1 และ 6 อันดับจะสูงกว่าไพ่ใบแรก (เมื่อนับเป็นวงกลม) หากบัตรแรกคือ1แล้วบัตรที่ซ่อนอยู่จะเป็น2,3,4,5,6 หรือ 7 หากไพ่ใบแรกเป็นJการ์ดที่ถูกซ่อนจะเป็นQ, K, A, 2,3 หรือ 4เป็นต้น
อัลกอริทึม:
ไพ่ใบแรก: การ์ดใบนี้จะมีชุดเดียวกันกับการ์ดที่ซ่อนอยู่ การ์ดจะเป็นจุดอ้างอิงที่คุณจะใช้เมื่อค้นหาอันดับของการ์ดที่ซ่อนอยู่
2, 3 และ 4 บัตรถอดรหัสค่าในช่วงรวม1 ... 6 เราจะเรียกไพ่สามใบS, M, L (ไพ่ที่เล็กที่สุด, ไพ่กลาง, การ์ดที่ใหญ่ที่สุด) ค่าจะถูกเข้ารหัสเช่นนี้ (คำสั่งทำพจนานุกรม):
S M L -> 1
S L M -> 2
M S L -> 3
M L S -> 4
L S M -> 5
L M S -> 6
ดังนั้นถ้าตำแหน่งของบัตรแรกคือ5และที่เหลืออีกสามใบมีอันดับ4 Q 7 (พวกเขาจะได้รับคำสั่งSLM ) แล้วไพ่ใบสุดท้ายมีอันดับ5 + 2 = 7 คุณสามารถเลือกได้ว่าเอซควรเป็นไพ่สูงสุดหรือต่ำที่สุดตราบใดที่การ์ดยังสอดคล้องกัน
หากลำดับหุ้นหลายบัตรแล้วชุดที่จะตรวจสอบการสั่งซื้อที่C <D <H <S
รูปแบบอินพุต:
ไพ่สี่ใบจะได้รับเป็นH3 (สามดวง), DK (ราชาแห่งเพชร) เป็นต้น คุณอาจเลือกที่จะรับอินพุตด้วยวิธีอื่น ๆ เช่น3HและKDแทน
อินพุตสามารถอยู่ในรูปแบบที่สะดวก แต่คุณไม่สามารถรวมรายการชุดเข้าด้วยกันในตัวแปรหนึ่งและรายการอันดับในอีกชุดได้ 'D5', 'H3' ..
และ [['D',5],['H',3] ...
ใช้ได้ทั้งคู่ แต่'DHCH',[5,3,1,5]
ไม่ใช่ คุณไม่สามารถใช้ตัวเลขแทนตัวอักษรยกเว้นT
เอาท์พุต
การ์ดที่ซ่อนอยู่ในรูปแบบเดียวกับอินพุต
ตัวอย่าง
ลองทำแบบทดสอบ:
Input:
D3 S6 H3 H9
เรารู้ว่าการ์ดที่ซ่อนเป็นเพชรเนื่องจากไพ่ใบแรกเป็นเพชร นอกจากนี้เรายังรู้ว่ายศเป็น4,5,6,7,8 หรือ 9ตั้งแต่ยศบัตรแรกคือ3
บัตรที่เหลือจะได้รับคำสั่ง6,3,9 ==> M, S, Lซึ่ง encodes ค่า3 บัตรที่ซ่อนอยู่ดังนั้นจึงเป็น3 + 3 = 6ของเพชรจึงส่งออกควรจะD6
กรณีทดสอบ:
C3 H6 C6 S2
C9 # The order is LMS (H6 > C6, and 2 < 6). 3+6=9
SQ S4 S3 ST # (ST = S10. Format is optional)
S2 # The order is MSL. 12+3=2
HA CA DA SA
H2 # The order is SML. 14+1=2
นี่คือรหัสกอล์ฟดังนั้นทางออกที่สั้นที่สุดในแต่ละภาษาชนะ คำอธิบายได้รับการสนับสนุน!
1มีสี่ชุด ( C lubs, D iamonds, H earts และS pades)
2มี 13 ตำแหน่งเป็น2,3,4,5,6,7,8,9,10, J, Q, K, A คุณอาจเลือกที่จะใช้Tแทน10
92427**3
และแก้ไขk+7
เพื่อk+8
บันทึก 1 ไบต์:a=>(k='A23456789TJQK'+92427**3)[[[r,s],...x]=a.map((c,i)=>[k.search(c[0])+10,c[1],i]),(r-k[x.sort().map(c=>k=k*2|c[2])|k+8])%13]+s