تخطَّ إلى المحتوى

مشروع: أكثر الكلمات تكراراً

الفكرة: تكرار <ملف> [عدد_الأوائل] يعدّ كلمات الملف، ويطبع عددها وعدد المختلف منها، ثم أكثرها تكراراً.

نص.txt
ميم لغة برمجة عربية، والبرمجة بالعربية ممتعة.
في ميم تكتب البرنامج بالعربية، ثم يبنيه المجمّع ملفاً واحداً.
لغة ميم صغيرة: كلمات قليلة، وقواعد واضحة.
البرمجة بميم تعلّمك الذاكرة: من يحجز، ومن يحرّر؟
ميم، ميم، ميم!
تكرار.م
# أداة سطر أوامر: أكثر الكلمات تكراراً في ملف نصي
# الاستعمال: تكرار <ملف> [عدد_الأوائل]
استورد نظام
استورد ملفات
استورد رياضيات
اخطاء:
استعمال_خاطئ
هيكل مدخل:
كلمة نص
مرات عدد
ثابت علامات = ".،!؟,;:\"()"
داله نظف(كلمة نص) نص:
# يحذف علامات الترقيم من آخر الكلمة. جزء يرجع عرضاً بلا نسخ، لكن طول ويحوي عليه يحجزان نسخاً لا تُعاد (0.9.1)
ن = كلمة
طالما طول(ن) > 0 و يحوي(علامات, جزء(ن, طول(ن) - 1, طول(ن))):
ن = جزء(ن, 0, طول(ن) - 1)
ارجع ن
داله قبل(ا مدخل, ب مدخل) منطقي:
اذا ا.مرات != ب.مرات:
ارجع ا.مرات > ب.مرات
ارجع ا.كلمة < ب.كلمة
داله اقرأ_الوسائط() !قائمة[نص]:
و = نظام.وسائط()
اذا طول(و) < 1 او طول(و) > 2:
ارجع خطأ.استعمال_خاطئ
ارجع و
داله عد_الكلمات(مسار نص, عداد قاموس[نص, عدد]) !عدد:
سطور = جرّب ملفات.اقرأ_سطور(مسار)
خاتمه حرر(سطور)
مجموع = 0
لكل سطر في سطور:
قطع = تقسيم(قص_الفراغات(سطر), " ")
لكل قطعة في قطع:
ك = نظف(قطعة)
اذا طول(ك) == 0:
تجاوز
مجموع += 1
اذا يوجد(عداد, ك):
عداد[ك] = عداد[ك] + 1
غير ذلك:
عداد[ك] = 1
حرر(قطع)
ارجع مجموع
داله رئيسي() !فراغ:
و = اقرأ_الوسائط() والا خ:
اطبع("الاستعمال: تكرار <ملف> [عدد_الأوائل]")
ارجع خ
كم = 10
اذا طول(و) == 2:
كم = عدد(و[1]) والا خ:
اطبع("عدد الأوائل ليس عدداً: ", و[1])
ارجع خ
عداد قاموس[نص, عدد] = {}
خاتمه حرر(عداد)
مجموع = عد_الكلمات(و[0], عداد) والا خ:
اطبع("تعذّرت قراءة ", و[0], ": ", خ)
ارجع خ
مدخلات قائمة[مدخل] = []
خاتمه حرر(مدخلات)
لكل ك في مفاتيح(عداد):
اضف(مدخلات, مدخل(ك, عداد[ك]))
رتب_ب(مدخلات, قبل)
اطبع("كلمات: ", مجموع, "، مختلفة: ", طول(عداد))
لكل ع في مدى(0, رياضيات.اصغر_صحيح(كم, طول(مدخلات))):
م = مدخلات[ع]
اطبع(رياضيات.نسق_عدد(ع + 1, 3, خطاء), " ", رياضيات.نسق_عدد(م.مرات, 8, خطاء), " ", م.كلمة)
رئيسي() والا خ:
نظام.انهِ(1)
مخرجات مسجّلة من المجمّعmeem تكرار.م -- نص.txt 5 · meem 0.10.0+b01b55f
كلمات: 35، مختلفة: 28  1         6  ميم  2         2  بالعربية  3         2  لغة  4         1  البرمجة  5         1  البرنامج

بُني أيضاً بـ meem build عند بناء الموقع: ملف ساكن حجمه 69.1 ك.ب، شُغّل وحده وطابق مخرجه المخرج أعلاه.

غيّرنا عن نسخة التقرير شيئين: حذفنا سطر «الزمن الداخلي» لأن ناتجه يتغير في كل تشغيل، وصحّحنا تعليق نظف الذي كان يقول «عرض بلا حجز».

  1. الوسائط: اقرأ_الوسائط ترجع !قائمة[نص]، وخطؤها استعمال_خاطئ من كتلة اخطاء:. ورئيسي تعالجه بـ والا خ: فتطبع طريقة الاستعمال.
  2. القراءة: جرّب ملفات.اقرأ_سطور(مسار) تقرأ الملف كله سطوراً، وخاتمه حرر(سطور) بجانبها تعيد القائمة عند الخروج.
  3. العدّ: كل سطر يُقسم بـ تقسيم إلى قطع، ونظف تحذف علامات الترقيم من آخر الكلمة بـ جزء، والقاموس عداد يعدّ.
  4. الترتيب: رتب_ب(مدخلات, قبل) بدالة مقارنة: الأكثر تكراراً أولاً، ثم بترتيب الحروف.
  5. الطباعة: رياضيات.نسق_عدد يحاذي الأعمدة بعرض ثابت.
  • الكلفة الخفية (في 0.9.1): نظف تستعمل جزء لأنه «عرض» بلا نسخ. لكن في 0.9.1 كان طول(ن) على العرض داخل الحلقة يحجز نسخة صغيرة في كل مرة، لا تُعاد ولا تُرى في الشيفرة، ولم يظهر ذلك إلا بـ --debug-mem. في 0.10.0 لا تحجز العمليات على العرض شيئاً.
  • الذاكرة: على ملف 9 م.ب بلغت ذروة الملف المبني 69.6 م.ب، مقابل 10.7 لبرنامج بايثون المماثل: ميم تقرأ الملف كله وسطوره في الذاكرة (لا قراءة سطراً سطراً بعد)، وفوقها النسخ الخفية في 0.9.1. لم يُعَد هذا القياس على 0.10.0.
  • الزمن: 0.70 ث مبنياً ساكناً، و0.56 ث مبنياً بـ --dynamic، وبايثون 0.74 ث.
  • الأخطاء قيم: نسيان معالجة !قائمة خطأ ترجمة، فالبرنامج لا يصل إلى التشغيل وفيه فشل مهمَل.
  • خاتمه حرر(...) بجانب سطر الحجز تكفي في الحالات البسيطة، و--debug-mem يقول أي سطر لم يحرّر.
  • في حلقة طويلة على نصوص من جزء، احسب طول مرة واحدة واحفظه.