typestar

word_freq.cpp en C++

Un reporte de frecuencia de palabras sobre un pasaje embebido, con un solo std::map contando.

#include <algorithm>
#include <cctype>
#include <format>
#include <iostream>
#include <map>
#include <string>
#include <vector>

// word_freq: count word occurrences in an inline passage

int main() {
    const std::string text =
        "The quick brown fox jumps over the lazy dog. "
        "The dog barks; the fox runs. Quick thinking, that fox.";

    std::map<std::string, int> freq;
    int total = 0;
    std::string word;
    for (char raw : text + " ") {
        unsigned char c = static_cast<unsigned char>(raw);
        if (std::isalpha(c)) {
            word += static_cast<char>(std::tolower(c));
        } else if (!word.empty()) {
            ++freq[word];
            ++total;
            word.clear();
        }
    }

    std::cout << "words total: " << total << "\n";
    std::cout << "words unique: " << freq.size() << "\n";

    std::vector<std::pair<std::string, int>> ranked(freq.begin(),
                                                    freq.end());
    std::ranges::sort(ranked, [](const auto &a, const auto &b) {
        if (a.second != b.second) return a.second > b.second;
        return a.first < b.first;
    });

    std::cout << "top 5:\n";
    for (std::size_t i = 0; i < ranked.size() && i < 5; ++i) {
        std::cout << std::format("  {:<8} {}\n",
                                 ranked[i].first, ranked[i].second);
    }

    std::cout << "seen once:";
    for (const auto &[entry, count] : ranked) {
        if (count == 1) {
            std::cout << " " << entry;
        }
    }
    std::cout << "\n";
}

Cómo funciona

  1. Un recorrido por caracteres baja las letras a minúsculas en word y la vuelca en freq en cada corte.
  2. Copiar el map a un vector deja que std::ranges::sort ordene por conteo y luego alfabéticamente.
  3. El bucle del top 5 imprime filas alineadas con std::format; una pasada final lista las palabras únicas.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
53
Caracteres a escribir
1244
Tokens
406
Ritmo de tres estrellas
80 tpm

Al ritmo de tres estrellas de 80 tokens por minuto, este intento toma unos 304 segundos.

Escribe este fragmento

Paso 1 de 3 en Bis; paso 25 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →