누가 Nonary Game을 벗어날 수 있습니까?


13

Nonary Game은 같은 이름의 비디오 게임 3 부작에서 재생되는 가상의 게임입니다. 당신의 목표는 가능한 적은 수의 코드로 주어진 게임을 탈출 할 수있는 플레이어 수를 찾는 것입니다.

게임의 규칙

  • 1에서 9까지 번호가 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 명 이상이 탈출 할 수는 없습니다.

도전

맵이 주어지면 탈출 할 수있는 최대 플레이어 수를 출력하십시오.

  • 걱정하지 마십시오. 끔찍한 다이어그램을 파싱 할 필요가 없습니다! 입력은 레이블이 지정된 직접 그래프로, 편리한 형식 (가장자리 세트, 인접 행렬 ...)으로 나타낼 수 있습니다.
  • 표현에 방 레이블이 필요한 경우 일관된 값 세트를 사용할 수 있습니다. 그러나 문은 정수 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라는 유물이라는 것을 알고 있지만 문 0을 통해 탈출하고 싶지 않기 때문에 문 번호를 9로 수정해야한다는 버그가 있습니다.
Veskah

설명과 그림의 예에서 일부 문이 방을 우회하는 것이 더 분명합니다. 또한 문이 뒤로 이동할 수 있습니까? 즉, 어떤 사람들은 0-> 1-> 종료하고 다른 사람들은 0-> 2-> 1-> 종료 할 수 있습니까?
Nick Kennedy

@NickKennedy는 "우회"의 의미를 잘 모릅니다. 문은 모든 방을 다른 방에 연결할 수 있습니다. 유 방향 그래프입니다.
Grimmy

만약 누군가 실수를하자마자 자발적인 폭발의 위협으로이 일련의 규칙들이 더 흥미로워 질 수 있다고 생각한다면, 게임을 시도해보십시오. 훌륭합니다.
산란

@ 그림은 확실하지만 그림의 예와 첫 5 개의 실제 예는 한 방에서 다음 방으로 이어지는 모든 문이 있습니다.
Nick Kennedy

답변:


7

자바 스크립트 (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

온라인으로 사용해보십시오!

X(XANDp)0pX


자바 스크립트 (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과 같은 결과를 계산합니다 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
@Jonah 예. 입력이 암시하는 제약 조건에 따라 매우 빠르거나 느릴 수 있습니다.
Arnauld

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.