المسارات
/
Bash
Bash
/
التمارين
/
الإرسال بين المجرات
الإرسال بين المجرات

الإرسال بين المجرات

متوسط

مقدمة

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

تخيّل الآن العواقب:

  • انهيار سوق الأسهم بين المجرات عندما تتحوّل عبارة "اشترِ بسعر منخفض" إلى "بِع الآن".
  • فقدان الاتصال بنظام Kepler Whirl عندما تتحوّل عبارة "save new worm hole" إلى "cave new worm hole".
  • أو إغراق الكون في رعب وجودي باستبدال إيموجي راعي البقر 🤠 بإيموجي المهرّج 🤡.

اكتشاف الرسائل التالفة ليس مهمًا فحسب، بل هو أمر حاسم. و_لا بدّ_ أن يعرف المستقبِل أن شيئًا قد اختلّ قبل أن تقع الكارثة.

لكن كيف؟ ظلّ علماء ومهندسون من كل أنحاء الكون يصارعون هذه المشكلة منذ دهور سحيقة. وعناقيد فائقة كاملة من الذكاء الاصطناعي الكوني تنكبّ على غربلة البيانات. ثم، في أحد الأيام، تعود أسطورة إلى الظهور: طريقة قديمة قوية، يُهمس بها في منتديات تصحيح الأخطاء، ويتمتم بها مهندسون رأوا من الأمور أكثر مما ينبغي...

بت التكافؤ!

طريقة بهذه البساطة وبهذه القوة، قد تكون هي ما ينقذ الاتصالات بين النجوم.

التعليمات

مهمتك هي المساعدة في تنفيذ

  • المرسِل، الذي يحسب تسلسل الإرسال، و
  • المستقبِل، الذي يفكّ تشفيره.

بت التكافؤ طريقة بسيطة للكشف عن أخطاء الإرسال. لا يمكن للمرسِلات والمستقبِلات أن ترسل وتستقبل سوى ثمانية بتات بالضبط في المرة الواحدة (بما في ذلك بت التكافؤ). يُضبط بت التكافؤ بحيث يكون عدد البتات التي قيمتها 1 زوجيًا في كل عملية إرسال، ويكون بت التكافؤ دائمًا أول بت من اليمين. لذا إذا استقبل المستقبِل 11000001 أو 01110101 أو 01000000 (أي إرسال يحتوي على عدد فردي من البتات التي قيمتها 1)، فإنه يعلم أن هناك خطأ.

ومع ذلك، نادرًا ما تكون الرسائل بهذا القِصر، وعندما تكون أطول فإنها تحتاج إلى الإرسال في تسلسل.

على سبيل المثال، لنأخذ الرسالة 11000000 00000001 11000000 11011110 (أو C0 01 C0 DE بالنظام الست عشري).

بما أن كل عملية إرسال تحتوي على ثمانية بتات بالضبط، فإنها لا يمكن أن تحتوي إلا على سبعة بتات من البيانات وبت التكافؤ. لذا يجب إدراج بت التكافؤ بعد كل سبعة بتات من البيانات:

11000000 00000001 11000000 11011110
      ↑       ↑       ↑       ↑          (7th bits)

يبدو تسلسل الإرسال لهذه الرسالة هكذا:

1100000_ 0000000_ 0111000_ 0001101_ 1110
       ↑        ↑        ↑        ↑      (parity bits)

البيانات في عملية الإرسال الأولى في التسلسل (1100000) تحتوي على بتَّين قيمتهما 1 (عدد زوجي)، لذا يكون بت التكافؤ 0. فتصبح عملية الإرسال الأولى 11000000 (أو C0 بالنظام الست عشري).

البيانات في عملية الإرسال التالية (0000000) لا تحتوي على أي بت قيمته 1 (عدد زوجي مرة أخرى)، لذا يكون بت التكافؤ 0 مرة أخرى. وبذلك تصبح عملية الإرسال الثانية 00000000 (أو 00 بالنظام الست عشري).

البيانات الخاصة بعمليتي الإرسال التاليتين (0111000 و0001101) تحتوي على ثلاثة بتات قيمتها 1. يُضبط بت التكافؤ لديهما على 1 حتى يكون عدد البتات التي قيمتها 1 زوجيًا في عملية الإرسال. وتُرسَلان على شكل 01110001 و00011011 (أو 71 و1B بالنظام الست عشري).

عملية الإرسال الأخيرة (1110) تحتوي على أربعة بتات فقط من البيانات. بما أنه يتم إرسال ثمانية بتات بالضبط في المرة الواحدة، وبت التكافؤ هو البت الواقع في أقصى اليمين، تُضاف ثلاثة بتات قيمتها 0 ثم بت التكافؤ لاستكمال ثمانية بتات. فتصبح الآن هكذا (حيث _ هو بت التكافؤ):

1110 000_
     ↑↑↑   (added 0 bits)

مرة أخرى، هناك عدد فردي من البتات التي قيمتها 1، لذا يكون بت التكافؤ 1. تصبح عملية الإرسال الأخيرة في التسلسل 11100001 (أو E1 بالنظام الست عشري).

تسلسل الإرسال الكامل لهذه الرسالة هو 11000000 00000000 01110001 00011011 11100001 (أو C0 00 71 1B E1 بالنظام الست عشري).


المصدر

Kah Gohيفتح الرابط في نافذة أو علامة تبويب جديدة
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Bash Exercism

مستعد لبدء الإرسال بين المجرات؟

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