Gizli Noel Baba - Revisited


11

Noel hızla yaklaşıyor ve onunla birlikte, yıllık aile Gizli Santa düzenliyor. Bu konuda bir başlangıç ​​yapmak istiyorum, ancak çiftlerin birbirleri için satın almadığından emin olmak sorunlara neden olmaya devam ediyor ve bunu yıllarca yapmasına rağmen Bob, birçok hediye için hediye satın alma konusunda oldukça saçma olan bir sorun var. , Erinhayal kırıklığına uğrayacaktır, ancak bunun FrankTalisker'i sevdiğini biliyor , bu yüzden onun için iyi bir eşleşme. Bu, mevcut basit çözümlerin hiçbirini ihtiyaçlarım için kabul edilebilir hale getirmiyor.

Hayatımı kolaylaştırmak için göreviniz, bir dizi dizi (veya seçtiğiniz dilde en yakın alternatif) verildiğinde, 'hediyelik eşyalar' eşleştirmesini döndüren (veya çıktılar) bir işlev (veya dilinize en yakın alternatif) yazmaktır. Aşağıdaki koşulların karşılanması için bayt cinsinden mümkün olan en kısa kodda 'hediye' yazar:

  • Her ad, giriş verilerinden rasgele seçilen başka bir adla eşleştirilir (Sağlanan koşullara göre çıktıyı rasgele ayarlamak her zaman mümkün olmayabilir)
  • Adlara , sıralaması tutarlı olan bir bitişiklik matrisini temsil eden bayrakların bir listesi verilir , böylece sütun nsatırla aynı kişiyi belirtir n.
  • Koşullar karşılanamıyorsa, dilinizde yanlış bir şey döndürün.
  • Birden fazla çözüm varsa, programınız birçok kez çalıştırıldığında hepsini üretebilmelidir.

Sence hangisinin hangisi aile üyesi söylemek gerekiyor olarak yinelenen adlarla sunulan asla varsayabiliriz, ancak ayırt etmek boşluklar içeren verilerle sunulabilir Bob Seniordan Bob Junior! Kaynak verilerindeki 100 benzersiz ad gibi oldukça büyük aileler için sağlanan tüm test vakalarını bir saat içinde tamamlamalıdır (lütfen aşağıdaki örnek veri kümelerine bakın, bunların tümünü ayrılan süre içinde ayrıştırabilmeniz gerekir).

Örnek girdi:

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"]
]

Dile bağlı olarak, girdi üzerinde örneği detaylar için, başka biçimlerde olabilir STDIN olabilir olarak sağlanacaktır:

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'

Çıktı, diliniz için en kolay olan herhangi bir makul biçimde de sağlanabilir. Kabul edilebilir biçimler, bir dizi diziyi (yukarıdaki gibi) veya belki bir karma / Object/ ilişkilendirilebilir diziyi içerir veya hatta şu satırları şu şekilde yazdırır STDOUT:

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

Şüpheniz varsa, lütfen cevabınızla gerekli girdi formatı ve beklenen çıktı formatı hakkında sorular sorun ve sağlayın.

Referans JavaScript uygulaması .

Daha büyük veri setleri: 100 , 100 , 200 , 200 - birçok çözüm , 200 - sadece bir çözüm .

Referans uygulaması tüm bunları makinemdeki <4s içinde tamamlar.

Bu komut dosyasıyla oluşturulan yukarıdaki setler .


1
Alt dizilerin öğelerinin üst dizininkiyle aynı sırada olduğunu varsayalım mı? Ve 1kth subarray'ın (n + 1) th elementinde kth kişinin n'inci kişiye verebileceği anlamına mı geliyor?
msh210

@ msh210 Gerçekten, ayrıntılı olmadığı için özür dilerim, onaylamak için soruyu güncelleyeceğim.
Dom Hastings

İlk örnekte, ile arasında bir eşleme Bobsağlar Erin? Sadece itibaren bir bakınız Eriniçin Bob.
LegionMammal978

@ LegionMammal978 Ahhh, bu mükemmel bir soru ve sadece bir düzenleme tarafından cevaplanabilecek bir soru ... Özür dileriz! Sabit!
Dom Hastings

1
N0! Noel için erken yol! Bu hediye veren gizli Türkiye olmalı.
Grant Davis

Yanıtlar:


4

Javascript ES6, 191

Bu çözüm tüm olası eşleştirmeleri bir çiftler listesi listesi olarak döndürür:

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]])))

Örnek çalışma:

>> 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" ]

Daha büyük test senaryolarına dayanarak, bunun tüm permütasyonları oluşturduğu için başarısız olacağını düşünüyorum ... Makinenizdeki daha büyük setler için bitirdiğini doğrulayabiliyor musunuz? Teşekkürler! Bu büyük setlerin ilk başta orada olmadığı için özür dileriz.
Dom Hastings
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.