F# で Project Euler Problem 22
まづは、ファイルの読み込み
> let lines = System.IO.File.ReadAllLines @"D:\Euler\022\names.txt" - ;; val lines : string [] = [|""MARY","PATRICIA","LINDA","BARBARA","ELIZABETH","JENNIFER","M"+[46386 chars]|]
> let name_list = lines |> Array.map(fun s -> s.Replace("\"","").Split(',') |> Array.toList) |> Array.toList |> List.collect id - ;; val name_list : string list = ["MARY"; "PATRICIA"; "LINDA"; "BARBARA"; "ELIZABETH"; "JENNIFER"; "MARIA"; "SUSAN"; "MARGARET"; "DOROTHY"; "LISA"; "NANCY"; "KAREN"; "BETTY"; "HELEN"; "SANDRA"; "DONNA"; "CAROL"; "RUTH"; "SHARON"; "MICHELLE"; "LAURA"; "SARAH"; "KIMBERLY"; "DEBORAH"; "JESSICA"; "SHIRLEY"; "CYNTHIA"; "ANGELA"; "MELISSA"; "BRENDA"; "AMY"; "ANNA"; "REBECCA"; "VIRGINIA"; "KATHLEEN"; "PAMELA"; "MARTHA"; "DEBRA"; "AMANDA"; "STEPHANIE"; "CAROLYN"; "CHRISTINE"; "MARIE"; "JANET"; "CATHERINE"; "FRANCES"; "ANN"; "JOYCE"; "DIANE"; "ALICE"; "JULIE"; "HEATHER"; "TERESA"; "DORIS"; "GLORIA"; "EVELYN"; "JEAN"; "CHERYL"; "MILDRED"; "KATHERINE"; "JOAN"; "ASHLEY"; "JUDITH"; "ROSE"; "JANICE"; "KELLY"; "NICOLE"; "JUDY"; "CHRISTINA"; "KATHY"; "THERESA"; "BEVERLY"; "DENISE"; "TAMMY"; "IRENE"; "JANE"; "LORI"; "RACHEL"; "MARILYN"; "ANDREA"; "KATHRYN"; "LOUISE"; "SARA"; "ANNE"; "JACQUELINE"; "WANDA"; "BONNIE"; "JULIA"; "RUBY"; "LOIS"; "TINA"; "PHYLLIS"; "NORMA"; "PAULA"; "DIANA"; "ANNIE"; "LILLIAN"; "EMILY"; "ROBIN"; ...]
ソートして、名前と リスト中の出現順との 組を作る
> let name_index = List.zip (List.sort name_list) [1.. List.length name_list] - ;; val name_index : (string * int) list = [("AARON", 1); ("ABBEY", 2); ("ABBIE", 3); ("ABBY", 4); ("ABDUL", 5); ("ABE", 6); ("ABEL", 7); ("ABIGAIL", 8); ("ABRAHAM", 9); ("ABRAM", 10); ("ADA", 11); ("ADAH", 12); ("ADALBERTO", 13); ("ADALINE", 14); ("ADAM", 15); ("ADAN", 16); ("ADDIE", 17); ("ADELA", 18); ("ADELAIDA", 19); ("ADELAIDE", 20); ("ADELE", 21); ("ADELIA", 22); ("ADELINA", 23); ("ADELINE", 24); ("ADELL", 25); ("ADELLA", 26); ("ADELLE", 27); ("ADENA", 28); ("ADINA", 29); ("ADOLFO", 30); ("ADOLPH", 31); ("ADRIA", 32); ("ADRIAN", 33); ("ADRIANA", 34); ("ADRIANE", 35); ("ADRIANNA", 36); ("ADRIANNE", 37); ("ADRIEN", 38); ("ADRIENE", 39); ("ADRIENNE", 40); ("AFTON", 41); ("AGATHA", 42); ("AGNES", 43); ("AGNUS", 44); ("AGRIPINA", 45); ("AGUEDA", 46); ("AGUSTIN", 47); ("AGUSTINA", 48); ("AHMAD", 49); ("AHMED", 50); ("AI", 51); ("AIDA", 52); ("AIDE", 53); ("AIKO", 54); ("AILEEN", 55); ("AILENE", 56); ("AIMEE", 57); ("AISHA", 58); ("AJA", 59); ("AKIKO", 60); ("AKILAH", 61); ("AL", 62); ("ALAINA", 63); ("ALAINE", 64); ("ALAN", 65); ("ALANA", 66); ("ALANE", 67); ("ALANNA", 68); ("ALAYNA", 69); ("ALBA", 70); ("ALBERT", 71); ("ALBERTA", 72); ("ALBERTHA", 73); ("ALBERTINA", 74); ("ALBERTINE", 75); ("ALBERTO", 76); ("ALBINA", 77); ("ALDA", 78); ("ALDEN", 79); ("ALDO", 80); ("ALEASE", 81); ("ALEC", 82); ("ALECIA", 83); ("ALEEN", 84); ("ALEIDA", 85); ("ALEISHA", 86); ("ALEJANDRA", 87); ("ALEJANDRINA", 88); ("ALEJANDRO", 89); ("ALENA", 90); ("ALENE", 91); ("ALESHA", 92); ("ALESHIA", 93); ("ALESIA", 94); ("ALESSANDRA", 95); ("ALETA", 96); ("ALETHA", 97); ("ALETHEA", 98); ("ALETHIA", 99); ("ALEX", 100); ...]
組を取得
> name_index.[0] - ;; val it : string * int = ("AARON", 1)
名前のスコアを計算
> "ABC".ToCharArray();; val it : char [] = [|'A'; 'B'; 'C'|] > "ABC".ToCharArray() |> Array.map(int);; val it : int [] = [|65; 66; 67|] > "ABC".ToCharArray() |> Array.map(fun n -> (int n) - 64);; val it : int [] = [|1; 2; 3|] > "ABC".ToCharArray() |> Array.toList |> List.map(fun n -> (int n) - 64) |> List.sum;; val it : int = 6
名前のスコアを集計
> name_index |> List.map(fun (x, y) -> x.ToCharArray() |> Array.toList |> List.map(fun n -> (int n) - 64) |> List.sum);; val it : int list = [49; 35; 19; 30; 40; 8; 20; 41; 44; 35; 6; 14; 78; 46; 19; 20; 23; 23; 37; 41; 27; 32; 46; 50; 34; 35; 39; 25; 29; 53; 56; 33; 47; 48; 52; 62; 66; 51; 56; 70; 56; 38; 46; 62; 75; 39; 91; 92; 27; 31; 10; 15; 19; 36; 46; 46; 33; 38; 12; 47; 42; 13; 38; 42; 28; 29; 33; 43; 54; 16; 58; 59; 67; 82; 86; 73; 39; 18; 36; 32; 43; 21; 31; 37; 32; 55; 66; 89; 80; 33; 37; 46; 55; 47; 94; 39; 47; 52; 56; 42; ...] > name_index - |> List.map(fun (x, y) -> - (x.ToCharArray() - |> Array.toList - |> List.map(fun n -> - (int n) - 64) - |> List.sum) * y) - |> List.sum - ;; val it : int = 871198282