Menu
Coddy logo textTech

Recapitulação - Contador de Frequência de Palavras

Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 30 de 68.

challenge icon

Desafio

Fácil

Crie uma ferramenta de análise de texto que conte a frequência das palavras em um documento. Este desafio demonstra como os mapas são excelentes para agregar dados, rastreando quantas vezes cada palavra única aparece em um trecho de texto.

Você receberá duas entradas:

  • Uma string representando o texto a ser analisado (ex: "the quick brown fox jumps over the lazy dog the fox is quick")
  • Uma string representando o limite mínimo de frequência (ex: "2")

Importante: O texto de entrada pode conter espaços, portanto você deve ler a linha completa usando bufio.NewReader com ReadString('\n') ou um bufio.Scannernão use fmt.Scanln para a entrada de texto, pois ele para a leitura no primeiro espaço.

Sua tarefa é:

  1. Criar uma função chamada countWords que recebe uma string de texto e retorna um map[string]int onde:
    • As chaves são palavras individuais (strings)
    • Os valores são a contagem de frequência de cada palavra (inteiros)
  2. Analisar o texto de entrada dividindo-o em palavras individuais usando strings.Fields (que divide em qualquer espaço em branco)
  3. Contar a frequência de cada palavra no texto:
    • Converta todas as palavras para minúsculas para uma contagem consistente
    • Para cada palavra, incremente sua contagem no mapa
    • Se uma palavra ainda não existir no mapa, ela começará em 0 e será incrementada para 1
  4. Filtrar os resultados para mostrar apenas as palavras que aparecem pelo menos o número de vezes definido pelo limite (threshold)
  5. Exibir os resultados no seguinte formato:
    • Cabeçalho: "Word Frequency Analysis:"
    • Para cada palavra qualificada: "[word]: [count]"
    • Exibir as palavras em ordem alfabética
  6. Calcular e exibir estatísticas de resumo:
    • "Total unique words: [total_unique_count]"
    • "Words above threshold: [filtered_count]"
    • "Most frequent word: [word] ([count] times)"

Por exemplo, dado o texto de entrada "hello hello world" e o limite "2", a saída deve ser:

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

Use o pacote bufio para ler linhas completas de entrada, o pacote strings para dividir o texto e converter para minúsculas, o pacote strconv para converter a string do limite em um inteiro, e o pacote sort para ordenar as palavras alfabeticamente. Este desafio demonstra como os mapas fornecem uma solução elegante para contagem e agregação de dados, com o comportamento de valor zero (zero-value) dos mapas tornando a lógica de contagem simples e eficiente.

Experimente você mesmo

package main

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

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

	// Leia a linha completa de texto (incluindo espaços)
	scanner.Scan()
	text := scanner.Text()

	// Leia o valor do limite (threshold)
	scanner.Scan()
	thresholdStr := scanner.Text()

	// Converta o limite para inteiro
	threshold, _ := strconv.Atoi(thresholdStr)

	// TODO: Escreva seu código abaixo
	// 1. Crie a função countWords que retorna um map[string]int
	//    Dica: use strings.Fields e strings.ToLower para dividir e normalizar as palavras
	// 2. Use a função para contar as frequências das palavras
	// 3. Filtre as palavras que aparecem pelo menos 'threshold' vezes
	// 4. Ordene as palavras filtradas em ordem alfabética e exiba-as
	// 5. Calcule e exiba as estatísticas de resumo

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

Todas as lições de Lógica & Fluxo