교통 교차로 해결


26

작업

교통 교차로 구조를 취하고 차량이 통과 할 순서를 출력하는 프로그램 또는 기능을 작성하십시오.

출력은 다음과 같은 형식으로 많아야 네 줄 함유한다 #. x->y\n, #도트 다음 시퀀스 번호 번호를 ., x그리고 y문자이다 ["N", "E", "S", "W"]. 문자로 구분해야합니다 ->. 문자열 배열을 반환하지 않으면 각 줄은 \n(새 줄 문자)로 끝나 거나 시스템과 동일해야합니다.

입력은 다음과 같은 형식이어야합니다.

  • 1 부 : 4 개의 문자, 각각 N, E, S, W 순서로 소스 도로의 목적지 도로 (시계 방향). 허용되는 문자는 N, S, W, E또는 . 공간은 특정 도로에 차량이 없음을 의미합니다. 예를 들어 문자열 S WE은 N 차량이 남쪽으로 가고 싶다는 것을 의미하고, 공간은 E 차량이 없음을 W의미합니다 E.
  • 파트 2-비상 차량의 공간 또는 단일 문자 의미.
  • 파트 3-두 도로의 우선 순위를 결정하는 두 문자 (예 : NE북쪽과 동쪽 모두 남쪽과 서쪽보다 우선 순위가 높음) 더 편한 경우 우선 순위가 낮은 도로를 이용할 수 있습니다 (이 경우 SW).

해결 못하는 상황에서 당신은 같은 사용자에게 분명하다 한 줄의 문자열을 반환 할 수 있습니다 unsolvable, no solution및 유사한. JavaScript 사용자는 내장 undefined상수를 사용할 수 있습니다 .

이것은 코드 골프이므로 바이트 단위의 최단 답변이 이깁니다.

교통 규칙

일부 규칙은 국가 교통 규칙을 따르지 않을 수 있습니다. 도전 과제를보다 쉽게하기 위해 일부는 단순화되었습니다. 실제 교통 시스템을위한 안내서로이 질문을 사용하지 마십시오.

  1. 이 문제를 해결하려면 오른쪽 트래픽 만 사용할 수 있습니다.
  2. 교통 교차로는 정확히 한 지점에서 만나는 4 개의 도로로 구성됩니다. 그들은 표시됩니다 N( "북한"에 대한 등), S, W, E. 이 문자가 대신 사용되어야 x하고 y상기 출력 예이다.

교차로

  1. 각 도로에는 최대 하나의 차량이 있습니다. 각 도로에 차량이있는 것은 아닙니다. 각 차량은 4 가지 방향 중 하나로 운전할 수 있습니다. 좌회전, 우회전, 직진 또는 U 턴 .

S 차량의 가능한 목적지

  1. 두 차량의 경로가 서로 겹치지 않으면 (충돌하지 않으면), 같은 순간에 갈 수 있습니다. 두 대의 차량이 있으면 경로가 충돌하지 않습니다 (목록이 완전하지는 않지만 의도적 인 것이며 단서가 될 수 있습니다).
    • 반대 방향에서오고 둘 다 똑바로 가거나 둘 중 적어도 하나가 우회전합니다.
    • 반대 방향에서오고 둘 다 좌회전합니다.
    • 반대 방향에서 오면 그중 하나가 어떤 방향으로 회전하거나 U 턴을하는 반면 다른 하나는 U 턴을합니다.
    • 직교 방향에서 오면 왼쪽에서 오른쪽으로 회전하고 다른 방향으로 U 턴을하지 않습니다

      아래 경로가 충돌하지 않는 몇 가지 예입니다. 세 번째 그림에서 N이 U 턴을하더라도 N의 경로는 E의 경로와 충돌합니다.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

  1. 두 경로가 충돌하면 다른 규칙을 사용해야합니다. 두 대의 차량이 동일한 우선 순위 도로에있는 경우 (아래 참조) 다음과 같은 차량에 대한 권리 가 부여됩니다.
    • 직교 방향에서 오는 경우 오른쪽 도로에서 나옵니다.
    • 다른 쪽이 좌회전하면 우회전
    • 상대방이 U 턴을하면 직진하거나 우회전합니다.

      아래의 두 가지 예에서, E 차량은 차량 (S)에 대한 권리를 가진다.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

아래 예제에서 먼저 W, N, E, 마지막 S가됩니다.

여기에 이미지 설명을 입력하십시오

이 특별한 경우 프로그램의 출력은 다음과 같아야합니다.

1. W->S
2. N->S
3. E->S
4. S->S
  1. 모든 운전자는 회전 신호를 사용 하고 다른 모든 운전자 가 가고 싶어하는 곳을 알고 있습니다 (간단하게하기 위해 왼쪽 회전과 U 회전을 구별 할 수 있다고 가정합니다).

  2. 때때로 도로에는 우선 순위 표시가 주어지며, 이는 위의 규칙보다 더 중요합니다. 우선 순위가 높은 도로에는 우선 순위 표시 ( 우선 순위 표시 이미지 )가 있습니다. 우선 도로는 직진하지 않는 경우, 추가적인 징후처럼 사용 이 하나 . 우선 순위가 낮은 도로에는 양보 표지판 또는 정지 표지판이 있습니다 (동일 함). 전혀 또는 정확히 두 개의 다른 도로가 우선 순위를 갖습니다. 프로그램 사용자는 우선 순위가 더 높거나 낮은 도로를 입력 할 수 있어야합니다.

  3. 우선 순위가 높은 도로에서 오는 차량은 왼쪽에 있더라도 우선 순위가 낮은 도로에서 오는 차량보다 우선합니다.
  4. 우선 순위가 동일한 도로에서 오는 두 차량의 경로가 충돌하면 위의 오른쪽 규칙이 활성화됩니다.

    아래 예에서 도로 S와 W에 우선 순위 표시가 있으므로 N과 E의 차량이 길을 제시해야합니다. S 차량은 오른쪽에 있기 때문에 W 차량보다 우선 순위가 높습니다. 그런 다음 W보다 우선 순위가 높은 도로에 있기 때문에 W로갑니다. 차량 N은 오른쪽에 있기 때문에 E와 맞습니다. 마지막으로 E.

여기에 이미지 설명을 입력하십시오

이 특별한 경우 프로그램의 출력은 다음과 같아야합니다.

1. S->W
2. W->N
3. N->S
4. E->W
  1. 하나 이상의 차량이 비상 차량 일 수 있으며,이 차량은 어느 방향에서 오는지, 어떤 방향으로 있는지에 관계없이 우선 순위를 갖습니다 (항상 가장 먼저갑니다). 이 프로그램은 사용자가 비상 차량 인 차량에 출입 할 수 있도록해야합니다. 마지막 예에서 N은 긴급 차량이라는 점을 고려하면 N이 먼저 가고 S, W가 마지막 E가됩니다.

N에 비상 차량이있는이 특별한 경우 프로그램의 출력은 다음과 같아야합니다.

1. N->S
2. S->W
3. W->N
4. E->W
  1. 두 대의 차량이 같은 순간에 이동할 수있는 경우 (경로가 충돌하지 않고 다른 차량으로 이동할 필요가없는 경우) 프로그램에서이를 찾아서 동일한 시퀀스 번호를 갖는 것으로 반환해야합니다.

    아래 예에서 N 및 E 경로와 E 및 S 또는 W 및 E 경로가 충돌하지 않습니다. S는 N에, W는 S에 줘야하므로 S는 E 등과 동시에 갈 수 없습니다. N과 E는 할 수 있습니다. 따라서 처음에는 N과 E가 함께 가고 S와 W가 마지막보다갑니다.

여기에 이미지 설명을 입력하십시오

프로그램의 올바른 결과는 다음과 같아야합니다.

1. N->W
1. E->E
2. S->W
3. W->N

당신은 라인의 순서를 자유롭게 선택할 수 있습니다 1( N->W / E->E에 해당합니다 E->E / N->W)

  1. 때로는 교통량이 해결 불가능한 상황으로 이어질 수 있으며, 이로 인해 어떤 차량도 갈 수 없습니다. 실제로는 운전자 중 한 사람이 자발적으로 자신의 권리에서 사임하면 해결됩니다. 여기서 unsolvable질문의 첫 부분에서 언급 한 것처럼 프로그램이 출력되어야합니다 .

    아래는 해결할 수없는 상황의 예입니다. E는 W에게, W는 S에게, S는 E에게

여기에 이미지 설명을 입력하십시오


3
일관된 입력 형식을 정의해야한다고 생각합니다. "입력은 원하는 구조를 가질 수 있습니다"는 큰 붉은 깃발입니다. 입력이 해결책이 될 수 있습니까?
Calvin 's Hobbies

@ Calvin'sHobbies 질문을 업데이트했습니다
Voitcus

1-2 경우에 대한 입력 / 출력 예제를 얻을 수 있습니까?
Charlie Wynn

그래서 질문 (그리고 솔루션을 가정 하고 있습니다 ) 은 문제 의 도로 가 오른쪽 주행 이라고 가정 합니까?
Tersosauros

이것이 바로 Google Cars의 작동 방식입니다.
코어 덤프

답변:


8

Q, 645 바이트

r:{(1_x),*x}                                                    /rot
R:{x 3,!3}                                                      /-rot
A:4 4#/:@[16#0;;:;]'[(&0100011001111100b;&0001111101100010b;&0010001111000100b;0);(&0 6 2;&0 1 7;&0 3 3;0)]
K:,/{,'/A x}'3 R\3 0 2 1                                        /Konflick matrix
G:3 R\|E:"NESW"                                                 /E:NESW  G:WSEN NWSE ENWS SENW    
m:{x-y*_x%y}                                                    /mod
t:{1=+/m'[_x%4;2]}                                              /orthogonal
w:{-1($x),". ",y[0],"->",y 1;}                               /write
b:{_x%4}                                                        /n-> base dir.
g:m[;4]                                                         /n-> turn
e:(!4)in                                                        /exists
d:{s:r a:e b x;R s&~a}                                       /right free
I:{(G[a]?x 1)+4*a:E?*x}                                         /"dd"->n
O:{E[a],G[a:b x]g x}                                            /n-> "dd"
P:{N::(y=4)&z~4 4;a@&0<a:(@[4#0;b x;:;4-g x])+(5*d x)+(24*e z)+99*e y}          /priority
H:{a::K ./:/:x,/:\:x; if[N&2 in *a;:,0N]; x@&{~|/x[;z]'y}[a]'[!:'u+1;u:!#x]}    /each set of concurrent movements
f:{i:I'(E,'a)@&~^a:4#x; i:i@p:>P[i;E?x 4;E?x 5 6]; {0<#x 1}{a:H x 1;$[a~,0N;-1"unsolvable";w[*x]'O'a];$[a~,0N;(0;());(1+*x;x[1]@&~x[1] in a)]}/(1;i);}

코멘트

확실히, 그것은 짧거나 간단한 코드가 아닙니다. 그것은 (심하게) 압축 될 수는 있지만 독자에게 운동으로 남았습니다 (이 문제에 너무 많은 시간을 투자했습니다).

여러 줄로 주석 처리 된 솔루션을 포함했지만 줄 바꿈을 1 바이트로 가정하고 주석을 버리고 (줄 끝에서 끝까지) 크기를 계산합니다.

가장 어려운 점은 모든 규칙을 완전히 이해하는 것입니다. 코드 길이의 초기 최적화는 복잡한 문제에 대한 솔루션 개발과 호환되지 않습니다. 상향식 또는 하향식 접근 방식은 읽을 수없는 코드에 잘 대처하지 못합니다.

마지막으로, 16 행과 16 열 (각 방향에 대해 가능한 각 회전과 결합)이있는 디 케이션 테이블 (충돌 매트릭스)을 개발했습니다. 항목의 값은 0 (호환성), 1 (행 선호) 또는 2 (열 선호)입니다. 가능한 모든 상황이 잘 커버되는지 확실하지 않으므로 모든 테스트를 충족시킵니다.

소스 파일은 k 확장자를 가져야합니다. 대화식 인터프리터 (비 상업용 인 경우 kx.com 무료)를 시작하고 프롬프트에서 평가합니다 ( 'test'단락에 표시됨)

테스트

q)f " WN    "
1. E->W
2. S->N

q)f " SW    "
1. E->S
2. S->W

q)f "SSSS   "
1. W->S
2. N->S
3. E->S
4. S->S

q)f "SWWN WS"
1. S->W
2. W->N
3. N->S
4. E->W

q)f "SWWNNWS"
1. N->S
2. S->W
3. W->N
4. E->W

q)f "WEWN   "
1. N->W
1. E->E
2. S->W
3. W->N

q)f " SWE   "
unsolvable

설명

기본 구조는 '우선 순위 매트릭스'입니다

   N       E       S       W   
   W S E N N W S E E N W S S E N W
NW 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
 S 0 0 0 0 0 1 1 0 0 0 1 1 2 2 2 2
 E 0 0 0 0 0 1 1 1 2 2 0 0 0 2 2 0
 N 0 0 0 0 2 2 0 0 0 2 0 0 0 0 2 0
EN 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0
 W 2 2 2 2 0 0 0 0 0 1 1 0 0 0 1 1
 S 0 2 2 0 0 0 0 0 0 1 1 1 2 2 0 0
 E 0 0 2 0 0 0 0 0 2 2 0 0 0 2 0 0
SE 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0
 N 0 0 1 1 2 2 2 2 0 0 0 0 0 1 1 0
 W 2 2 0 0 0 2 2 0 0 0 0 0 0 1 1 1
 S 0 2 0 0 0 0 2 0 0 0 0 0 2 2 0 0
WS 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0
 E 0 1 1 0 0 0 1 1 2 2 2 2 0 0 0 0
 N 0 1 1 1 2 2 0 0 0 2 2 0 0 0 0 0
 W 2 2 0 0 0 2 0 0 0 0 2 0 0 0 0 0

의미 (예)

  • m[NW][SE] 0 값을 가짐 (모두 이동 가능-동시-)
  • m[EW][SN] 1의 값을 가짐 (EW가 SN보다 우선) 참고 .- 다른 우선 순위 요소로 인해이 문장이 변경 될 수 있습니다 (비상 차량, 우선 도로, ..)
  • m[NE][SE] 2 개의 값을 가짐

매트릭스는 4 개의 서브 매트릭스 (4x4) 유형을 사용하여 구성 할 수 있습니다.

  NESW  A    B    C    D
N DACB  0100 0001 0010 0000
E BDAC  0110 2222 0011 0000
S CBDA  0111 0220 2200 0000
W ACBD  2200 0020 0200 0000

매트릭스는 각 움직임에 우선 순위를 부여하는 기능으로 보완됩니다. 이 기능은 긴급 차량, 우선 도로, 직교 방향, 회전 유형 및 '오른쪽에서 오는'차량을 고려합니다.

움직임을 우선 순위별로 정렬하고 행렬 값을 적용합니다. 결과적인 하위 행렬에는 각 동작의 충돌과 우선 순위가 포함됩니다.

  • 해결할 수없는 사례를 분석합니다 (상호 충돌).
  • 그렇지 않다면, 우리는 가장 우선 순위가 높은 아이템과 그 아이템과 호환되고 이전의 호환되지 않는 움직임과 호환되지 않는 모든 움직임을 선택하고 동시에 이동할 수있는 움직임 세트를 만듭니다
  • 그 운동 세트를 작성하고 나머지 후보자를 반복하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.