Ai có thể thoát khỏi trò chơi Nonary?


12

Trò chơi Nonary là một trò chơi hư cấu được chơi trong bộ ba trò chơi video cùng tên. Mục tiêu của bạn là tìm ra có bao nhiêu người chơi (tốt nhất) có thể thoát khỏi một trò chơi nhất định, với càng ít byte mã càng tốt.

Nội quy của trò chơi

  • Có 9 người chơi, được đánh số từ 1 đến 9.
  • Tất cả người chơi bắt đầu trong cùng một phòng.
  • Có bất kỳ số lượng cửa, mỗi cửa có số lượng từ 1 đến 9. Có thể có số cửa trùng lặp hoặc thiếu.
  • Cửa là kết nối một chiều giữa các phòng. Mỗi cửa chỉ có thể được sử dụng một lần .
  • Chỉ các nhóm từ 3 đến 5 người chơi có thể đi qua một cánh cửa.
  • Một nhóm chỉ có thể đi qua một cánh cửa nếu tổng các số modulo 9 của họ khớp với số modulo 9 của cửa đó.
  • Bất kỳ người chơi nào đi qua 9 cửa thoát (thắng).

Ví dụ

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

<đại diện cho điểm bắt đầu. Tất cả người chơi bắt đầu từ đó.

Trong cài đặt này, mọi người đều có thể trốn thoát. Có nhiều cách khác nhau để đạt được điều này, một trong số đó là:

  • [1, 2, 3, 4, 5] đi qua cửa 6 ((1 + 2 + 3 + 4 + 5)% 9 = 6), trong khi [6, 7, 8, 9] đi qua cửa 3 ((6 + 7 + 8 + 9)% 9 = 3). Mọi người gặp nhau trong phòng thứ hai.
  • [1, 2, 3, 7] đi qua cửa 4, trong khi [4, 5, 6, 8, 9] đi qua cửa 5.
  • [1, 2, 3, 4, 8] đi qua một trong 9 cửa, [5, 6, 7, 9] đi qua cửa kia.
┌───┬───┐
│   │   |
│ < 8   9
│   │   |
└───┴───┘ 

Lần này, nhiều nhất 4 người có thể trốn thoát:

  • [1, 3, 5, 8, 9] đi qua cửa 8.
  • [1, 3, 5, 9] đi qua cửa 9.

Danh sách những người sống sót khác là có thể, chẳng hạn như [2, 3, 4] hoặc [1, 4, 6, 7], nhưng không có cách nào để hơn 4 người trốn thoát.

Các thách thức

Đưa ra một bản đồ, xuất số lượng người chơi tối đa có thể thoát.

  • Đừng lo lắng, bạn không cần phải phân tích sơ đồ khủng khiếp của tôi! Đầu vào là một biểu đồ được định hướng có nhãn, mà bạn có thể biểu thị ở bất kỳ định dạng thuận tiện nào (bộ cạnh, ma trận kề ...).
  • Nếu đại diện của bạn yêu cầu nhãn cho phòng, bạn có thể sử dụng bất kỳ bộ giá trị nhất quán nào. Tuy nhiên, cửa phải được đại diện bởi các số nguyên 1 đến 9.
  • Đầu vào sẽ luôn có ít nhất một 9 cửa. Tất cả 9 cửa luôn dẫn đến lối ra, trong khi các cửa khác không bao giờ làm được.
  • Trình của bạn có thể là một chức năng hoặc chương trình đầy đủ.
  • Sơ hở tiêu chuẩn bị cấm.

Các trường hợp thử nghiệm

Các đầu vào được hiển thị dưới dạng danh sách [số cửa, từ phòng, đến phòng] bộ ba, với 0 là phòng bắt đầu và -1 là lối ra. Nếu bạn chọn sử dụng định dạng khác, bạn sẽ phải chuyển đổi chúng một cách thích hợp.

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
Tôi biết đó là di tích của trò chơi 999, nhưng tôi nhận ra rằng bạn cần sửa số cửa bằng 9 vì họ không muốn trốn thoát qua Cửa 0.
Veskah

Có thể đáng để làm rõ hơn trong các ví dụ mô tả và hình ảnh rằng một số cửa vượt qua các phòng. Ngoài ra cửa có thể đi ngược? Tức là một số người có thể đi 0-> 1-> thoát và những người khác đi 0-> 2-> 1-> thoát?
Nick Kennedy

@NickKennedy không chắc ý của bạn là gì bởi bypass bypass. Cửa có thể kết nối bất kỳ phòng với bất kỳ phòng khác. Đó là một đồ thị có hướng.
Grimmy

Nếu bạn nghĩ rằng loạt quy tắc này có thể trở nên thú vị hơn với mối đe dọa bùng nổ tự phát ngay khi có ai mắc lỗi, xin hãy thử trò chơi. Thật tuyệt vời.
phân tán

@Grimy chắc chắn, nhưng các ví dụ bằng hình ảnh và 5 ví dụ thực tế đầu tiên có tất cả các cửa dẫn từ phòng này sang phòng kế tiếp bên phải.
Nick Kennedy

Câu trả lời:


7

JavaScript (ES6), 219 byte

Một phiên bản chậm hơn nhưng ngắn hơn đáng kể bằng cách sử dụng bitmasks thay vì chuỗi.

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

Hãy thử trực tuyến!

Lưu ý: Lý do tại sao nó chậm hơn là vì chúng tôi không tính toán sức mạnh của người chơi. Đưa ra một chút của người chơiX(Xp)0pX


JavaScript (ES7),  293 272  271 byte

Đưa đầu vào theo định dạng được mô tả trong thử thách. Đây là một tìm kiếm vũ phu.

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

Hãy thử trực tuyến! (trường hợp thử nghiệm đầu tiên hết thời gian trên TIO)

Làm sao?

Mảng P[]chứa một danh sách các chuỗi mô tả các cầu thủ trong mỗi phòng.

P=['241375698']176= =241375690

Đối với mỗi phòng Xtại vị trí r, chúng tôi tính toán quyền hạn của X:

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

Đối với từng nhóm người chơi ptrong đó và cho từng cửa [d,s,t]theo chỉ số j, chúng tôi sẽ kiểm tra xem nhóm đó có thể đi qua cửa không:

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

Nếu nhóm có thể vượt qua, chúng tôi thực hiện một cuộc gọi đệ quy:

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

Chúng tôi theo dõi số lượng người chơi trốn thoát tối đa mvà cuối cùng trả lại.


Bạn chỉ đang thử tất cả các khả năng?
Giô-na

1
@Jonah Vâng. Nó có thể rất nhanh hoặc rất chậm tùy thuộc vào các ràng buộc ngụ ý của đầu vào.
Arnauld

2

Thạch , 76 byte

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

Hãy thử trực tuyến!

Một chương trình đầy đủ lấy một đối số duy nhất, biểu đồ có hướng sử dụng các phòng 1, 2, ... và 0 làm lối ra. Trả về một số nguyên là số tối đa có thể thoát. Giải thích đầy đủ để làm theo.

Nên chạy mà không cần Ṣ€€Qtiết kiệm 4 byte nhưng chậm để nghỉ ngơi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.