Завдання
Напишіть програму або функцію, яка приймає структуру перехрестя дорожнього руху та виводить послідовність, в якій будуть проходити транспортні засоби.
Вихід повинен містити щонайбільше чотири рядки із наступним форматом #. x->y\n, де #є порядковим номером номер, за яким слідує крапка ., xі yє символи ["N", "E", "S", "W"]. Їх слід розділити символами ->. Якщо ви не повернете масив рядків, кожен рядок повинен закінчуватися \n(новим символом рядка) або еквівалентом вашій системі.
Вхід повинен мати таку форму:
- Частина 1: чотири символи, кожен з яких має дорогу призначення для вихідних доріг у порядку N, E, S, W (за годинниковою стрілкою). Символи
N,S,W,Eабо. Космос означає, що на конкретній дорозі немає транспортного засобу. Наприклад, рядокS WEозначає, що N транспортного засобу бажає їхати на південь, простір означає, що немає транспортного засобу E,Wозначає, що S бажає їхати на Захід,Eозначає Захід хоче піти на Схід. - Частина 2 - пробіл або одна літера, що означає, яка з аварійних транспортних засобів.
- Частина 3 - два символи, які визначають пріоритетність двох доріг (наприклад,
NEозначає, що обидва північні та східні пріоритети мають більші пріоритети, ніж південь та захід). Якщо вам простіше, ви можете взяти дороги нижчого пріоритету (у такому випадкуSW).
У нерозв'язній ситуації вам дозволяється повернути однорядковий рядок, зрозумілий користувачеві, як unsolvable, no solutionтощо. Користувачі JavaScript можуть приймати вбудовану undefinedконстанту.
Це кодовий гольф, тому найкоротша відповідь у байтах виграє.
Правила дорожнього руху
Зверніть увагу, що деякі правила можуть не відповідати вашим правилам дорожнього руху. Деякі з них були спрощені, щоб полегшити виклик. Не використовуйте це питання як посібник для реальної системи руху.
- Для виклику вам дозволяється використовувати лише правий трафік.
- Транспортне перехрестя складається з рівно чотирьох доріг, які зустрічаються в одній точці. Вони позначені
N(як «Північ»),S,W,E. Ці літери слід використовувати замістьxтаyу наведеному вище прикладі.
- На кожній дорозі є максимум один транспортний засіб. Не гарантується наявність транспортного засобу на кожній дорозі. Кожен транспортний засіб може їхати в будь-якому з чотирьох напрямків, тобто. повернути ліворуч, повернути направо, повернути прямо або зробити поворот .
- Якщо шляхи двох транспортних засобів не перетинаються (вони не стикаються), вони можуть піти в ту саму мить. Шляхи не стикаються, якщо два транспортні засоби (список може бути не повним, але це навмисно, лише щоб дати вам підказку):
- йти з протилежних напрямків, і обидва йдуть прямо, або принаймні один з них повертає направо,
- йти з протилежних напрямків і обидва повернути вліво,
- приходять з протилежних напрямків, і один з них повертається в будь-якому напрямку або робить поворот, а інший робить поворот,
- приходять з ортогональних напрямків, один зліва повертає праворуч, а другий не робить повороту
Нижче наведено кілька прикладів не зіткнення шляхів. Зверніть увагу, що на третьому малюнку будь-який шлях N зіткнеться з маршрутом E, навіть якщо N робить поворот у напрямку.
- Якщо дві контури стикаються, потрібно використовувати інші правила. Якщо два транспортні засоби перебувають на одній пріоритетній дорозі (див. Нижче), право на дорогу надається транспортному засобу, який:
- йде з дороги з правого боку, якщо вони йдуть з ортогональних напрямків
- повертає праворуч, якщо інший повертає ліворуч
- йде прямо або повертає направо, якщо інший робить поворот.
В обох прикладах нижче транспортний засіб E має право подолати транспортний засіб S.
У наведеному нижче прикладі спочатку йде W, потім N, потім E і останній S.
Для цього конкретного випадку вихід вашої програми повинен бути:
1. W->S
2. N->S
3. E->S
4. S->S
Всі водії використовують поворотники і знають, куди хочуть їхати всі інші (для простоти ми припускаємо, що можна розрізнити лівий поворот і поворот у повороті).
Іноді дорогам надаються знаки пріоритету, що важливіше, ніж правила вище. Дорога з більш високим пріоритетом має знак пріоритету ( зображення знака пріоритету ). Якщо дорога пріоритету не йде прямо, також використовуються додаткові знаки, як ця . Дороги з нижчим пріоритетом мають знак врожайності або знак зупинки (вони еквівалентні). Жодна або рівно дві різні дороги не матимуть більшого пріоритету. Користувач вашої програми повинен мати можливість вказати, які дороги мають більш високі (або нижчі) пріоритети.
- Транспортний засіб, який йде з дороги з більш високим пріоритетом, має право переходити транспортний засіб, що йде з дороги нижчого пріоритету, навіть якщо він знаходиться з лівого боку.
- Якщо траси двох транспортних засобів, що йдуть з доріг з однаковим пріоритетом, стикаються, вище праві праворуч активні.
На наведеному нижче прикладі дороги S та W мають знаки пріоритету, а це означає, що транспортні засоби на N та E повинні надавати їм шлях. Автомобіль S має пріоритет перед транспортним засобом W, оскільки він знаходиться з правого боку, тому йде першим. Далі йде W, оскільки він стоїть на дорозі вищого пріоритету, ніж E. Транспортний засіб N має право з шляху E, оскільки він знаходиться з правого боку. Як останнє йде Е.
Для цього конкретного випадку вихід вашої програми повинен бути:
1. S->W
2. W->N
3. N->S
4. E->W
- Можливо, що один (і не більше) транспортний засіб - це аварійний транспортний засіб , який має пріоритет незалежно від того, в якому напрямку він рухається або їде, і який знак має (він завжди йде першим). Програма повинна дозволяти користувачеві в'їхати, який транспортний засіб - аварійний автомобіль. Враховуючи, що на останньому прикладі N - це аварійний транспортний засіб, N йде спочатку, потім S, W і як останній E.
Для цього конкретного випадку з аварійним транспортним засобом на N вихідною програмою має бути:
1. N->S
2. S->W
3. W->N
4. E->W
- Якщо в один і той же момент дозволено їхати двом транспортним засобам (їхні шляхи не стикаються і їм не доведеться поступатись іншим транспортним засобам), ваша програма повинна це дізнатись і повернути їх як однакові порядкові номери
На наведеному нижче прикладі шляхи 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)
- Іноді трафік може призвести до нерозв'язної ситуації, що не дозволяє жодному транспортному засобу їхати. У реальному житті це вирішується, коли хтось із водіїв добровільно піде у відставку від свого права. Тут ваша програма повинна виводити
unsolvableі т.д., як було сказано в першій частині запитання.Нижче наводиться приклад нерозв’язної ситуації. E має поступитися місцем W, W має поступитися місцем S, а S має поступитися місцем E.











