Menu
Coddy logo textTech

Riepilogo - Contatore della frequenza delle parole

Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 30 di 68.

challenge icon

Sfida

Facile

Crea uno strumento di analisi del testo che conti la frequenza delle parole in un documento. Questa sfida dimostra come le mappe siano efficaci nell'aggregare dati, tenendo traccia del numero di volte in cui compare ogni parola unica in un testo.

Riceverai due input:

  • Una stringa che rappresenta il testo da analizzare (ad esempio, "the quick brown fox jumps over the lazy dog the fox is quick")
  • Una stringa che rappresenta la soglia minima di frequenza (ad esempio, "2")

Importante: Il testo di input può contenere spazi, quindi devi leggere l'intera riga usando bufio.NewReader con ReadString('\n') oppure un bufio.Scanner: non usare fmt.Scanln per l'input di testo, perché interrompe la lettura al primo spazio.

Il tuo compito è:

  1. Creare una funzione chiamata countWords che accetta una stringa di testo e restituisce una map[string]int, in cui:
    • Le chiavi sono singole parole (stringhe)
    • I valori sono la frequenza di ciascuna parola (numeri interi)
  2. Analizzare il testo di input suddividendolo in singole parole usando strings.Fields (che suddivide in corrispondenza di qualsiasi spazio vuoto)
  3. Contare la frequenza di ogni parola nel testo:
    • Convertire tutte le parole in minuscolo per ottenere un conteggio coerente
    • Per ogni parola, incrementare il suo conteggio nella mappa
    • Se una parola non è ancora presente nella mappa, il suo valore iniziale sarà 0 e verrà incrementato a 1
  4. Filtrare i risultati per mostrare solo le parole che compaiono almeno tante volte quanto indicato dalla soglia
  5. Visualizzare i risultati nel seguente formato:
    • Intestazione: "Word Frequency Analysis:"
    • Per ogni parola che soddisfa i requisiti: "[word]: [count]"
    • Visualizzare le parole in ordine alfabetico
  6. Calcolare e visualizzare le statistiche riepilogative:
    • "Total unique words: [total_unique_count]"
    • "Words above threshold: [filtered_count]"
    • "Most frequent word: [word] ([count] times)"
    • Quando più parole hanno lo stesso conteggio massimo, riportare quella che viene prima in ordine alfabetico. Se ogni parola compare una sola volta, è semplicemente la prima parola dell'elenco ordinato.

Ad esempio, dati il testo di input "hello hello world" e la soglia "2", l'output dovrebbe essere:

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

Usa il pacchetto bufio per leggere intere righe di input, il pacchetto strings per suddividere il testo e convertirlo in minuscolo, il pacchetto strconv per convertire la stringa della soglia in un numero intero e il pacchetto sort per ordinare le parole alfabeticamente. Questa sfida dimostra come le mappe offrano una soluzione efficace per contare e aggregare dati, e come il comportamento del valore zero delle mappe renda la logica di conteggio semplice ed efficiente.

Provalo tu

package main

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

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

	// Leggi l'intera riga di testo (inclusi gli spazi)
	scanner.Scan()
	text := scanner.Text()

	// Leggi il valore di soglia
	scanner.Scan()
	thresholdStr := scanner.Text()

	// Converti threshold in un numero intero
	threshold, _ := strconv.Atoi(thresholdStr)

	// TODO: Scrivi il tuo codice qui sotto
	// 1. Crea la funzione countWords che restituisce un map[string]int
	//    Suggerimento: usa strings.Fields e strings.ToLower per separare e normalizzare le parole
	// 2. Usa la funzione per contare le occorrenze delle parole
	// 3. Filtra le parole che compaiono almeno 'threshold' volte
	// 4. Ordina alfabeticamente le parole filtrate e visualizzale
	// 5. Calcola e visualizza le statistiche riepilogative

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

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Go online