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
- Un recorrido por caracteres baja las letras a minúsculas en
wordy la vuelca enfreqen cada corte. - Copiar el map a un vector deja que
std::ranges::sortordene por conteo y luego alfabéticamente. - El bucle del top 5 imprime filas alineadas con
std::format; una pasada final lista las palabras únicas.
Palabras clave y builtins usados aquí
autocharconstelseforifintreturnsize_tstatic_castunsigned
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.
Paso 1 de 3 en Bis; paso 25 de 27 en Fundamentos del lenguaje.