Треки
/
Go
Go
/
Вправи
/
Симулятор робота
Симулятор робота

Симулятор робота

Середня

Вказівки

Напишіть симулятор робота.

Випробувальному центру фабрики роботів потрібна програма, яка перевіряє рухи роботів.

Роботи мають три можливі рухи:

  • повернути праворуч
  • повернути ліворуч
  • просунутися вперед

Роботів розміщують на гіпотетичній нескінченній сітці. Кожен робот повернутий у певному напрямку (north, east, south або west) і має координати {x,y}, наприклад {3,8}, причому координати зростають у напрямку north й east.

Далі робот отримує низку вказівок, після чого випробувальний центр перевіряє нову позицію робота і те, у якому напрямку він повернутий.

  • Рядок літер «RAALAL» означає:
    • Повернути праворуч
    • Просунутися двічі
    • Повернути ліворуч
    • Просунутися один раз
    • І ще раз повернути ліворуч
  • Нехай робот починає в точці {7, 3} з напрямком north. Тоді після виконання цієї послідовності вказівок він має опинитися в точці {9, 4} з напрямком west.

Примітки щодо реалізації

Тести розділено на 3 кроки.

Запустити всі тести можна командою go test, а конкретні тести - за допомогою опції -tags.

Приклади:

go test                      # run all tests
go test -tags step1          # run just step 1 tests.
go test -tags 'step1 step2'  # run step1 and step2 tests

Нам дано вихідний файл defs.go, який визначає низку речей, потрібних тестовій програмі. Його впорядковано в три розділи за кроками.

Крок 1

Щоб завершити крок 1, ми визначимо Right, Left, Advance, N, S, E, W і Dir. Завершіть крок 1, перш ніж переходити до кроку 2.

Крок 2

На кроці 1 ми реалізували рухи робота, але це не надто схоже на симуляцію. Наприклад, де у вихідному коді «робот»? Де «сітка»? Де ті обчислення, які перетворюють дії робота на позиції на сітці: у роботі чи в сітці? Фізичний світ влаштований інакше.

Крок 2 вводить «кімнату». Здається, це дрібне доповнення, але ми зробимо великі зміни, щоб прояснити ролі «кімнати», «робота» й «тестової програми» та почати прояснювати фізику симуляції. Ми визначимо Room і Robot як функції, які тестова програма «втілює в життя», запускаючи їх як горутини. Інформація рухається між тестовою програмою, роботом і кімнатою через канали Go.

Розгляньмо Room як «фізичний рушій», щось, що моделює й симулює фізичну кімнату зі стінами та роботом. Він має якось моделювати координатний простір кімнати, розташування робота й стін та гарантувати, наприклад, що робот не проходить крізь стіни. Ми хочемо, щоб Robot був агентом, який виконує дії, але щоб Room підтримував несуперечливу істину.

Тестова програма створює канали й запускає і Room, і Robot. Потім тестова програма надсилає команди до Robot. Коли вона закінчує надсилати команди, вона закриває канал команд. Robot має приймати команди й повідомляти Room про дії, які намагається виконати. Коли він відчуває, що канал команд закривається, він має завершити власну роботу. Кімната має інтерпретувати фізичні наслідки дій робота. Коли вона відчуває, що робот завершує роботу, вона надсилає тестовій програмі фінальний звіт із кінцевою позицією та напрямком робота.

Крок 3

Крок 3 містить три великі зміни:

  • Роботи виконують скрипти, а не реагують на окремі команди.
  • Канал журналу дає змогу роботам і кімнаті записувати повідомлення.
  • Кімната дає змогу існувати й працювати одночасно кільком роботам.

Для фінального звіту про позиції, який надсилає Room3, можна повернути той самий зріз, отриманий із каналу robots, лише з оновленими позиціями та напрямками. Повідомлення потрібно надсилати до каналу журналу в таких випадках:

  • Робот без імені
  • Дублікати імен роботів
  • Роботи, розміщені в одному місці
  • Робот, розміщений поза кімнатою
  • Невизначена команда у скрипті
  • Дія від невідомого робота
  • Спроба робота просунутися у стіну
  • Спроба робота просунутися в іншого робота

Джерело

За мотивами запитання зі співбесіди у відомій компанії.
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Go Exercism

Час розпочати Симулятор робота?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Go, а також 34 концепції165 вправ та справжнє наставництво від людей, і все це безкоштовно.