Secret Santa - เยือนแล้ว


11

คริสต์มาสกำลังใกล้เข้ามาอย่างรวดเร็วพร้อมกับจัดระเบียบความลับประจำปีของครอบครัวซานต้า ฉันต้องการที่จะลองและเริ่มต้นในเรื่องนี้ แต่ทำให้แน่ใจว่าคู่รักจะไม่ซื้อให้ซึ่งกันและกันทำให้เกิดปัญหาและแม้จะทำสิ่งนี้มานานหลายปีก็ยังมีปัญหาที่Bobขยะสวยที่ซื้อของขวัญสำหรับ giftees ส่วนใหญ่ , Erinมีแนวโน้มที่จะผิดหวัง แต่เขารู้ดีว่าFrankชอบ Talisker ดังนั้นเขาจึงเป็นคู่ที่ดีสำหรับเขา สิ่งนี้ทำให้ไม่มีโซลูชันแบบง่าย ๆ ที่ยอมรับได้สำหรับความต้องการของฉัน

เพื่อให้ชีวิตของฉันง่ายขึ้นงานของคุณคือการเขียนฟังก์ชั่น (หรือทางเลือกที่ใกล้เคียงที่สุดในภาษาของคุณ) ว่าเมื่อได้รับอาร์เรย์ (หรือทางเลือกที่ใกล้เคียงที่สุดในภาษาที่คุณเลือก) ผลตอบแทน (หรือเอาท์พุท) เป็นการจับคู่ 'gifters' 'giftees' ในรหัสที่สั้นที่สุดที่เป็นไปได้ในไบต์เช่นว่าเงื่อนไขต่อไปนี้จะได้พบ:

  • แต่ละชื่อจะถูกจับคู่กับชื่ออื่นที่สุ่มเลือกจากข้อมูลอินพุต (โปรดทราบว่าอาจไม่สามารถสุ่มผลลัพธ์ได้ตามเงื่อนไขที่กำหนด)
  • ชื่อจะได้รับรายการของธงที่เป็นตัวแทนต์เมทริกซ์ถ้อยคำที่มีการสั่งซื้อที่สอดคล้องกันดังนั้นคอลัมน์นั้นหมายถึงการเป็นบุคคลเดียวกับแถวnn
  • หากไม่สามารถปฏิบัติตามเงื่อนไขได้ให้ส่งคืนสิ่งที่เป็นเท็จในภาษาของคุณ
  • หากมีหลายวิธีโปรแกรมของคุณจะต้องสามารถสร้างได้ทั้งหมดหากทำงานหลายครั้ง

คุณสามารถสันนิษฐานได้ว่าคุณจะไม่ถูกนำเสนอที่มีชื่อซ้ำกันในขณะที่เราจะต้องสามารถที่จะบอกว่าเป็นสมาชิกในครอบครัวซึ่ง แต่คุณอาจจะนำเสนอกับข้อมูลที่มีช่องว่างที่จะแยกความแตกต่างBob SeniorจากBob Junior! มันควรจะเสร็จสิ้นกรณีทดสอบที่ให้มาทั้งหมดภายในหนึ่งชั่วโมงสำหรับครอบครัวขนาดใหญ่ที่น่ารักเช่น 100 ชื่อที่ไม่ซ้ำกันในแหล่งข้อมูล (โปรดดูตัวอย่างชุดข้อมูลด้านล่างคุณจะต้องสามารถแยกวิเคราะห์เหล่านี้ทั้งหมดภายในเวลาที่กำหนด)

อินพุตตัวอย่าง:

santa([
    ["Alice", 0, 0, 1, 1, 1, 1, 1],
    ["Bob",   0, 0, 0, 0, 0, 1, 0],
    ["Carla", 1, 1, 0, 0, 0, 1, 1],
    ["Dan",   1, 1, 0, 0, 0, 1, 1],
    ["Erin",  1, 1, 0, 0, 0, 1, 1],
    ["Frank", 1, 1, 1, 1, 1, 0, 1],
    ["Gary",  1, 1, 1, 1, 1, 1, 0]
]);
// might return something like:
[
    ["Alice", "Erin"],
    ["Bob", "Frank"],
    ["Carla", "Alice"],
    ["Dan", "Gary"],
    ["Erin", "Bob"],
    ["Frank", "Dan"],
    ["Gary", "Carla"]
]
santa([
    ["Alice", 0, 1, 1, 1, 0, 1],
    ["Bob",   0, 0, 1, 1, 0, 1],
    ["Carla", 0, 1, 0, 1, 0, 1],
    ["Dan",   0, 1, 1, 0, 0, 0],
    ["Erin",  0, 0, 1, 0, 0, 1],
    ["Frank", 1, 1, 1, 1, 1, 0]
]);
false
santa([
    ["Alice", 0, 1, 1],
    ["Bob",   1, 0, 1],
    ["Carla", 1, 1, 0]
]);
[
    ["Alice", "Bob"],
    ["Bob", "Carla"],
    ["Carla", "Alice"]
]

ขึ้นอยู่กับภาษาการป้อนข้อมูลสามารถอยู่ในรูปแบบอื่น ๆ สำหรับรายละเอียดเกี่ยวกับอินสแตนซ์STDIN อาจจะให้เป็น:

script <<< 'Alice,0,0,1,1,1,1,1
Bob,0,0,0,0,0,1,0
Carla,1,1,0,0,0,1,1
Dan,1,1,0,0,0,1,1
Erin,1,1,0,0,0,1,1
Frank,1,1,1,1,1,0,1
Gary,1,1,1,1,1,1,0'

นอกจากนี้ยังสามารถให้ผลลัพธ์ในรูปแบบที่เหมาะสมได้ตามความเหมาะสมกับภาษาของคุณ รูปแบบที่ยอมรับได้รวมถึงอาร์เรย์ของอาร์เรย์ (ตามด้านบน) หรืออาจเป็น hash / Object/ อาเรย์แบบเชื่อมโยงหรือแม้แต่พิมพ์ parings ไปที่STDOUT:

Alice:Dan
Bob:Erin
Carla:Bob
Dan:Alice
Erin:Frank
Frank:Carla

หากมีข้อสงสัยกรุณาถามและให้ตัวอย่างของรูปแบบอินพุตที่ต้องการและรูปแบบผลลัพธ์ที่คาดหวังพร้อมคำตอบของคุณ

ดำเนินการอ้างอิง JavaScript

ขนาดใหญ่ชุดข้อมูล: 100 , 100 , 200 , 200 - หลายโซลูชั่น , 200 - เพียงหนึ่งวิธีการแก้ปัญหา

การติดตั้งอ้างอิงเสร็จสมบูรณ์ทั้งหมดใน <4s บนเครื่องของฉัน

ชุดด้านบนที่สร้างด้วยสคริปต์นี้


1
เราจะถือว่าองค์ประกอบของ subarrays อยู่ในลำดับเดียวกันกับ parent array หรือไม่? และนั่น1ในองค์ประกอบย่อยของ kth (n + 1) หมายความว่าบุคคลที่ kth สามารถมอบให้กับบุคคลที่ n ได้หรือไม่
msh210

@ msh210 แน่นอนว่าขอโทษที่ไม่ใช้คำพูดให้ละเอียดฉันจะอัปเดตคำถามเพื่อยืนยัน
Dom Hastings

ในตัวอย่างแรกมันให้การแมปจากBobที่Erinใด ฉันเพียงแค่เห็นหนึ่งจากการErin Bob
LegionMammal978

@ LegionMammal978 Ahhh นั่นเป็นคำถามที่ยอดเยี่ยมและเป็นสิ่งที่สามารถตอบได้โดยการแก้ไข ... ขอโทษ! แก้ไขแล้ว!
Dom Hastings

1
N0! มันเป็นวิธีที่จะต้นสำหรับคริสต์มาส! นี่น่าจะเป็นความลับตุรกีที่แจกของกำนัล
Grant Davis

คำตอบ:


4

Javascript ES6, 191

วิธีนี้จะคืนค่าการจับคู่ที่เป็นไปได้ทั้งหมดเป็นรายการของคู่:

f=l=>(h=l=>l.length,n=l.map(i=>i.shift()),o=[],(r=s=>(g=h(s))<h(n)?l[g].map((e,x)=>e&&r([...s,x])):o.push([...s]))([]),o.filter(i=>h([...new Set(i)])==h(n)).map(l=>l.map((t,f)=>[n[f],n[t]])))

ตัวอย่างการเรียกใช้:

>> example = f([
    ["Alice", 0, 0, 1, 1, 1, 1, 1],
    ["Bob",   0, 0, 0, 0, 0, 1, 0],
    ["Carla", 1, 1, 0, 0, 0, 1, 1],
    ["Dan",   1, 1, 0, 0, 0, 1, 1],
    ["Erin",  1, 1, 0, 0, 0, 1, 1],
    ["Frank", 1, 1, 1, 1, 1, 0, 1],
    ["Gary",  1, 1, 1, 1, 1, 1, 0]])

<< Array [ Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], 26 more… ]

>> example[0]

<< Array [ "Alice:Carla", "Bob:Frank", "Carla:Alice", "Dan:Bob", "Erin:Gary", "Frank:Dan", "Gary:Erin" ]

ฉันคิดว่าจากกรณีทดสอบที่ใหญ่กว่านี้จะล้มเหลวเพราะสร้างวิธีเรียงสับเปลี่ยนทั้งหมด ... คุณสามารถตรวจสอบความถูกต้องของชุดขนาดใหญ่บนเครื่องของคุณหรือไม่ ขอบคุณ! ขอโทษที่ชุดใหญ่เหล่านี้ไม่ได้มีในตอนแรก
Dom Hastings
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.