Problema
Los modelos de lenguaje trabajan con tokens, no con texto sin procesar. Un tokenizador simple pasa el texto a minúsculas y trata cada secuencia de letras a-z y dígitos 0-9 como una palabra; todo lo demás (espacios, puntuación, otros caracteres) separa palabras.
Construye el vocabulario: las palabras distintas ordenadas por frecuencia (la más frecuente primero), con los empates resueltos por orden alfabético. La posición de una palabra en esta lista es su ID de token.
Implementa build_vocabulary(text).
Entrada
text: Cualquier texto.
Salida
Devuelve el vocabulario como una lista de palabras. Si el texto no tiene palabras, devuelve una lista vacía.
Restricciones
0 ≤ longitud de text ≤ 100.000
Ejemplos
Entrada:
text = "The cat sat on the mat. The end!"
Salida esperada:
expected = ["the", "cat", "end", "mat", "on", "sat"]
Entrada:
std::string text = "The cat sat on the mat. The end!";
Salida esperada:
std::vector<std::string> expected = {"the", "cat", "end", "mat", "on", "sat"};
Entrada:
string text = "The cat sat on the mat. The end!";
Salida esperada:
string[] expected = new string[] {"the", "cat", "end", "mat", "on", "sat"};
Explicación
En minúsculas, las palabras son the, cat, sat, on, the, mat, the, end. "the" aparece 3 veces; las demás aparecen una vez y se ordenan alfabéticamente: ["the", "cat", "end", "mat", "on", "sat"].
Entrada:
text = "AI, ai and A.I. (2024)"
Salida esperada:
expected = ["ai", "2024", "a", "and", "i"]
Entrada:
std::string text = "AI, ai and A.I. (2024)";
Salida esperada:
std::vector<std::string> expected = {"ai", "2024", "a", "and", "i"};
Entrada:
string text = "AI, ai and A.I. (2024)";
Salida esperada:
string[] expected = new string[] {"ai", "2024", "a", "and", "i"};
Explicación
Palabras: ai, ai, and, a, i, 2024. "ai" aparece dos veces; las demás una vez, ordenadas alfabéticamente con los dígitos antes que las letras: ["ai", "2024", "a", "and", "i"].
Referencias
Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.