Menu
CoddyTech

Повторение — счётчик частоты слов

Часть раздела Логика и управление потоком путешествия по 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. Создать функцию 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 в целое число
	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:")
}

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

Потренируйтесь самостоятельно: Онлайн-компилятор Go