ใครบ้างที่สามารถหลบหนีเกม Nonary ได้?


13

เกม Nonary เป็นเกมสวมบทบาทที่เล่นในวิดีโอเกมตอนจบที่มีชื่อเดียวกัน เป้าหมายของคุณคือค้นหาว่ามีผู้เล่นกี่คน (ที่ดีที่สุด) สามารถหลบหนีเกมที่กำหนดได้โดยใช้โค้ดน้อยที่สุด

กฎของเกม

  • มีผู้เล่น 9 คนหมายเลข 1 ถึง 9
  • ผู้เล่นทุกคนเริ่มต้นในห้องเดียวกัน
  • มีประตูจำนวนหนึ่งแต่ละอันมีหมายเลข 1 ถึง 9 อาจมีหมายเลขประตูซ้ำหรือหายไป
  • ประตูมีการเชื่อมต่อทางเดียวระหว่างห้อง แต่ละประตูสามารถใช้ได้เพียงครั้งเดียว
  • มีเพียงกลุ่มที่มีผู้เล่น 3 ถึง 5 คนเท่านั้นที่สามารถผ่านเข้าประตูได้
  • กลุ่มสามารถผ่านประตูได้ถ้าผลรวมของตัวเลขโมดูโล 9ตรงกับหมายเลขโมดูโล 9ของประตู
  • ผู้เล่นที่ผ่านประตู 9 ช่อง (ชนะ)

ตัวอย่าง

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

<แสดงถึงจุดเริ่มต้น ผู้เล่นทุกคนเริ่มต้นที่นั่น

ในการตั้งค่านี้ทุกคนสามารถหลบหนี มีหลายวิธีในการบรรลุเป้าหมายซึ่งหนึ่งในนั้นคือ:

  • [1, 2, 3, 4, 5] ไปที่ประตู 6 ((1 + 2 + 3 + 4 + 5)% 9 = 6) ในขณะที่ [6, 7, 8, 9] ผ่านประตู 3 ((6 + 7 + 8 + 9)% 9 = 3) ทุกคนพบกันในห้องที่สอง
  • [1, 2, 3, 7] ผ่านประตู 4 ในขณะที่ [4, 5, 6, 8, 9] ผ่านประตู 5
  • [1, 2, 3, 4, 8] ผ่านหนึ่งใน 9 ประตู, [5, 6, 7, 9] ผ่านอีกประตูหนึ่ง
┌───┬───┐
│   │   |
│ < 8   9
│   │   |
└───┴───┘ 

เวลานี้อย่างน้อย 4 คนสามารถหลบหนี:

  • [1, 3, 5, 8, 9] ผ่านประตู 8
  • [1, 3, 5, 9] ผ่านประตู 9

รายชื่อผู้รอดชีวิตรายอื่นอาจเป็นไปได้เช่น [2, 3, 4] หรือ [1, 4, 6, 7] แต่ไม่มีทางที่จะหนีรอดได้มากกว่า 4 คน

ความท้าทาย

ได้รับแผนที่เอาท์พุทจำนวนสูงสุดของผู้เล่นที่สามารถหลบหนีได้

  • ไม่ต้องกังวลคุณไม่จำเป็นต้องแยกวิเคราะห์ไดอะแกรมอันยิ่งใหญ่ของฉัน! อินพุตเป็นกราฟกำกับที่มีป้ายกำกับซึ่งคุณสามารถนำเสนอในรูปแบบที่สะดวกใด ๆ (ชุดขอบเมทริกซ์ adjacency ... )
  • หากการเป็นตัวแทนของคุณต้องการป้ายกำกับสำหรับห้องคุณสามารถใช้ชุดของค่าที่สอดคล้องกัน อย่างไรก็ตามประตูจะต้องเป็นตัวแทนของจำนวนเต็ม 1 ถึง 9
  • อินพุตจะมีอย่างน้อยหนึ่งประตู 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 แต่มันทำให้ฉัน
สงสัย

มันอาจจะคุ้มค่าที่จะทำให้ชัดเจนขึ้นในคำอธิบายและตัวอย่างภาพที่ประตูบางบานเลี่ยงห้อง ประตูยังสามารถถอยหลังได้หรือไม่? นั่นคือบางคนอาจไปที่ทางออก>>> และคนอื่น ๆ ออกไป>> -> ออก>
Nick Kennedy

@NickKennedy ไม่แน่ใจว่าคุณหมายถึงอะไรโดย“ บายพาส” ประตูสามารถเชื่อมต่อห้องใดก็ได้กับห้องอื่น มันเป็นกราฟกำกับ
Grimmy

หากคุณคิดว่ากฎชุดนี้น่าสนใจยิ่งขึ้นกับการคุกคามของการระเบิดที่เกิดขึ้นเองทันทีที่ใครก็ตามทำผิดพลาดโปรดลองเล่นเกม มันเยี่ยมมาก
กระจาย

@Grimy แน่นอน แต่ภาพตัวอย่างและตัวอย่างจริง 5 ประการแรกมีประตูทั้งหมดที่นำจากห้องหนึ่งไปอีกห้องหนึ่งไปทางขวา
Nick Kennedy

คำตอบ:


7

JavaScript (ES6), 219 ไบต์

เวอร์ชันที่ช้ากว่า แต่สั้นกว่าอย่างมากโดยใช้ bitmasks แทนที่จะเป็นสตริง

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

ลองออนไลน์!

X(XANDp)0pX


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

สำหรับแต่ละห้องXที่อยู่ในตำแหน่งrเราคำนวณ powerset ของX:

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

สำหรับผู้เล่นแต่ละกลุ่มpในนั้นและสำหรับแต่ละประตู[d,s,t]ที่ดัชนี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และกลับมาในที่สุด


คุณเพียงแค่พยายามเป็นไปได้ทั้งหมดหรือไม่
Jonah

1
@Jonah ใช่ มันอาจจะเร็วมากหรือช้ามากขึ้นอยู่กับข้อ จำกัด ที่ระบุโดยอินพุต
Arnauld

2

เยลลี่ , 76 ไบต์

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

ลองออนไลน์!

โปรแกรมเต็มรูปแบบที่ใช้อาร์กิวเมนต์ตัวเดียวกราฟกำกับโดยใช้ห้อง 1, 2, ... และ 0 เป็นทางออก ส่งคืนจำนวนเต็มซึ่งเป็นจำนวนสูงสุดที่สามารถหลบหนีได้ คำอธิบายแบบเต็มเพื่อติดตาม

ควรรันโดยไม่มีการṢ€€Qบันทึก 4 ไบต์ แต่ให้พักได้ช้า

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