Оглавление > Очки за имена
30.03.2023

Очки за имена

Используйте names.txt, текстовый файл размером 46 КБ, содержащий более пяти тысяч имен. Начните с сортировки в алфавитном порядке. Затем подсчитайте алфавитные значения каждого имени и умножьте это значение на порядковый номер имени в отсортированном списке для получения количества очков имени.

Например, если список отсортирован по алфавиту, имя COLIN (алфавитное значение которого 3 + 15 + 12 + 9 + 14 = 53) является 938-м в списке. Поэтому, имя COLIN получает 938 × 53 = 49714 очков.

Какова сумма очков имен в файле?

Решение (F#)

  1. cleanQuotes - функция очистки кавычек, т.к. все имена в файле в кавычках
  2. alphaValue - Алфавитное значение символа A=1 B=2 C=3 и т.д.
  3. namePoints - Алфавитное значение строки, вычисленное как сумма алфавитных значений каждого символа

Алгоритм:

  • читаем файл, делим по запятым - получаем массив строк
  • удаляем кавычки
  • сортируем
  • вычисляем очки для каждого имени как алфавитное значение умноженное на позицию
  • вычисляем сумму
  • выводим ответ
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; ...|]