ONLY DO WHAT ONLY YOU CAN DO

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

Scala で Project Euler Problem 22

まづは、ファイルの読み込み

scala> var source = scala.io.Source.fromFile("D:\\Euler\\022\\names.txt")
source: scala.io.BufferedSource = non-empty iterator

scala> val name_list = source.getLines.toList.flatMap(_.replaceAll("\"", "").split(','))
name_list: 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, LI...
scala> source.close

ソート

scala> name_list.sorted
res1: List[String] = List(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, ALE...

名前と リスト中の出現順との 組を作る

scala> name_list.sorted.zipWithIndex
res2: List[(String, Int)] = List((AARON,0), (ABBEY,1), (ABBIE,2), (ABBY,3), (ABDUL,4), (ABE,5), (ABEL,6), (ABIGAIL,7), (ABRAHAM,8), (ABRAM,9), (ADA,10), (ADAH,11), (ADALBERTO,12), (ADALINE,13), (ADAM,14), (ADAN,15), (ADDIE,16), (ADELA,17), (ADELAIDA,18), (ADELAIDE,19), (ADELE,20), (ADELIA,21), (ADELINA,22), (ADELINE,23), (ADELL,24), (ADELLA,25), (ADELLE,26), (ADENA,27), (ADINA,28), (ADOLFO,29), (ADOLPH,30), (ADRIA,31), (ADRIAN,32), (ADRIANA,33), (ADRIANE,34), (ADRIANNA,35), (ADRIANNE,36), (ADRIEN,37), (ADRIENE,38), (ADRIENNE,39), (AFTON,40), (AGATHA,41), (AGNES,42), (AGNUS,43), (AGRIPINA,44), (AGUEDA,45), (AGUSTIN,46), (AGUSTINA,47), (AHMAD,48), (AHMED,49), (AI,50), (AIDA,51), (AIDE,52), (AIKO,53), (AILEEN,54), (AILENE,55), (AIMEE,56), (AISHA,57), (AJA,58), (AKIKO,59), (AKILAH,60), (AL,...

組を取得

scala> name_list.sorted.zipWithIndex(0)
<console>:10: error: type mismatch;
 found   : Int(0)
 required: scala.collection.generic.CanBuildFrom[List[String],(?, Int),?]
              name_list.sorted.zipWithIndex(0)
                                            ^

scala> val name_index = name_list.sorted.zipWithIndex
name_index: List[(String, Int)] = List((AARON,0), (ABBEY,1), (ABBIE,2), (ABBY,3), (ABDUL,4), (ABE,5), (ABEL,6), (ABIGAIL,7), (ABRAHAM,8), (ABRAM,9), (ADA,10), (ADAH,11), (ADALBERTO,12), (ADALINE,13), (ADAM,14), (ADAN,15), (ADDIE,16), (ADELA,17), (ADELAIDA,18), (ADELAIDE,19), (ADELE,20), (ADELIA,21), (ADELINA,22), (ADELINE,23), (ADELL,24), (ADELLA,25), (ADELLE,26), (ADENA,27), (ADINA,28), (ADOLFO,29), (ADOLPH,30), (ADRIA,31), (ADRIAN,32), (ADRIANA,33), (ADRIANE,34), (ADRIANNA,35), (ADRIANNE,36), (ADRIEN,37), (ADRIENE,38), (ADRIENNE,39), (AFTON,40), (AGATHA,41), (AGNES,42), (AGNUS,43), (AGRIPINA,44), (AGUEDA,45), (AGUSTIN,46), (AGUSTINA,47), (AHMAD,48), (AHMED,49), (AI,50), (AIDA,51), (AIDE,52), (AIKO,53), (AILEEN,54), (AILENE,55), (AIMEE,56), (AISHA,57), (AJA,58), (AKIKO,59), (AKILAH,60)...
scala> name_index(0)
res4: (String, Int) = (AARON,0)

名前のスコアを計算

scala> "ABC".toCharArray.map(_.toInt)
res5: Array[Int] = Array(65, 66, 67)

scala> "ABC".toCharArray.map(_.toInt - 64).toList.sum
res6: Int = 6

scala> val t = name_index(937)
t: (String, Int) = (COLIN,937)

scala> t._1.toCharArray.map(_.toInt - 64).toList.sum * (t._2 + 1)
res7: Int = 49714

名前のスコアを集計

scala> name_index.map(t => t match {case (x,y) => x.toCharArray.map(_.toInt - 64).toList.sum * (y + 1)})
res8: List[Int] = List(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, 4343, 8568, 8240, 9256, 5460, 7420, 8774, 9612, 5014, 5170, 6216, 6832, 2486, 2622, 2990, 3480, 4095, 3186, 4403, 4920, 5082, 5612, 6150, 7316, 6375, 8820, 7747, 5504, 5934, 6370, 3406, 5280, 6517, 7504, 5940...
scala> name_index.map(t => t match {case (x,y) => x.toCharArray.map(_.toInt - 64).toList.sum * (y + 1)}).sum
res9: Int = 871198282