مسیرها
/
Go
Go
/
تمرین‌ها
/
شبیه‌ساز ربات
شبیه‌ساز ربات

شبیه‌ساز ربات

متوسط

دستورالعمل‌ها

یک شبیه‌ساز ربات بنویسید.

مرکز آزمایش یک کارخانه‌ی ربات به برنامه‌ای نیاز دارد که حرکات ربات را بررسی کند.

ربات‌ها سه حرکت ممکن دارند:

  • چرخش به راست
  • چرخش به چپ
  • حرکت به جلو

ربات‌ها روی یک شبکه‌ی بی‌نهایت فرضی قرار می‌گیرند، رو به جهت خاصی (شمال، شرق، جنوب یا غرب)، در مجموعه‌ای از مختصات {x,y}، مثلاً {3,8}، که مختصات به سمت شمال و شرق افزایش می‌یابد.

سپس ربات تعدادی دستور دریافت می‌کند و در این مرحله، مرکز آزمایش موقعیت جدید ربات و جهتی را که رو به آن است بررسی می‌کند.

  • رشته‌ی حروف «RAALAL» یعنی:
    • چرخش به راست
    • دو بار حرکت به جلو
    • چرخش به چپ
    • یک بار حرکت به جلو
    • و باز هم چرخش به چپ
  • فرض کنید رباتی از {7, 3} و رو به شمال شروع می‌کند. در این صورت، اجرای این رشته دستورها باید آن را در {9, 4} و رو به غرب باقی بگذارد.

نکات پیاده‌سازی

تست‌ها به ۳ مرحله تقسیم شده‌اند.

همه‌ی تست‌ها را با 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 در اختیار شما قرار داده شده است که چند مورد از نیازهای برنامه‌ی تست را تعریف می‌کند. این فایل بر حسب مرحله به سه بخش سازمان‌دهی شده است.

مرحله ۱

برای کامل کردن مرحله ۱ باید Right، Left، Advance، N، S، E، W و Dir را تعریف کنید. پیش از رفتن به مرحله ۲، مرحله ۱ را کامل کنید.

مرحله ۲

در مرحله ۱ حرکت‌های ربات را پیاده‌سازی کردید، اما آن چندان شبیه‌سازی نیست. برای مثال، «ربات» در کد منبع کجاست؟ «شبکه» کجاست؟ محاسباتی که کنش‌های ربات را به موقعیت‌های شبکه تبدیل می‌کنند کجا هستند، در ربات یا در شبکه؟ دنیای فیزیکی متفاوت است.

مرحله ۲ یک «اتاق» را معرفی می‌کند. به نظر افزودنی کوچکی می‌رسد، اما تغییرات بزرگی اعمال خواهیم کرد تا نقش‌های «اتاق»، «ربات» و «برنامه‌ی تست» را روشن کنیم و کم‌کم فیزیک شبیه‌سازی را شفاف کنیم. شما Room و Robot را به‌صورت توابعی تعریف خواهید کرد که برنامه‌ی تست آن‌ها را با راه‌اندازی به‌صورت گوروتین «به وجود می‌آورد». اطلاعات از طریق کانال‌های Go میان برنامه‌ی تست، ربات و اتاق جابه‌جا می‌شود.

Room را یک «موتور فیزیک» در نظر بگیرید که اتاقی فیزیکی با دیوارها و یک ربات را مدل‌سازی و شبیه‌سازی می‌کند. باید به‌نحوی فضای مختصاتی اتاق، موقعیت ربات و دیوارها را مدل‌سازی کند و مثلاً مطمئن شود که ربات از میان دیوارها عبور نمی‌کند. می‌خواهیم Robot عاملی باشد که کنش‌ها را انجام می‌دهد، اما می‌خواهیم Room حقیقتی منسجم را حفظ کند.

برنامه‌ی تست کانال‌ها را می‌سازد و هر دو Room و Robot را راه‌اندازی می‌کند. سپس برنامه‌ی تست فرمان‌ها را به Robot می‌فرستد. وقتی فرستادن فرمان‌ها تمام شد، کانال فرمان را می‌بندد. Robot باید فرمان‌ها را بپذیرد و Room را از کنش‌هایی که در تلاش برای انجامشان است آگاه کند. وقتی بسته شدن کانال فرمان را حس کند، باید خودش را خاموش کند. اتاق باید پیامدهای فیزیکی کنش‌های ربات را تفسیر کند. وقتی خاموش شدن ربات را حس کند، گزارش نهایی را به برنامه‌ی تست برمی‌گرداند و موقعیت و جهت نهایی ربات را اعلام می‌کند.

مرحله ۳

مرحله ۳ سه تغییر عمده دارد:

  • ربات‌ها به‌جای پاسخ دادن به فرمان‌های تک‌تک، اسکریپت اجرا می‌کنند.
  • یک کانال لاگ به ربات‌ها و اتاق اجازه می‌دهد پیام‌ها را ثبت کنند.
  • اتاق اجازه می‌دهد چندین ربات هم‌زمان وجود داشته باشند و کار کنند.

برای گزارش موقعیت نهایی که از Room3 فرستاده می‌شود، می‌توانید همان اسلایسی را برگردانید که از کانال ربات‌ها دریافت کرده‌اید، فقط با موقعیت‌ها و جهت‌های به‌روزشده. برای موارد زیر باید روی کانال لاگ پیام فرستاده شود:

  • ربات بدون اسم
  • اسم‌های تکراری ربات
  • ربات‌هایی که در یک مکان قرار گرفته‌اند
  • ربات قرارگرفته در بیرون اتاق
  • فرمان تعریف‌نشده در یک اسکریپت
  • کنشی از یک ربات ناشناس
  • رباتی که می‌خواهد به داخل دیوار پیشروی کند
  • رباتی که می‌خواهد به داخل ربات دیگری پیشروی کند

منبع

با الهام از یک پرسش مصاحبه در شرکتی مشهور.
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Go Exercism

آماده‌اید شبیه‌ساز ربات را شروع کنید؟

در Exercism ثبت‌نام کنید تا Go را همراه با 34 مفهوم165 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.