Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - عداد تكرار الكلمات

جزء من قسم المنطق وتدفق التنفيذ في رحلة GO على Coddy. الدرس 30 من 68.

challenge icon

التحدي

سهل

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

ستتلقى مُدخلين:

  • سلسلة نصية تمثل النص المراد تحليله (مثلًا، "the quick brown fox jumps over the lazy dog the fox is quick")
  • سلسلة نصية تمثل الحد الأدنى لعتبة التكرار (مثلًا، "2")

مهم: قد يحتوي النص المُدخل على مسافات، لذلك يجب قراءة السطر الكامل باستخدام bufio.NewReader مع ReadString('\n') أو باستخدام bufio.Scanner: لا تستخدم fmt.Scanln لإدخال النص، لأنه يتوقف عن القراءة عند أول مسافة.

مهمتك هي:

  1. إنشاء function باسم countWords تأخذ سلسلة نصية وتُرجع map[string]int حيث:
    • المفاتيح هي الكلمات الفردية (سلاسل نصية)
    • القيم هي عدد تكرارات كل كلمة (أعداد صحيحة)
  2. تحليل النص المُدخل بتقسيمه إلى كلمات فردية باستخدام strings.Fields (التي تقسّم النص عند أي مسافة بيضاء)
  3. حساب تكرار كل كلمة في النص:
    • تحويل جميع الكلمات إلى أحرف صغيرة لضمان اتساق العد
    • لكل كلمة، زيادة عددها في الخريطة
    • إذا لم تكن الكلمة موجودة في الخريطة بعد، فستبدأ بالقيمة 0 وتزداد إلى 1
  4. تصفية results لإظهار الكلمات التي تظهر عددًا من المرات لا يقل عن قيمة threshold
  5. عرض النتائج بالتنسيق التالي:
    • العنوان: "Word Frequency Analysis:"
    • لكل كلمة مؤهلة: "[word]: [count]"
    • عرض الكلمات بترتيب alphabetical
  6. حساب وعرض إحصاءات ملخّصة:
    • "Total unique words: [total_unique_count]"
    • "Words above threshold: [filtered_count]"
    • "Most frequent word: [word] ([count] times)"
    • عندما تشترك عدة كلمات في أعلى count، أبلغ عن الكلمة التي تأتي أولًا alphabetical. وعند ظهور كل كلمة مرة واحدة، تكون ببساطة الكلمة الأولى في القائمة المرتبة.

على سبيل المثال، إذا كان النص المُدخل "hello hello world" وكانت threshold هي "2"، فيجب أن يكون الناتج:

Word Frequency Analysis:
hello: 2
Total unique words: 2
Words above threshold: 1
Most frequent word: hello (2 times)

استخدم الحزمة bufio لقراءة أسطر الإدخال الكاملة، والحزمة strings لتقسيم النص وتحويله إلى أحرف صغيرة، والحزمة strconv لتحويل سلسلة threshold إلى عدد صحيح، والحزمة sort لترتيب الكلمات alphabetically. يوضح هذا التحدي كيف توفر الخرائط حلًا أنيقًا لعدّ البيانات وتجميعها، إذ يجعل سلوك القيمة الصفرية للخرائط منطق العد بسيطًا وفعّالًا.

جرّب بنفسك

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)

	// اقرأ سطر النص الكامل (بما في ذلك المسافات)
	scanner.Scan()
	text := scanner.Text()

	// اقرأ قيمة العتبة
	scanner.Scan()
	thresholdStr := scanner.Text()

	// حوّل العتبة إلى عدد صحيح
	threshold, _ := strconv.Atoi(thresholdStr)

	// TODO: اكتب شفرتك أدناه
	// 1. أنشئ الدالة countWords التي تُرجع map[string]int
	//    تلميح: استخدم strings.Fields و strings.ToLower لتقسيم الكلمات وتطبيعها
	// 2. Use the function to count word frequencies
	// 3. صفِّ الكلمات التي تظهر على الأقل 'threshold' مرات
	// 4. رتّب الكلمات المُصفّاة أبجديًا واعرضها
	// 5. احسب واعرض الإحصائيات الملخصة

	_ = text
	_ = threshold
	fmt.Println("Word Frequency Analysis:")
}

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم Go عبر الإنترنت