Menu
Coddy logo textTech

Resumen - Contador de frecuencia de palabras

Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 30 de 68.

challenge icon

Desafío

Fácil

Crea una herramienta de análisis de texto que cuente las frecuencias de las palabras en un documento. Este desafío demuestra cómo los mapas sobresalen en la agregación de datos al rastrear cuántas veces aparece cada palabra única en un fragmento de texto.

Recibirás dos entradas:

  • Una cadena que representa el texto a analizar (por ejemplo, "the quick brown fox jumps over the lazy dog the fox is quick")
  • Una cadena que representa el umbral de frecuencia mínima (por ejemplo, "2")

Importante: El texto de entrada puede contener espacios, por lo que debes leer la línea completa usando bufio.NewReader con ReadString('\n') o un bufio.Scannerno uses fmt.Scanln para la entrada de texto, ya que deja de leer en el primer espacio.

Tu tarea es:

  1. Crear una función llamada countWords que reciba una cadena de texto y devuelva un map[string]int donde:
    • Las claves son palabras individuales (cadenas)
    • Los valores son el recuento de frecuencia de cada palabra (enteros)
  2. Analizar el texto de entrada dividiéndolo en palabras individuales usando strings.Fields (que divide por cualquier espacio en blanco)
  3. Contar la frecuencia de cada palabra en el texto:
    • Convierte todas las palabras a minúsculas para un conteo consistente
    • Para cada palabra, incrementa su recuento en el mapa
    • Si una palabra aún no existe en el mapa, comenzará en 0 y se incrementará a 1
  4. Filtrar los resultados para mostrar solo las palabras que aparecen al menos tantas veces como el umbral
  5. Mostrar los resultados en el siguiente formato:
    • Encabezado: "Word Frequency Analysis:"
    • Para cada palabra que califique: "[word]: [count]"
    • Mostrar las palabras en orden alfabético
  6. Calcular y mostrar estadísticas de resumen:
    • "Total unique words: [total_unique_count]"
    • "Words above threshold: [filtered_count]"
    • "Most frequent word: [word] ([count] times)"

Por ejemplo, dado el texto de entrada "hello hello world" y el umbral "2", la salida debería ser:

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

Usa el paquete bufio para leer líneas completas de entrada, el paquete strings para dividir el texto y convertirlo a minúsculas, el paquete strconv para convertir la cadena del umbral en un entero, y el paquete sort para ordenar las palabras alfabéticamente. Este desafío demuestra cómo los mapas proporcionan una solución elegante para contar y agregar datos, con el comportamiento de valor cero de los mapas haciendo que la lógica de conteo sea simple y eficiente.

Pruébalo tú mismo

package main

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

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

	// Leer la línea completa de texto (incluyendo espacios)
	scanner.Scan()
	text := scanner.Text()

	// Leer el valor del umbral
	scanner.Scan()
	thresholdStr := scanner.Text()

	// Convertir el umbral a entero
	threshold, _ := strconv.Atoi(thresholdStr)

	// TODO: Escribe tu código a continuación
	// 1. Crea la función countWords que devuelva un map[string]int
	//    Pista: usa strings.Fields y strings.ToLower para dividir y normalizar las palabras
	// 2. Usa la función para contar las frecuencias de las palabras
	// 3. Filtra las palabras que aparecen al menos 'threshold' veces
	// 4. Ordena las palabras filtradas alfabéticamente y muéstralas
	// 5. Calcula y muestra las estadísticas de resumen

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

Todas las lecciones de Lógica y Flujo