Nonary Oyunundan kim kaçabilir?


13

Nonary Game, aynı adlı video oyunu üçlemesinde oynanan kurgusal bir oyundur. Amacınız belirli bir oyunda kaç oyuncunun (en iyi) kaç bayt kodla kaçabileceğini bulmaktır.

Oyunun kuralları

  • 1'den 9'a kadar 9 oyuncu var.
  • Tüm oyuncular aynı odada başlar.
  • Her biri 1 ila 9 numaraya sahip herhangi bir sayıda kapı vardır. Yinelenen veya eksik kapı numaraları olabilir.
  • Kapı, odalar arasında tek yönlü bağlantıdır. Her kapı sadece bir kez kullanılabilir .
  • Sadece 3 ila 5 oyuncudan oluşan gruplar bir kapıdan geçebilir.
  • Bir grup, ancak modulo 9 sayılarının toplamı kapının sayı modulo 9'uyla eşleşiyorsa kapıdan geçebilir .
  • 9 kapıdan geçen oyuncular kaçar (kazanır).

Örnekler

┌───┬───┬───┐
│   6   4   9
│ < │   |   |
│   3   5   9
└───┴───┴───┘ 

<başlangıç ​​noktasını temsil eder. Tüm oyuncular oradan başlar.

Bu ortamda herkes kaçabilir. Bunu başarmanın çeşitli yolları vardır, bunlardan biri:

  • [1, 2, 3, 4, 5] 6 numaralı kapıdan geçiyor ((1 + 2 + 3 + 4 + 5)% 9 = 6), [6, 7, 8, 9] 3 numaralı kapıdan geçiyor ((6 + 7 + 8 + 9)% 9 = 3). Herkes ikinci odada toplanır.
  • [1, 2, 3, 7] kapı 4'ten geçerken, [4, 5, 6, 8, 9] kapı 5'ten geçer.
  • [1, 2, 3, 4, 8] 9 kapıdan birinden geçer, [5, 6, 7, 9] diğerinden geçer.
┌───┬───┐
│   │   |
│ < 8   9
│   │   |
└───┴───┘ 

Bu sefer en fazla 4 kişi kaçabilir:

  • [1, 3, 5, 8, 9] 8 numaralı kapıdan geçer.
  • [1, 3, 5, 9] 9 numaralı kapıdan geçer.

Hayatta kalanların diğer listeleri, örneğin [2, 3, 4] veya [1, 4, 6, 7] mümkündür, ancak 4'ten fazla kişinin kaçması mümkün değildir.

Meydan okuma

Bir harita verildiğinde, kaçabilecek maksimum oyuncu sayısını çıkar.

  • Endişelenme, korkunç diyagramlarımı ayrıştırmana gerek yok! Giriş, herhangi bir uygun biçimde (kenar kümesi, bitişiklik matrisi ...) temsil edebileceğiniz etiketli bir yönlendirilmiş grafiktir.
  • Temsiliniz odalar için etiketler gerektiriyorsa, tutarlı bir değer kümesi kullanabilirsiniz. Ancak kapılar 1 ile 9 arasında bir tamsayı ile temsil edilmelidir.
  • Giriş her zaman en az bir 9 kapılı olacaktır. 9 kapının tümü daima çıkışa yol açarken, diğer kapılar asla açılmaz.
  • Gönderiniz bir işlev veya tam program olabilir.
  • Standart boşluklar yasaklanmıştır.

Test senaryoları

Girişler, [başlangıç ​​numarası, odadan odaya] üçüzlerinin listeleri olarak gösterilir; 0, başlangıç ​​odası ve -1 çıkıştır. Başka bir biçim kullanmayı seçerseniz, bunları uygun şekilde dönüştürmeniz gerekir.

Input                                                                      Output
[[6, 0, 1], [3, 0, 1], [4, 1, 2], [5, 1, 2], [9, 2, -1], [9, 2, -1]]       9
[[8, 0, 1], [9, 1, -1]]                                                    4
[[9, 0, -1]]                                                               5
[[2, 0, 1], [1, 1, 2], [9, 2, -1]]                                         0
[[2, 0, 1], [3, 1, 2], [9, 2, -1]]                                         3
[[1, 0, 1], [9, 1, -1], [1, 0, 2], [9, 2, -1]]                             4
[[2, 0, 1], [3, 0, 1], [5, 1, 2], [4, 0, 2], [9, 2, -1], [9, 2, -1]]       8
[[3, 0, 1], [4, 0, 1], [5, 0, 1], [9, 1, -1], [7, 1, 2], [9, 2, -1]]       7
[[1, 0, 1], [2, 0, 1], [4, 0, 1], [9, 1, -1], [8, 1, 2], [9, 2, -1]]       6
[[6, 0, 1], [7, 0, 1], [9, 1, -1], [9, 1, -1]]                             7

4
Bu oyunun bir kalıntısının 999 olduğunu biliyorum, ancak kapı numarasını 9 ile değiştirmen gerekiyor, çünkü Kapı 0'dan kaçmak istemiyorlar.
Veskah

Bazı kapıların odaları atlattığı açıklama ve resimsel örneklerde açıklığa kavuşturmaya değer olabilir. Ayrıca kapılar geriye doğru gidebilir mi? Yani bazı insanlar 0-> 1-> çıkışa, diğerleri 0-> 2-> 1-> çıkışa gidebilir mi?
Nick Kennedy

@NickKennedy “bypass” ile ne demek istediğinizi bilmiyor. Kapılar herhangi bir odayı başka bir odaya bağlayabilir. Yönlendirilmiş bir grafik.
Grimmy

Bu kurallar dizisi, herhangi bir hata yapılır yapılmaz kendiliğinden patlama tehdidi ile daha ilginç hale getirilebileceğini düşünüyorsanız, lütfen oyunu deneyin. Bu harika.
dağılım

@Kesinlikle, ama resimli örnekler ve ilk 5 gerçek örnek, bir odadan diğerine doğru giden tüm kapılara sahiptir.
Nick Kennedy

Yanıtlar:


7

JavaScript (ES6), 219 bayt

Dizeler yerine bit maskeleri kullanan daha yavaş ama çok daha kısa bir sürüm.

f=(D,P=[511],e=m=0)=>P.map((X,r)=>[...Array(-~X)].map((_,p)=>D.map(([d,s,t],j)=>(N=(g=(n,k)=>n&&n%2+g(n>>1,++k,x+=n%2*k))(p&=X,x=0))<3|N>5|r-s|x%9^d%9||f(D.filter(_=>j--),A=[...P],e+!~t*N,A[r]^=p,A[t]^=p))),m=m>e?m:e)|m

Çevrimiçi deneyin!

X(XVEp)0pX


JavaScript (ES7),  293  272271 bayt

Girdiyi meydan okumada açıklanan formatta alır. Bu kaba kuvvet arayışıdır.

f=(D,P=[17**6+'8'],e=m=0)=>P.map((X,r)=>X&&[...X].reduce((a,x)=>[...a,...a.map(y=>y+x)],['']).map(p=>D.map(([d,s,t],j)=>p<99|p[5]|r-s|eval([...p].join`+`)%9^d%9||f(D.filter(_=>j--),A=[...P],e+!~t*p.length,A[r]=X.replace(eval(`/[${p}]/g`),''),A[t]=[A[t]]+p))),m=m>e?m:e)|m

Çevrimiçi deneyin! (ilk test durumu TIO'da zaman aşımına uğradı)

Nasıl?

Dizi P[], her odadaki oyuncuları tanımlayan dizelerin bir listesini tutar.

P=['241375698']176=241375690

XPozisyondaki her bir oda için raşağıdakilerin güç kümesini hesaplıyoruz X:

[...X].reduce((a, x) => [...a, ...a.map(y => y + x)], [''])

pOradaki her bir oyuncu grubu için [d,s,t]ve indeksteki her bir kapı için j, grubun kapıdan geçip geçemediğini test ediyoruz:

                         // we can't pass if:
p < 99 |                 // there are less than 3 players
p[5] |                   // or there are more than 5 players
r - s |                  // or the source room s is not equal to the current room
eval([...p].join`+`) % 9 // or the sum of the players modulo 9
^ d % 9                  // does not match the ID of the door modulo 9

Grup geçebilirse, özyinelemeli bir çağrı yaparız:

f(                       //
  D.filter(_ => j--),    // remove the door that has just been used from D[]
  A = [...P],            // use a copy A[] of P[]
  e + !~t * p.length,    // if t = -1, add the length of p to e (number of escaped guys)
  A[r] = X.replace(      // remove the players from the source room A[r]
    eval(`/[${p}]/g`),   //
    ''                   //
  ),                     //
  A[t] = [A[t]] + p      // and append them to the target room A[t]
)                        //

Kaçan maksimum oyuncu sayısını takip ediyor mve sonunda geri veriyoruz .


Sadece tüm olasılıkları mı deniyorsun?
Jonah

1
@Jonah Evet. Girişin getirdiği kısıtlamalara bağlı olarak çok hızlı veya çok yavaş olabilir.
Arnauld

2

Jöle , 76 bayt

2ịịœc3r5¤ẎS,%9EʋƇ1ị${ḟ@;ƭⱮ€Ḋị¥ż€Ḋ{ṛṪ}¦ƒ€
ç@€Ẏ;ḷṢ€€Q
“”WẋḊ€FṀƊ9RW¤;Wçƒ@⁸ẈṪ$€Ṁ

Çevrimiçi deneyin!

Tek bir argüman alan tam bir program, çıkış olarak 1, 2, ... ve 0 odalarını kullanan yönlendirilmiş bir grafik. Kaçabilecek maksimum sayı olan bir tam sayı döndürür. Takip etmek için tam açıklama.

Olmadan çalıştırmak Ṣ€€Qiçin 4 baytlık bir tasarruf ama yavaş dinlenmek.

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.