Menu
Coddy logo textTech

Итоги: счетчик частоты слов

Часть раздела Логика и управление потоком путешествия по 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, где:
    • Ключи — это отдельные слова (строки)
    • Значения — это частота появления каждого слова (целые числа)
  2. Разобрать входной текст, разбив его на отдельные слова с помощью strings.Fields (которая разделяет строку по любым пробельным символам)
  3. Подсчитать частоту каждого слова в тексте:
    • Преобразуйте все слова в нижний регистр для единообразного подсчета
    • Для каждого слова увеличьте его счетчик в карте
    • Если слова еще нет в карте, оно начнет с 0 и будет увеличено до 1
  4. Отфильтровать результаты, чтобы показать только те слова, которые встречаются не менее заданного порога раз
  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 для сортировки слов по алфавиту. Эта задача демонстрирует, как карты предоставляют элегантное решение для подсчета и агрегации данных, а поведение нулевого значения в картах делает логику подсчета простой и эффективной.

Попробуйте сами

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. Используйте функцию для подсчета частоты слов
	// 3. Отфильтруйте слова, которые встречаются как минимум 'threshold' раз
	// 4. Отсортируйте отфильтрованные слова по алфавиту и выведите их
	// 5. Рассчитайте и выведите сводную статистику

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

Все уроки раздела Логика и управление потоком