ترجمة آلية تحت المراجعة
الحمض النووي
المصدر الأصليقائمة تنفيذ التمرين
تُحفظ علامات هذه القائمة على هذا الجهاز والمتصفح فقط. أنشئ حسابًا مفعّلًا لحفظ إنجاز التمرين في مسارك.
الحمض النووي
مشكلة بحاجة إلى حل
تم استخدام الحمض النووي، وهو حامل المعلومات الجينية في الكائنات الحية، في العدالة الجنائية لعقود من الزمن. ولكن كيف يعمل تحليل الحمض النووي بالضبط؟ بالنظر إلى تسلسل الحمض النووي، كيف يمكن لمحققي الطب الشرعي تحديد هوية من ينتمي؟
في ملف يسمى 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 تكرر خمس مرات.

يمكن أن يؤدي استخدام تقارير المعاملات المشبوهة المتعددة، بدلاً من واحدة فقط، إلى تحسين دقة تحديد مواصفات الحمض النووي. إذا كان احتمال أن يكون لدى شخصين نفس العدد من التكرارات لحادثة مشبوهة واحدة هو 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 نفسها.
- قد تفترض أن الصف الأول من ملف CSV سيكون أسماء الأعمدة. العمود الأول سيكون الكلمة
- يجب أن يفتح برنامجك تسلسل الحمض النووي ويقرأ محتوياته في الذاكرة.
- بالنسبة لكل من تقارير 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. يمكنك بعد ذلك استخدام هذه الوظيفة في أجزاء أخرى من برنامجك!
الإرشادات التفصيلية
كيفية الاختبار
بينما 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