Menu
Coddy logo textTech

Podsumowanie — licznik częstości słów

Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 30 z 68.

challenge icon

Wyzwanie

Łatwy

Zbuduj narzędzie do analizy tekstu, które zlicza częstotliwość występowania słów w dokumencie. To wyzwanie pokazuje, jak dobrze mapy sprawdzają się w agregowaniu danych, śledząc, ile razy każde unikalne słowo pojawia się w tekście.

Otrzymasz dwa wejścia:

  • Ciąg znaków reprezentujący tekst do analizy (np. "the quick brown fox jumps over the lazy dog the fox is quick")
  • Ciąg znaków reprezentujący minimalny próg częstotliwości (np. "2")

Ważne: Tekst wejściowy może zawierać spacje, więc musisz odczytać cały wiersz za pomocą bufio.NewReader z ReadString('\n') lub bufio.Scanner: nie używaj fmt.Scanln do odczytu tekstu, ponieważ przestaje on czytać przy pierwszej spacji.

Twoje zadanie:

  1. Utwórz funkcję o nazwie countWords, która przyjmuje ciąg znaków z tekstem i zwraca map[string]int, gdzie:
    • Kluczami są poszczególne słowa (ciągi znaków)
    • Wartościami są liczby wystąpień każdego słowa (liczby całkowite)
  2. Przetwórz tekst wejściowy, dzieląc go na poszczególne słowa za pomocą strings.Fields (które dzieli tekst przy dowolnych białych znakach)
  3. Zlicz częstotliwość występowania każdego słowa w tekście:
    • Zamień wszystkie słowa na małe litery, aby zliczanie było spójne
    • Dla każdego słowa zwiększ jego licznik w mapie
    • Jeśli słowa nie ma jeszcze w mapie, jego wartość początkowa wyniesie 0 i zostanie zwiększona do 1
  4. Odfiltruj wyniki, aby wyświetlić tylko słowa występujące co najmniej tyle razy, ile wynosi próg
  5. Wyświetl wyniki w następującym formacie:
    • Nagłówek: "Word Frequency Analysis:"
    • Dla każdego słowa spełniającego warunek: "[word]: [count]"
    • Wyświetl słowa w kolejności alfabetycznej
  6. Oblicz i wyświetl statystyki podsumowujące:
    • "Total unique words: [total_unique_count]"
    • "Words above threshold: [filtered_count]"
    • "Most frequent word: [word] ([count] times)"
    • Jeśli kilka słów ma tę samą najwyższą liczbę wystąpień, podaj to, które jest pierwsze w kolejności alfabetycznej. Jeśli każde słowo występuje raz, będzie to po prostu pierwsze słowo z posortowanej listy.

Na przykład dla tekstu wejściowego "hello hello world" i progu "2" wynik powinien wyglądać tak:

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

Użyj pakietu bufio, aby odczytywać całe wiersze wejściowe, pakietu strings, aby podzielić tekst i zamienić go na małe litery, pakietu strconv, aby przekonwertować ciąg znaków z progiem na liczbę całkowitą, oraz pakietu sort, aby posortować słowa alfabetycznie. To wyzwanie pokazuje, jak mapy zapewniają eleganckie rozwiązanie do zliczania i agregowania danych, a zachowanie wartości zerowej map upraszcza i usprawnia logikę zliczania.

Spróbuj swoich sił

package main

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

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

	// Wczytaj całą linię tekstu (wraz ze spacjami)
	scanner.Scan()
	text := scanner.Text()

	// Wczytaj wartość progu
	scanner.Scan()
	thresholdStr := scanner.Text()

	// Przekonwertuj threshold na liczbę całkowitą
	threshold, _ := strconv.Atoi(thresholdStr)

	// TODO: Napisz swój kod poniżej
	// 1. Utwórz funkcję countWords, która zwraca map[string]int
	//    Wskazówka: użyj strings.Fields i strings.ToLower do dzielenia tekstu na słowa i ujednolicania ich zapisu
	// 2. Użyj funkcji do policzenia częstości występowania słów
	// 3. Odfiltruj słowa, które występują co najmniej 'threshold' razy
	// 4. Posortuj odfiltrowane słowa alfabetycznie i je wyświetl
	// 5. Oblicz i wyświetl statystyki podsumowujące

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

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Go online