ONLY DO WHAT ONLY YOU CAN DO

こけたら立ちなはれ 立ったら歩きなはれ

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