الدرس 3 من 6
قفل الآلة الصغيرة
- 20 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
محاكاة الآلة بأمر الإدخال وعكسها لاستخراج المفتاح
الشرح
البرنامج PROGRAM مكتوب لآلة صغيرة تشبه آلة مسار تحليل البرامج، لكن أُضيف إليها أمر إدخال (IN) يقرأ بايتًا من مفتاح يكتبه المستخدم. فالبرنامج قفلٌ: يأخذ كل بايت من المفتاح، يحوّله بأوامر ثابتة، ثم يقارن ناتجه ببايتات الهدف المخزّنة في TARGET. والمفتاح الصحيح هو الذي يعطي الهدف نفسه، وهو العلم المطلوب.
0x00 HALT stop 0x01 LOAD imm acc = imm 0x02 ADD imm acc = (acc + imm) & 0xFF 0x03 XOR imm acc = acc ^ imm 0x04 SUB imm acc = (acc - imm) & 0xFF 0x05 OUT output.append(acc) 0x06 IN acc = بايت الإدخال التالي
والمُراكِم (acc) يبدأ بصفر، والأمر IN يملؤه بالبايت التالي من مفتاح الدخل، فلا مُعامَل له. ولتستخرج المفتاح تعكس القفل: لكل موضع جرّب بايتات الدخل حتى يعطي محاكيك بايت الهدف، أو اقرأ أوامر الموضع واعكسها بالترتيب المعكوس.
المطلوب
اكتب الدالة run(program, data) التي تنفّذ البرنامج وتقرأ بايتات الدخل من data عند كل أمر IN وتُرجع المخرجات bytes، والدالة recover(program, target) التي تُرجع مفتاح الدخل الذي يجعل البرنامج يُخرج target. ثم احفظ العلم نصًّا في flag. والفحص يبني أقفالًا أخرى، فلا يكفي أن تكتب العلم وحده.
الفحوص
6 فحوص- المحاكي يقرأ الدخل عند IN
- المتغيّر flag علم القفل
- يسترجع مفتاح القفل من هدفه
- يعكس قفلًا مخفيًّا آخر
- الحساب يلتفّ بالباقي 256
- يتوقّف عند HALT