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 la frecuencia de las palabras en un documento. Este desafío demuestra cómo los mapas son excelentes para agregar datos al registrar cuántas veces aparece cada palabra única en un texto.

Recibirás dos entradas:

  • Una cadena que representa el texto que se 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ínimo (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.Scanner: no uses fmt.Scanln para la entrada de texto, ya que deja de leer en el primer espacio.

Tu tarea es:

  1. Crea 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. Analiza el texto de entrada dividiéndolo en palabras individuales usando strings.Fields (que divide según cualquier espacio en blanco)
  3. Cuenta la frecuencia de cada palabra en el texto:
    • Convierte todas las palabras a minúsculas para realizar un recuento uniforme
    • 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. Filtra los resultados para mostrar solo las palabras que aparecen al menos tantas veces como el umbral
  5. Muestra los resultados en el siguiente formato:
    • Encabezado: "Word Frequency Analysis:"
    • Para cada palabra que cumpla el criterio: "[word]: [count]"
    • Muestra las palabras en orden alfabético
  6. Calcula y muestra las estadísticas resumidas:
    • "Total unique words: [total_unique_count]"
    • "Words above threshold: [filtered_count]"
    • "Most frequent word: [word] ([count] times)"
    • Cuando varias palabras compartan el recuento más alto, informa la que aparece primero alfabéticamente. Si todas las palabras aparecen una vez, será simplemente la primera palabra de la lista ordenada.

Por ejemplo, dada la entrada de texto "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 a 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, ya que el comportamiento del valor cero de los mapas hace que la lógica de conteo sea sencilla y eficiente.

Pruébalo tú mismo

package main

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

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

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

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

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

	// TODO: Escribe tu código a continuación
	// 1. Crea la función countWords que devuelve un map[string]int
	//    Pista: usa strings.Fields y strings.ToLower para dividir y normalizar las palabras
	// 2. Use the function to count word frequencies
	// 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

Practica por tu cuenta: Compilador de Go online