anagram_finder.cs en C#
Agrupa las palabras por sus letras ordenadas y los anagramas se encuentran solos.
// anagram_finder: agrupa palabras por letras ordenadas e imprime familias
var words = new[]
{
"listen", "silent", "enlist", "google", "banana",
"stressed", "desserts", "elbow", "below", "state", "taste",
};
var families = words
.GroupBy(w => string.Concat(w.OrderBy(c => c)))
.Where(g => g.Count() > 1)
.OrderByDescending(g => g.Count())
.ThenBy(g => g.Key)
.ToList();
Console.WriteLine($"{words.Length} words in");
foreach (var family in families)
{
Console.WriteLine($" {string.Join(" = ", family)}");
}
var covered = families.Sum(f => f.Count());
Console.WriteLine($"{covered} words share their letters with another");
Cómo funciona
string.Concat(w.OrderBy(c => c))es la clave en forma canónica.- Los grupos de más de uno son familias de anagramas.
- Ordenar por tamaño y luego por clave vuelve estable la salida.
Palabras clave y builtins usados aquí
foreachinnewstringvar
El intento, en números
- Líneas
- 22
- Caracteres a escribir
- 626
- Tokens
- 141
- Ritmo de tres estrellas
- 90 tpm
Al ritmo de tres estrellas de 90 tokens por minuto, este intento toma unos 94 segundos.
Paso 2 de 2 en Bis; paso 17 de 17 en LINQ a fondo.