誰がノナリーゲームから逃れることができますか?


12

Nonary Gameは、同じ名前のビデオゲーム3部作で行われる架空のゲームです。あなたの目標は、可能な限り数バイトのコードで、特定のゲームから何人のプレイヤーが脱出できるかを見つけることです。

ゲームのルール

  • 1から9までの9人のプレイヤーがいます。
  • すべてのプレイヤーは同じ部屋で始まります。
  • 任意の数のドアがあり、各ドアには1〜9の番号が付いています。ドア番号が重複または欠落している可能性があります。
  • ドアは部屋間の片道接続です。各ドアは一度しか使用できません
  • 3〜5人のプレイヤーのグループのみがドアを通過できます。
  • グループは、9を法とする数値合計が9を法とするドアの数と一致する場合にのみドアを通過できます。
  • 9ドアを通過したプレイヤーはすべて逃げます(勝ちます)。

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

<開始点を表します。すべてのプレイヤーがそこから始まります。

この設定では、誰もが脱出できます。これを実現するにはさまざまな方法がありますが、そのうちの1つは

  • [1、2、3、4、5]はドア6((1 + 2 + 3 + 4 + 5)%9 = 6)を通過し、[6、7、8、9]はドア3を通過します((6 + 7 + 8 + 9)%9 = 3)。全員が2番目の部屋で会います。
  • [1、2、3、7]はドア4を通り、[4、5、6、8、9]はドア5を通ります。
  • [1、2、3、4、8]は9つのドアの1つを通り、[5、6、7、9]はもう1つのドアを通ります。
┌───┬───┐
│   │   |
│ < 8   9
│   │   |
└───┴───┘ 

今回は、最大4人が脱出できます。

  • [1、3、5、8、9]はドア8を通過します。
  • [1、3、5、9]はドア9を通過します。

[2、3、4]や[1、4、6、7]などの生存者の他のリストも可能ですが、4人以上が逃げる方法はありません。

チャレンジ

マップが与えられたら、脱出できるプレイヤーの最大数を出力します。

  • 心配しないでください、あなたは私のひどい図を解析する必要はありません!入力はラベル付きの有向グラフであり、任意の便利な形式(エッジセット、隣接行列など)で表すことができます。
  • リプレゼンテーションで部屋のラベルが必要な場合は、一貫した値のセットを使用できます。ただし、ドアは1〜9の整数で表す必要があります。
  • 入力には常に少なくとも1つの9ドアがあります。9つのドアはすべて出口に通じていますが、他のドアは通っていません。
  • あなたの提出物は、機能または完全なプログラムになります。
  • 標準的な抜け穴は禁止されています。

テストケース

入力は、[部屋から部屋へのドア番号]トリプレットのリストとして表示され、0が開始部屋、-1が出口です。別の形式を使用する場合は、適切に変換する必要があります。

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
ゲームが999の遺物であることは知っていますが、ドア0から逃げたくないので、ドア番号を9で変更する必要があるというバグがあります
。–

いくつかのドアが部屋を迂回することを説明と絵の例でより明確にする価値があるかもしれません。また、ドアは後戻りできますか?つまり、0-> 1-> exitに行く人もいれば、0-> 2-> 1-> exitに行く人もいます。
ニックケネディ

@NickKennedyは、「バイパス」の意味がわかりません。ドアは、任意の部屋を他の部屋に接続できます。それは有向グラフです。
グリムミー

誰かがミスをするとすぐに、この一連のルールが自発的な爆発の脅威でさらに面白くなると思われる場合は、ゲームを試してみてください。それは素晴らしい。
散布

@Grimy確かですが、絵の例と最初の5つの実際の例には、ある部屋から次の部屋へと続くすべてのドアがあります。
ニックケネディ

回答:


7

JavaScript(ES6)、219バイト

文字列の代わりにビットマスクを使用した、低速ですが非常に短いバージョン。

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

オンラインでお試しください!

バツバツそしてp0pバツ


JavaScript(ES7)、 293 272  271バイト

チャレンジで説明されている形式で入力を受け取ります。これはブルートフォース検索です。

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

オンラインでお試しください!(TIOで最初のテストケースがタイムアウトする)

どうやって?

配列にP[]は、各部屋のプレーヤーを説明する文字列のリストが保持されます。

P=['241375698']176=241375690

Xpositionの各部屋についてr、次のpowersetを計算しXます。

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

pそこにいるプレイヤーの各グループおよび[d,s,t]indexの各ドアについてj、グループがドアを通過できないかどうかをテストします。

                         // 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

グループが合格した場合、再帰呼び出しを行います。

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

エスケープされたプレイヤーの最大数を追跡しm、最終的にそれを返します。


あらゆる可能性を試しているだけですか?
ジョナ

1
@ジョナはい。入力によって暗示される制約に応じて、非常に高速または非常に低速になります。
アーナルド

2

ゼリー、76バイト

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

オンラインでお試しください!

単一の引数、部屋1、2、...、および0を出口として使用する有向グラフを取る完全なプログラム。エスケープできる最大数である整数を返します。続く完全な説明。

Ṣ€€Q4バイトの節約のためにを使用せずに実行する必要がありますが、残りは遅くなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.