تمرين من المصدر الأصلي · تطبيق عملي

الحمض النووي

استخدم الشرح العربي للفهم، واعتمد صفحة CS50 الأصلية مرجعًا نهائيًا للمواصفات والتسليم.

جلسة دراسة مقترحة: حتى 60 دقيقةالجهد الكلي التقريبي: 120 دقيقة · أكمل من حيث توقفت لاحقًا.Week 6
محاور هذه الخطوة
  • Python
  • القواميس
  • القوائم
  • الاستثناءات

ترجمة آلية تحت المراجعة

الحمض النووي

المصدر الأصلي

قائمة تنفيذ التمرين

تُحفظ علامات هذه القائمة على هذا الجهاز والمتصفح فقط. أنشئ حسابًا مفعّلًا لحفظ إنجاز التمرين في مسارك.

الحمض النووي

مشكلة بحاجة إلى حل

تم استخدام الحمض النووي، وهو حامل المعلومات الجينية في الكائنات الحية، في العدالة الجنائية لعقود من الزمن. ولكن كيف يعمل تحليل الحمض النووي بالضبط؟ بالنظر إلى تسلسل الحمض النووي، كيف يمكن لمحققي الطب الشرعي تحديد هوية من ينتمي؟

في ملف يسمى dna.py في مجلد يسمى dna، تنفيذ برنامج يحدد لمن ينتمي تسلسل الحمض النووي.

تجريبي

رمز التوزيع

بالنسبة لهذه المشكلة، ستقوم بتوسيع وظيفة الشيفرة المقدمة لك من قبل موظفي CS50.

قم بتنزيل كود التوزيع

قم بتسجيل الدخول cs50.dev، انقر على نافذتك الطرفية، وقم بالتنفيذ cd بمفرده. يجب أن تجد أن مطالبة النافذة الطرفية الخاصة بك تشبه ما يلي:

$

التنفيذ التالي

wget https://cdn.cs50.net/2026/x/psets/6/dna.zip

من أجل تنزيل ملف ZIP يسمى dna.zip في مساحة الشيفرة الخاصة بك.

ثم نفذ

unzip dna.zip

لإنشاء مجلد يسمى dna. لم تعد بحاجة إلى ملف ZIP، حتى تتمكن من التنفيذ

rm dna.zip

ثم قم بالرد بـ "y" متبوعًا بـ Enter عند المطالبة لإزالة ملف ZIP الذي قمت بتنزيله.

الآن اكتب

cd dna

متبوعًا بـ Enter للانتقال إلى (i.e.، open) هذا الدليل. يجب أن تشبه مطالبتك الآن ما يلي.

dna/ $

تنفيذ ls بمفرده، ويجب أن تشاهد بعض الملفات والمجلدات:

databases/ dna.py sequences/

إذا واجهت أي مشكلة، فاتبع نفس الخطوات مرة أخرى لترى ما إذا كان بإمكانك تحديد الخطأ الذي ارتكبته!

الخلفية

الحمض النووي هو في الواقع مجرد سلسلة من الجزيئات تسمى النيوكليوتيدات، مرتبة في شكل معين (حلزون مزدوج). تحتوي كل خلية بشرية على مليارات النيوكليوتيدات مرتبة بالتسلسل. يحتوي كل نيوكليوتيد من الحمض النووي على واحدة من أربع قواعد مختلفة: الأدينين (A)، السيتوزين (C)، الجوانين (G)، أو الثايمين (T). بعض أجزاء هذا التسلسل (i.e.، الجينوم) هي نفسها، أو على الأقل متشابهة جدًا، لدى جميع البشر تقريبًا، ولكن أجزاء أخرى من التسلسل لها تنوع جيني أعلى، وبالتالي تختلف أكثر بين السكان.

أحد الأماكن التي يميل فيها الحمض النووي إلى التنوع الجيني العالي هو التكرارات الترادفية القصيرة (STRs). إن STR عبارة عن تسلسل قصير من قواعد الحمض النووي التي تميل إلى التكرار عدة مرات متتالية في مواقع محددة داخل الحمض النووي للشخص. يختلف عدد المرات التي يتكرر فيها STR بشكل كبير بين الأفراد. في عينات الحمض النووي أدناه، على سبيل المثال، تمتلك أليس STR AGAT تكرر أربع مرات في حمضها النووي، في حين أن بوب لديه نفس STR تكرر خمس مرات.

Sample STRs

يمكن أن يؤدي استخدام تقارير المعاملات المشبوهة المتعددة، بدلاً من واحدة فقط، إلى تحسين دقة تحديد مواصفات الحمض النووي. إذا كان احتمال أن يكون لدى شخصين نفس العدد من التكرارات لحادثة مشبوهة واحدة هو 5%، ونظر المحلل إلى 10 تقارير مشبوهة مختلفة، فإن احتمال تطابق عينتين من الحمض النووي عن طريق الصدفة البحتة هو حوالي 1 في 1 كوادريليون (بافتراض أن جميع تقارير المعاملات المشبوهة مستقلة عن بعضها البعض). لذا، إذا تطابقت عينتان من الحمض النووي في عدد التكرارات لكل من تقارير المعاملات المشبوهة، يمكن للمحلل أن يكون واثقًا تمامًا من أنهما جاءتا من نفس الشخص. CODIS، مكتب التحقيقات الفيدرالي قاعدة بيانات الحمض النووي، يستخدم 20 تقريرًا مختلفًا من تقارير المعاملات المشبوهة كجزء من عملية تحديد مواصفات الحمض النووي الخاص به.

كيف يمكن أن تبدو قاعدة بيانات الحمض النووي هذه؟ حسنًا، في أبسط أشكاله، يمكنك تخيل تنسيق قاعدة بيانات الحمض النووي كملف CSV، حيث يتوافق كل صف مع فرد، وكل عمود يتوافق مع STR معين.

name,AGAT,AATG,TATC
Alice,28,42,14
Bob,17,22,19
Charlie,36,18,25

تشير البيانات الموجودة في الملف أعلاه إلى أن أليس لديها التسلسل AGAT تكرر هذا التسلسل 28 مرة متتالية في مكان ما من حمضها النووي AATG تكرر 42 مرة، و TATC تكررت 14 مرة. وفي الوقت نفسه، قام بوب بتكرار نفس هذه المعاملات المشبوهة الثلاثة 17 مرة، و22 مرة، و19 مرة على التوالي. وتشارلي لديه نفس هذه المعاملات المشبوهة الثلاث التي تكررت 36 و18 و25 مرة على التوالي.

إذن، بالنظر إلى تسلسل الحمض النووي، كيف يمكنك تحديد هوية من ينتمي؟ حسنًا، تخيل أنك بحثت في تسلسل الحمض النووي عن أطول تسلسل متتالي متكرر AGATs ووجدت أن أطول تسلسل كان 17 تكرارًا. إذا وجدت بعد ذلك أن أطول تسلسل لـ AATG يبلغ طوله 22 تكرارًا، وهو أطول تسلسل من TATC يبلغ طوله 19 تكرارًا، وهذا من شأنه أن يوفر دليلًا جيدًا على أن الحمض النووي كان لبوب. بالطبع، من الممكن أيضًا أنه بمجرد قيامك بتعداد كل من تقارير المعاملات المشبوهة، فإنها لا تتطابق مع أي شخص في قاعدة بيانات الحمض النووي الخاصة بك، وفي هذه الحالة لن يكون لديك أي تطابق.

من الناحية العملية، نظرًا لأن المحللين يعرفون أي كروموسوم وفي أي موقع في الحمض النووي سيتم العثور على STR، فيمكنهم ترجمة بحثهم إلى قسم ضيق فقط من الحمض النووي. لكننا سنتجاهل هذه التفاصيل لهذه المشكلة.

مهمتك هي كتابة برنامج يأخذ تسلسل الحمض النووي وملف CSV يحتوي على أعداد STR لقائمة الأفراد ثم إخراج الحمض النووي (على الأرجح) الذي ينتمي إليه.

المواصفات

  • يجب أن يطلب البرنامج كوسيطة سطر الأوامر الأولى اسم ملف CSV الذي يحتوي على عدد STR لقائمة الأفراد ويجب أن يطلب كوسيطة سطر الأوامر الثانية اسم ملف نصي يحتوي على تسلسل الحمض النووي لتحديده.
    • إذا تم تنفيذ برنامجك باستخدام عدد غير صحيح من وسائط سطر الأوامر، فيجب أن يقوم برنامجك بطباعة رسالة خطأ من اختيارك (مع print). إذا تم توفير العدد الصحيح من الوسائط، فقد تفترض أن الوسيطة الأولى هي بالفعل اسم ملف ملف CSV صالح وأن الوسيطة الثانية هي اسم ملف ملف نصي صالح.
  • يجب أن يفتح برنامجك ملف CSV ويقرأ محتوياته في الذاكرة.
    • قد تفترض أن الصف الأول من ملف CSV سيكون أسماء الأعمدة. العمود الأول سيكون الكلمة name وستكون الأعمدة المتبقية هي تسلسلات STR نفسها.
  • يجب أن يفتح برنامجك تسلسل الحمض النووي ويقرأ محتوياته في الذاكرة.
  • بالنسبة لكل من تقارير STR (من السطر الأول من ملف CSV)، يجب أن يقوم برنامجك بحساب أطول فترة من التكرارات المتتالية لـ STR في تسلسل الحمض النووي لتحديده. لاحظ أننا قمنا بتحديد وظيفة مساعدة لك، longest_match، والذي سيفعل ذلك تمامًا!
  • إذا كانت أعداد STR تتطابق تمامًا مع أي من الأفراد في ملف CSV، فيجب أن يقوم برنامجك بطباعة اسم الفرد المطابق.
    • قد تفترض أن أعداد STR لن تتطابق مع أكثر من فرد واحد.
    • إذا كانت أعداد STR لا تتطابق تمامًا مع أي من الأفراد الموجودين في ملف CSV، فيجب أن يقوم برنامجك بالطباعة No match.

تلميحات

  • قد تجد لغة بايثون وحدة csv مفيدة لقراءة ملفات CSV في الذاكرة. قد يكون من مساعدة خاصة csv.DictReader.
    • على سبيل المثال، إذا كان الملف مثل foo.csv يحتوي على صف رأس، حيث تمثل كل سلسلة اسمًا لحقل ما، وإليك كيفية طباعة تلك fieldnames بصفته أ list:
      import csv
      
      with open("foo.csv") as file:
          reader = csv.DictReader(file)
          print(reader.fieldnames)
      
    • وإليك كيفية قراءة جميع الصفوف (الأخرى) من ملف CSV إلى ملف list، حيث يكون كل عنصر أ dict الذي يمثل هذا الصف: قد تكون وظائف
      import csv
      
      rows = []
      with open("foo.csv") as file:
          reader = csv.DictReader(file)
          for row in reader:
              rows.append(row)
      
  • ال يتم استخدام الدالة open و read مفيدة أيضًا لقراءة الملفات النصية في الذاكرة.
  • فكر في هياكل البيانات التي قد تكون مفيدة لمتابعة تتبع المعلومات في برنامجك. أ list أو أ dict قد يكون مفيدًا.
  • تذكر أننا قمنا بتعريف دالة (longest_match) الذي، في ضوء كل من تسلسل الحمض النووي وSTR كمدخلات، يُرجع الحد الأقصى لعدد المرات التي يتكرر فيها STR. يمكنك بعد ذلك استخدام هذه الوظيفة في أجزاء أخرى من برنامجك!

الإرشادات التفصيلية

محتوى خارجي من YouTube

لن نتصل بهذه الخدمة قبل موافقتك. يمكنك فتح المصدر في نافذة مستقلة بدل تحميله هنا.

فتح المصدر

كيفية الاختبار

بينما check50 متاح لهذه المشكلة، ننصحك أولاً باختبار الشيفرة بنفسك لكل مما يلي.

  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/small.csv sequences/1.txt. يجب أن يخرج برنامجك Bob.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/small.csv sequences/2.txt. يجب أن يخرج برنامجك No match.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/small.csv sequences/3.txt. يجب أن يخرج برنامجك No match.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/small.csv sequences/4.txt. يجب أن يخرج برنامجك Alice.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/large.csv sequences/5.txt. يجب أن يخرج برنامجك Lavender.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/large.csv sequences/6.txt. يجب أن يخرج برنامجك Luna.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/large.csv sequences/7.txt. يجب أن يخرج برنامجك Ron.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/large.csv sequences/8.txt. يجب أن يخرج برنامجك Ginny.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/large.csv sequences/9.txt. يجب أن يخرج برنامجك Draco.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/large.csv sequences/10.txt. يجب أن يخرج برنامجك Albus.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/large.csv sequences/11.txt. يجب أن يخرج برنامجك Hermione.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/large.csv sequences/12.txt. يجب أن يخرج برنامجك Lily.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/large.csv sequences/13.txt. يجب أن يخرج برنامجك No match.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/large.csv sequences/14.txt. يجب أن يخرج برنامجك Severus.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/large.csv sequences/15.txt. يجب أن يخرج برنامجك Sirius.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/large.csv sequences/16.txt. يجب أن يخرج برنامجك No match.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/large.csv sequences/17.txt. يجب أن يخرج برنامجك Harry.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/large.csv sequences/18.txt. يجب أن يخرج برنامجك No match.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/large.csv sequences/19.txt. يجب أن يخرج برنامجك Fred.
  • قم بتشغيل البرنامج الخاص بك باسم python dna.py databases/large.csv sequences/20.txt. يجب أن يخرج برنامجك No match.

صحة

check50 cs50/problems/2026/x/dna

النمط

style50 dna.py

كيفية الإرسال

في جهازك الطرفي، قم بتنفيذ ما يلي لإرسال عملك، والإجابة على المطالبات التي تظهر أيضًا.

submit50 cs50/problems/2026/x/dna

أنهيت التطبيق؟

راجع عناصر التنفيذ أعلاه، ثم احفظ إنجازك وانتقل إلى التمرين التالي.

حفظ إنجاز التمرين

يمكنك قراءة الدورة كاملة دون حساب. يصبح حفظ التقدم متاحًا بعد تفعيل الحساب، ويبقى محفوظًا بعد انتهاء العضوية.

العودة إلى جميع التمارين