المسارات
/
Go
Go
/
التمارين
/
محاكي الروبوت
محاكي الروبوت

محاكي الروبوت

متوسط

التعليمات

اكتب محاكي روبوت.

يحتاج مرفق اختبار في مصنع للروبوتات إلى برنامج للتحقق من حركات الروبوت.

للروبوتات ثلاث حركات ممكنة:

  • الاستدارة يمينًا
  • الاستدارة يسارًا
  • التقدّم

توضع الروبوتات على شبكة افتراضية لا نهائية، وهي متجهة نحو اتجاه معين (الشمال أو الشرق أو الجنوب أو الغرب) عند مجموعة من الإحداثيات {x,y}، مثل {3,8}، حيث تزداد الإحداثيات نحو الشمال والشرق.

ثم يتلقى الروبوت عددًا من التعليمات، وعندها يتحقق مرفق الاختبار من موضع الروبوت الجديد، ومن الاتجاه الذي يشير إليه.

  • تعني السلسلة النصية المكوّنة من الحروف "RAALAL" ما يلي:
    • الاستدارة يمينًا
    • التقدّم مرتين
    • الاستدارة يسارًا
    • التقدّم مرة واحدة
    • الاستدارة يسارًا مرة أخرى
  • لنفترض أن روبوتًا يبدأ عند {7, 3} متجهًا نحو الشمال. عند تشغيل هذه التعليمات بالترتيب سيصبح عند {9, 4} متجهًا نحو الغرب.

ملاحظات التنفيذ

الاختبارات مقسّمة إلى 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 كدالتين يجعلهما برنامج الاختبار موجودتين بإطلاقهما بوصفهما goroutine. وتنتقل المعلومات بين برنامج الاختبار والروبوت والغرفة عبر قنوات Go.

فكّر في Room كمحرّك فيزيائي، أي شيء يمثّل غرفة مادية بجدران وروبوت ويحاكيها. وينبغي أن يمثّل بطريقة ما الفضاء الإحداثي للغرفة، وموقع الروبوت والجدران، وأن يضمن مثلًا ألّا يمرّ الروبوت عبر الجدران. نريد أن يكون Robot وكيلًا ينفّذ الأفعال، لكننا نريد أن يحافظ Room على حقيقة متماسكة.

ينشئ برنامج الاختبار القنوات ويشغّل كلا من Room وRobot. ثم يرسل برنامج الاختبار أوامر إلى Robot. وعندما ينتهي من إرسال الأوامر، يغلق قناة الأوامر. يجب أن يستقبل Robot الأوامر ويُبلغ Room بالأفعال التي يحاول القيام بها. وعندما يستشعر إغلاق قناة الأوامر، يجب أن يوقف نفسه. ويجب أن تفسّر الغرفة النتائج الفيزيائية لأفعال الروبوت. وعندما تستشعر توقّف الروبوت، فإنها ترسل تقريرًا نهائيًا إلى برنامج الاختبار يبيّن الموضع النهائي للروبوت واتجاهه.

الخطوة 3

تتضمّن الخطوة 3 ثلاثة تغييرات رئيسية:

  • تشغّل الروبوتات نصوصًا برمجية بدلًا من الاستجابة لأوامر فردية.
  • تتيح قناة سجلّ للروبوتات وللغرفة تسجيل الرسائل.
  • تتيح الغرفة وجود عدة روبوتات وتشغيلها في الوقت نفسه.

بالنسبة لتقرير الموضع النهائي المُرسل من Room3، يمكنك إرجاع الشريحة نفسها المستلمة من قناة الروبوتات، مع مواضع واتجاهات محدَّثة فقط. ويجب إرسال رسائل على قناة السجلّ في الحالات التالية:

  • روبوت بلا اسم
  • أسماء روبوتات مكرّرة
  • روبوتات وُضعت في المكان نفسه
  • روبوت وُضع خارج الغرفة
  • أمر غير معرّف في نص برمجي
  • فعل صادر عن روبوت غير معروف
  • روبوت يحاول التقدّم نحو جدار
  • روبوت يحاول التقدّم نحو روبوت آخر

المصدر

مستوحًى من سؤال مقابلة في شركة شهيرة.
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Go Exercism

مستعد لبدء محاكي الروبوت؟

سجّل في Exercism لتتعلّم وتتقن Go عبر 34 مفهومًا165 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.