Используйте names.txt, текстовый файл размером 46 КБ, содержащий более пяти тысяч имен. Начните с сортировки в алфавитном порядке. Затем подсчитайте алфавитные значения каждого имени и умножьте это значение на порядковый номер имени в отсортированном списке для получения количества очков имени.
Например, если список отсортирован по алфавиту, имя COLIN (алфавитное значение которого 3 + 15 + 12 + 9 + 14 = 53) является 938-м в списке. Поэтому, имя COLIN получает 938 × 53 = 49714 очков.
Какова сумма очков имен в файле?
Алгоритм:
let cleanQuotes (s: string) = s.Replace ("\"", "")
let alphaValue (c: char) = c - 'A' |> int |> (+) 1
let namePoints (s: string) = s.ToCharArray() |> Array.sumBy alphaValue
let answer =
(System.IO.File.ReadAllText "names.txt").Split ","
|> Array.map cleanQuotes
|> Array.sort
|> Array.mapi (fun i x -> namePoints x * (i+1))
|> Array.sum
printfn "the answer is %d" answer //the answer is 871198282
[|"AARON"; "ABBEY"; "ABBIE"; "ABBY"; "ABDUL"; "ABE"; "ABEL"; "ABIGAIL"; "ABRAHAM"; "ABRAM"; "ADA"; "ADAH"; "ADALBERTO"; "ADALINE"; "ADAM"; "ADAN"; "ADDIE"; "ADELA"; "ADELAIDA"; "ADELAIDE"; "ADELE"; "ADELIA"; "ADELINA"; "ADELINE"; "ADELL"; "ADELLA"; "ADELLE"; "ADENA"; "ADINA"; "ADOLFO"; "ADOLPH"; "ADRIA"; "ADRIAN"; "ADRIANA"; "ADRIANE"; "ADRIANNA"; "ADRIANNE"; "ADRIEN"; "ADRIENE"; "ADRIENNE"; "AFTON"; "AGATHA"; "AGNES"; "AGNUS"; "AGRIPINA"; "AGUEDA"; "AGUSTIN"; "AGUSTINA"; "AHMAD"; "AHMED"; "AI"; "AIDA"; "AIDE"; "AIKO"; "AILEEN"; "AILENE"; "AIMEE"; "AISHA"; "AJA"; "AKIKO"; "AKILAH"; "AL"; "ALAINA"; "ALAINE"; "ALAN"; "ALANA"; "ALANE"; "ALANNA"; "ALAYNA"; "ALBA"; "ALBERT"; "ALBERTA"; "ALBERTHA"; "ALBERTINA"; "ALBERTINE"; "ALBERTO"; "ALBINA"; "ALDA"; "ALDEN"; "ALDO"; "ALEASE"; "ALEC"; "ALECIA"; "ALEEN"; "ALEIDA"; "ALEISHA"; "ALEJANDRA"; "ALEJANDRINA"; "ALEJANDRO"; "ALENA"; "ALENE"; "ALESHA"; "ALESHIA"; "ALESIA"; "ALESSANDRA"; "ALETA"; "ALETHA"; "ALETHEA"; "ALETHIA"; "ALEX"; ...|]
[|49; 70; 57; 120; 200; 48; 140; 328; 396; 350; 66; 168; 1014; 644; 285; 320; 391; 414; 703; 820; 567; 704; 1058; 1200; 850; 910; 1053; 700; 841; 1590; 1736; 1056; 1551; 1632; 1820; 2232; 2442; 1938; 2184; 2800; 2296; 1596; 1978; 2728; 3375; 1794; 4277; 4416; 1323; 1550; 510; 780; 1007; 1944; 2530; 2576; 1881; 2204; 708; 2820; 2562; 806; 2394; 2688; 1820; 1914; 2211; 2924; 3726; 1120; 4118; 4248; 4891; 6068; 6450; 5548; 3003; 1404; 2844; 2560; 3483; 1722; 2573; 3108; 2720; 4730; 5742; 7832; 7120; 2970; 3367; 4232; 5115; 4418; 8930; 3744; 4559; 5096; 5544; 4200; ...|]