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

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

جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 30 من 68.

challenge icon

التحدي

سهل

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

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

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

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

مهمتك هي:

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

على سبيل المثال، إذا كان النص المدخل "hello hello world" والحد الأدنى "2"، يجب أن يكون المخرج:

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

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

جرّب بنفسك

package main

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

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

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

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

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

	// TODO: اكتب الكود الخاص بك أدناه
	// 1. قم بإنشاء دالة countWords التي ترجع map[string]int
	//    تلميح: استخدم strings.Fields و strings.ToLower لتقسيم الكلمات وتوحيد حالتها
	// 2. استخدم الدالة لحساب ترددات الكلمات
	// 3. قم بتصفية الكلمات التي تظهر على الأقل عدد 'threshold' من المرات
	// 4. قم بفرز الكلمات المصفاة أبجدياً وعرضها
	// 5. حساب وعرض الإحصائيات الملخصة

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

جميع دروس Logic & Flow