Giải quyết một nút giao thông


26

Nhiệm vụ

Viết chương trình hoặc chức năng có cấu trúc nút giao thông và xuất ra chuỗi, trong đó phương tiện sẽ đi qua.

Đầu ra phải chứa ít nhất bốn dây chuyền với các định dạng sau đây #. x->y\n, nơi #là một số số thứ tự, tiếp theo là dấu chấm ., xylà nhân vật ["N", "E", "S", "W"]. Họ nên được phân tách bằng các ký tự ->. Nếu bạn không trả về một chuỗi các chuỗi, mỗi dòng phải kết thúc bằng một \n(ký tự dòng mới) hoặc tương đương với hệ thống của bạn.

Đầu vào phải có dạng sau:

  • Phần 1: bốn ký tự, mỗi ký tự có đường đích cho các đường nguồn theo thứ tự N, E, S, W (theo chiều kim đồng hồ). Các nhân vật được phép là N, S, W, Ehoặc . Không gian có nghĩa là không có xe trên đường cụ thể. Ví dụ: chuỗi S WEphương tiện, phương tiện N muốn đi về phía Nam, không gian có nghĩa là không có phương tiện E, Wcó nghĩa là S muốn đi về phía Tây, Ecó nghĩa là phương Tây muốn đi về hướng Đông.
  • Phần 2 - một khoảng trắng hoặc một chữ cái có nghĩa là một trong những phương tiện khẩn cấp.
  • Phần 3 - hai ký tự xác định hai con đường nào có mức độ ưu tiên (ví dụ: NEcó nghĩa là cả Bắc và Đông đều có mức độ ưu tiên cao hơn cả Nam và Tây). Nếu nó dễ dàng hơn cho bạn, bạn có thể đi những con đường ưu tiên thấp hơn (trong trường hợp đó SW).

Trong tình huống không thể giải quyết, bạn được phép trả về chuỗi một dòng rõ ràng cho người dùng, như unsolvable,no solution và tương tự. Người dùng JavaScript có thể tích hợp sẵn undefined.

Đây là một môn đánh gôn, vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.

Luật lệ giao thông

Xin lưu ý rằng một số quy tắc có thể không tuân theo quy tắc giao thông quốc gia của bạn. Một số trong số họ đã được đơn giản hóa để làm cho thách thức dễ dàng hơn. Không sử dụng câu hỏi này như một hướng dẫn cho hệ thống giao thông thực tế.

  1. Đối với thử thách, bạn chỉ được phép sử dụng lưu lượng bên phải.
  2. Giao lộ giao thông bao gồm chính xác bốn con đường gặp nhau tại một điểm. Họ được đánh dấu N(như đối với "Bắc"), S, W, E. Những chữ cái này nên được sử dụng thay cho xytrong ví dụ đầu ra ở trên.

Giao lộ

  1. Trên mỗi con đường có nhiều nhất một chiếc xe. Nó không được đảm bảo rằng có một chiếc xe trên mỗi con đường. Mỗi chiếc xe có thể lái theo bất kỳ hướng nào trong bốn hướng, tức là. rẽ trái, rẽ phải, đi thẳng hoặc rẽ .

Điểm đến có thể của xe S

  1. Nếu đường đi của hai phương tiện không giao nhau (chúng không va chạm), chúng có thể đi cùng một lúc. Đường dẫn không va chạm, nếu hai phương tiện (danh sách có thể không đầy đủ, nhưng điều này là cố ý, chỉ để cung cấp cho bạn một đầu mối):
    • đến từ hai hướng ngược nhau và cả hai đi thẳng, hoặc ít nhất một trong số họ rẽ phải,
    • đến từ hai hướng ngược nhau và cả hai rẽ trái,
    • đến từ các hướng ngược nhau và một trong số chúng quay theo hướng bất kỳ hoặc quay đầu, trong khi hướng còn lại quay đầu,
    • đến từ các hướng trực giao, hướng bên trái rẽ phải và hướng còn lại không quay đầu

      Một số ví dụ về các đường dẫn không va chạm dưới đây. Xin lưu ý rằng trên bản vẽ thứ ba, bất kỳ đường dẫn nào của N sẽ va chạm với đường dẫn của E, ngay cả khi N thực hiện quay đầu xe.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

  1. Nếu hai đường dẫn va chạm, cần phải sử dụng các quy tắc khác. Nếu hai phương tiện đi trên cùng một con đường ưu tiên (xem bên dưới), quyền ưu tiên được trao cho phương tiện:
    • xuất phát từ con đường phía bên phải, nếu chúng đến từ các hướng trực giao
    • rẽ phải nếu rẽ trái
    • đi thẳng hoặc rẽ phải nếu người kia quay đầu xe.

      Trong cả hai ví dụ dưới đây, xe E có quyền vượt xe S.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Trong ví dụ dưới đây trước tiên đi W, sau đó N, sau đó E và cuối cùng đi S.

nhập mô tả hình ảnh ở đây

Đối với trường hợp cụ thể này, đầu ra của chương trình của bạn phải là:

1. W->S
2. N->S
3. E->S
4. S->S
  1. Tất cả các trình điều khiển sử dụng tín hiệu rẽ và biết nơi tất cả những người khác muốn đến (để đơn giản, chúng tôi cho rằng có thể phân biệt giữa rẽ trái và rẽ U).

  2. Đôi khi các con đường được đưa ra các dấu hiệu ưu tiên, điều quan trọng hơn là các quy tắc ở trên. Đường có mức độ ưu tiên cao hơn có dấu hiệu ưu tiên ( hình ảnh dấu hiệu ưu tiên ). Nếu đường ưu tiên không đi thẳng, cũng có các dấu hiệu bổ sung được sử dụng, như đường này . Các đường có mức độ ưu tiên thấp hơn có biển báo hiệu suất hoặc biển báo dừng (chúng tương đương). Không có hoặc chính xác hai con đường khác nhau sẽ có mức độ ưu tiên cao hơn. Người dùng chương trình của bạn sẽ có thể nhập những con đường nào có mức độ ưu tiên cao hơn (hoặc thấp hơn).

  3. Một chiếc xe xuất phát từ đường có mức độ ưu tiên cao hơn có quyền vượt qua một chiếc xe đến từ đường có mức độ ưu tiên thấp hơn, ngay cả khi nó ở bên trái.
  4. Nếu đường đi của hai phương tiện đến từ các con đường có cùng mức độ ưu tiên va chạm, các quy tắc phía bên phải đang hoạt động.

    Trong ví dụ dưới đây, đường S và W có biển báo ưu tiên, điều đó có nghĩa là các phương tiện trên N và E sẽ cho chúng đường đi. Xe S được ưu tiên hơn xe W, vì nó ở phía bên phải, nên đi trước. Sau đó đi W, vì nó nằm trên đường có mức độ ưu tiên cao hơn E. Xe N có quyền đi từ E, vì nó ở bên phải. Khi cuối cùng đi E.

nhập mô tả hình ảnh ở đây

Đối với trường hợp cụ thể này, đầu ra của chương trình của bạn phải là:

1. S->W
2. W->N
3. N->S
4. E->W
  1. Có thể một (và không còn nữa) là phương tiện khẩn cấp , được ưu tiên bất kể nó đến từ hướng nào hoặc đi đến đâu, và nó có dấu hiệu gì (nó luôn đi trước). Chương trình nên cho phép người dùng đi vào, phương tiện nào là phương tiện khẩn cấp. Xét rằng trong ví dụ cuối N là phương tiện khẩn cấp, N đi trước, sau đó là S, W và là E. cuối cùng.

Đối với trường hợp cụ thể này với một phương tiện khẩn cấp tại N, đầu ra của chương trình của bạn phải là:

1. N->S
2. S->W
3. W->N
4. E->W
  1. Nếu hai phương tiện được phép đi cùng một lúc (đường đi của chúng không va chạm và chúng không phải nhường đường cho các phương tiện khác), chương trình của bạn sẽ tìm ra điều này và trả lại chúng có cùng số thứ tự

    Trong ví dụ dưới đây, đường dẫn của N và E cũng như E và S hoặc W và E không va chạm. Vì S phải nhường đường cho N và W nhường đường cho S, S không thể đi cùng lúc với E, v.v ... N và E có thể. Vì vậy, lúc đầu N và E đi cùng nhau, hơn đi S và W là lần cuối.

nhập mô tả hình ảnh ở đây

Đầu ra thích hợp của chương trình của bạn phải là:

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

Bạn có thể tự do chọn thứ tự các dòng 1( N->W / E->Etương đương với E->E / N->W)

  1. Đôi khi giao thông có thể dẫn đến tình huống không thể giải quyết, điều đó không cho phép bất kỳ phương tiện nào đi. Trong cuộc sống thực, nó được giải quyết khi một trong những người lái xe tự nguyện từ chức. Ở đây, chương trình của bạn sẽ xuất ra unsolvable, v.v., như đã đề cập trong phần đầu tiên của câu hỏi.

    Dưới đây là một ví dụ về tình huống không thể giải quyết. E nên nhường đường cho W, W nên nhường đường cho S và S nên nhường đường cho E.

nhập mô tả hình ảnh ở đây


3
Tôi nghĩ rằng một định dạng đầu vào nhất quán nên được xác định. "Đầu vào có thể có bất kỳ cấu trúc nào bạn thích" là một lá cờ lớn màu đỏ. Đầu vào có thể là giải pháp?
Sở thích của Calvin

@ Calvin'sHob sở thích Tôi đã cập nhật câu hỏi
Voitcus

Bất kỳ cơ hội nào chúng ta có thể lấy một ví dụ đầu vào / đầu ra cho 1-2 trường hợp?
Charlie Wynn ngày

Vì vậy, câu hỏi (và tôi đang giả sử giải pháp) cho rằng (các) con đường trong câu hỏi là tay lái bên phải?
Tersizardos

Đây chính xác là cách Google Cars hoạt động
coredump

Câu trả lời:


8

Q, 645 byte

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);}

BÌNH LUẬN

Chắc chắn, đó không phải là mã ngắn (cũng không đơn giản). Nó có thể được nén chặt (nghiêm trọng), nhưng nó để lại cho người đọc (tôi đã dành quá nhiều thời gian cho vấn đề này).

Tôi đã bao gồm giải pháp nhận xét đa dòng, nhưng giả sử các dòng mới là 1 Byte và loại bỏ các nhận xét (từ / đến cuối dòng) để đếm kích thước

Khó khăn chính là để hiểu đầy đủ tất cả các quy tắc. Tối ưu hóa sớm độ dài mã không tương thích với việc phát triển giải pháp cho một vấn đề phức tạp. Cách tiếp cận từ dưới lên hoặc từ trên xuống cũng đối phó tốt với mã không thể đọc được.

Cuối cùng, tôi đã phát triển một bảng phân rã (ma trận xung đột) với 16 hàng và 16 cột (cho mỗi hướng kết hợp với mỗi lượt có thể). Các giá trị của các mục là 0 (tương thích), 1 (ưu tiên cho hàng) hoặc 2 (ưu tiên cho cột). Nó đáp ứng tất cả các thử nghiệm, bởi tôi không chắc chắn rằng tất cả các tình huống có thể xảy ra đều được bảo vệ tốt

Tập tin nguồn phải có phần mở rộng k. Bắt đầu trình thông dịch tương tác (miễn phí cho sử dụng không giao dịch, kx.com) và đánh giá nhanh chóng (như được hiển thị trong đoạn 'kiểm tra')

KIỂM TRA

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

GIẢI TRÌNH

Cấu trúc cơ sở là 'ma trận ưu tiên'

   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

Ý nghĩa (ví dụ)

  • m[NW][SE] có 0 giá trị (cả hai chuyển động đều tương thích -conc Hiện-)
  • m[EW][SN] có 1 giá trị (EW có mức độ ưu tiên cao hơn SN) LƯU Ý.- các yếu tố ưu tiên khác có thể thay đổi câu này (phương tiện khẩn cấp, đường ưu tiên, ..)
  • m[NE][SE] có 2 giá trị (SE có mức độ ưu tiên cao hơn NE) LƯU Ý.- các yếu tố ưu tiên khác có thể thay đổi câu này (phương tiện khẩn cấp, đường ưu tiên, ..)

Ma trận có thể được xây dựng bằng bốn loại Subatrix (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

Ma trận được bổ sung với chức năng gán mức độ ưu tiên cho mỗi chuyển động. Chức năng đó tính đến các phương tiện khẩn cấp, đường ưu tiên, chỉ đường trực giao, loại rẽ và phương tiện 'đi từ bên phải'

Chúng tôi sắp xếp các chuyển động theo mức độ ưu tiên và áp dụng các giá trị ma trận. Subatrix kết quả bao gồm xung đột và mức độ ưu tiên của từng chuyển động.

  • chúng tôi phân tích các trường hợp không thể giải quyết (xung đột lẫn nhau)
  • nếu không, chúng tôi chọn mục ưu tiên nhất và tất cả các chuyển động tương thích với nó và không tương thích với các chuyển động không tương thích trước đó và tạo một tập hợp các chuyển động được phép đi cùng một lúc
  • Viết tập hợp các chuyển động và lặp đi lặp lại trên các ứng cử viên còn lạ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.