ONLY DO WHAT ONLY YOU CAN DO

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

Scala で Project Euler Problem 17

scala> val map = collection.mutable.Map[Int, String] ()
map: scala.collection.mutable.Map[Int,String] = Map()

scala>

scala> map += 1     -> "one"
res0: map.type = Map(1 -> one)

scala> map += 2     -> "two"
res1: map.type = Map(1 -> one, 2 -> two)

scala> map += 3     -> "three"
res2: map.type = Map(3 -> three, 1 -> one, 2 -> two)

scala> map += 4     -> "four"
res3: map.type = Map(3 -> three, 4 -> four, 1 -> one, 2 -> two)

scala> map += 5     -> "five"
res4: map.type = Map(5 -> five, 3 -> three, 4 -> four, 1 -> one, 2 -> two)

scala> map += 6     -> "six"
res5: map.type = Map(5 -> five, 3 -> three, 4 -> four, 1 -> one, 6 -> six, 2 -> two)

scala> map += 7     -> "seven"
res6: map.type = Map(5 -> five, 7 -> seven, 3 -> three, 4 -> four, 1 -> one, 6 -> six, 2 -> two)

scala> map += 8     -> "eight"
res7: map.type = Map(5 -> five, 8 -> eight, 7 -> seven, 3 -> three, 4 -> four, 1 -> one, 6 -> six, 2 -> two)

scala> map += 9     -> "nine"
res8: map.type = Map(5 -> five, 8 -> eight, 7 -> seven, 3 -> three, 4 -> four, 1 -> one, 6 -> six, 2 -> two, 9 -> nine)

scala> map += 10    -> "ten"
res9: map.type = Map(10 -> ten, 5 -> five, 8 -> eight, 7 -> seven, 3 -> three, 4 -> four, 1 -> one, 6 -> six, 2 -> two, 9 -> nine)

scala> map += 11    -> "eleven"
res10: map.type = Map(11 -> eleven, 10 -> ten, 5 -> five, 8 -> eight, 7 -> seven, 3 -> three, 4 -> four, 1 -> one, 6 -> six, 2 -> two, 9 -> nine)

scala> map += 12    -> "twelve"
res11: map.type = Map(11 -> eleven, 10 -> ten, 5 -> five, 12 -> twelve, 8 -> eight, 7 -> seven, 3 -> three, 4 -> four, 1 -> one, 6 -> six, 2 -> two, 9 -> nine)

scala> map += 13    -> "thirteen"
res12: map.type = Map(5 -> five, 10 -> ten, 11 -> eleven, 3 -> three, 7 -> seven, 8 -> eight, 12 -> twelve, 4 -> four, 1 -> one, 13 -> thirteen, 6 -> six, 2 -> two, 9 -> nine)

scala> map += 14    -> "fourteen"
res13: map.type = Map(5 -> five, 10 -> ten, 11 -> eleven, 3 -> three, 7 -> seven, 8 -> eight, 12 -> twelve, 4 -> four, 1 -> one, 13 -> thirteen, 6 -> six, 2 -> two, 14 -> fourteen, 9 -> nine)

scala> map += 15    -> "fifteen"
res14: map.type = Map(15 -> fifteen, 5 -> five, 10 -> ten, 11 -> eleven, 3 -> three, 7 -> seven, 8 -> eight, 12 -> twelve, 4 -> four, 1 -> one, 13 -> thirteen, 6 -> six, 2 -> two, 14 -> fourteen, 9 -> nine)

scala> map += 16    -> "sixteen"
res15: map.type = Map(16 -> sixteen, 15 -> fifteen, 5 -> five, 10 -> ten, 11 -> eleven, 3 -> three, 7 -> seven, 8 -> eight, 12 -> twelve, 4 -> four, 1 -> one, 13 -> thirteen, 6 -> six, 2 -> two, 14 -> fourteen, 9 -> nine)

scala> map += 17    -> "seventeen"
res16: map.type = Map(16 -> sixteen, 15 -> fifteen, 5 -> five, 10 -> ten, 11 -> eleven, 3 -> three, 7 -> seven, 8 -> eight, 17 -> seventeen, 12 -> twelve, 4 -> four, 1 -> one, 13 -> thirteen, 6 -> six, 2 -> two, 14 -> fourteen, 9 -> nine)

scala> map += 18    -> "eighteen"
res17: map.type = Map(16 -> sixteen, 15 -> fifteen, 5 -> five, 10 -> ten, 11 -> eleven, 3 -> three, 7 -> seven, 8 -> eight, 17 -> seventeen, 12 -> twelve, 4 -> four, 1 -> one, 13 -> thirteen, 6 -> six, 2 -> two, 14 -> fourteen, 18 -> eighteen, 9 -> nine)

scala> map += 19    -> "nineteen"
res18: map.type = Map(16 -> sixteen, 15 -> fifteen, 5 -> five, 10 -> ten, 11 -> eleven, 3 -> three, 7 -> seven, 8 -> eight, 17 -> seventeen, 12 -> twelve, 4 -> four, 1 -> one, 13 -> thirteen, 6 -> six, 2 -> two, 19 -> nineteen, 14 -> fourteen, 18 -> eighteen, 9 -> nine)

scala> map += 20    -> "twenty"
res19: map.type = Map(16 -> sixteen, 15 -> fifteen, 5 -> five, 10 -> ten, 11 -> eleven, 3 -> three, 7 -> seven, 8 -> eight, 17 -> seventeen, 12 -> twelve, 4 -> four, 1 -> one, 13 -> thirteen, 6 -> six, 20 -> twenty, 2 -> two, 19 -> nineteen, 14 -> fourteen, 18 -> eighteen, 9 -> nine)

scala> map += 30    -> "thirty"
res20: map.type = Map(16 -> sixteen, 15 -> fifteen, 5 -> five, 10 -> ten, 11 -> eleven, 3 -> three, 7 -> seven, 8 -> eight, 17 -> seventeen, 12 -> twelve, 4 -> four, 1 -> one, 13 -> thirteen, 6 -> six, 30 -> thirty, 20 -> twenty, 2 -> two, 19 -> nineteen, 14 -> fourteen, 18 -> eighteen, 9 -> nine)

scala> map += 40    -> "forty"
res21: map.type = Map(16 -> sixteen, 15 -> fifteen, 5 -> five, 10 -> ten, 11 -> eleven, 40 -> forty, 3 -> three, 7 -> seven, 8 -> eight, 17 -> seventeen, 12 -> twelve, 4 -> four, 1 -> one, 13 -> thirteen, 6 -> six, 30 -> thirty, 20 -> twenty, 2 -> two, 19 -> nineteen, 14 -> fourteen, 18 -> eighteen, 9 -> nine)

scala> map += 50    -> "fifty"
res22: map.type = Map(16 -> sixteen, 15 -> fifteen, 5 -> five, 10 -> ten, 11 -> eleven, 40 -> forty, 3 -> three, 7 -> seven, 8 -> eight, 17 -> seventeen, 12 -> twelve, 4 -> four, 1 -> one, 13 -> thirteen, 6 -> six, 30 -> thirty, 20 -> twenty, 2 -> two, 50 -> fifty, 19 -> nineteen, 14 -> fourteen, 18 -> eighteen, 9 -> nine)

scala> map += 60    -> "sixty"
res23: map.type = Map(60 -> sixty, 16 -> sixteen, 15 -> fifteen, 5 -> five, 10 -> ten, 11 -> eleven, 40 -> forty, 3 -> three, 7 -> seven, 8 -> eight, 17 -> seventeen, 12 -> twelve, 4 -> four, 1 -> one, 13 -> thirteen, 6 -> six, 30 -> thirty, 20 -> twenty, 2 -> two, 50 -> fifty, 19 -> nineteen, 14 -> fourteen, 18 -> eighteen, 9 -> nine)

scala> map += 70    -> "seventy"
res24: map.type = Map(10 -> ten, 5 -> five, 15 -> fifteen, 60 -> sixty, 11 -> eleven, 16 -> sixteen, 8 -> eight, 3 -> three, 40 -> forty, 7 -> seven, 12 -> twelve, 17 -> seventeen, 4 -> four, 13 -> thirteen, 1 -> one, 70 -> seventy, 6 -> six, 20 -> twenty, 30 -> thirty, 2 -> two, 50 -> fifty, 14 -> fourteen, 19 -> nineteen, 9 -> nine, 18 -> eighteen)

scala> map += 80    -> "eighty"
res25: map.type = Map(10 -> ten, 5 -> five, 15 -> fifteen, 60 -> sixty, 11 -> eleven, 16 -> sixteen, 8 -> eight, 3 -> three, 40 -> forty, 7 -> seven, 12 -> twelve, 17 -> seventeen, 4 -> four, 13 -> thirteen, 1 -> one, 70 -> seventy, 80 -> eighty, 6 -> six, 20 -> twenty, 30 -> thirty, 2 -> two, 50 -> fifty, 14 -> fourteen, 19 -> nineteen, 9 -> nine, 18 -> eighteen)

scala> map += 90    -> "ninety"
res26: map.type = Map(10 -> ten, 5 -> five, 15 -> fifteen, 60 -> sixty, 90 -> ninety, 11 -> eleven, 16 -> sixteen, 8 -> eight, 3 -> three, 40 -> forty, 7 -> seven, 12 -> twelve, 17 -> seventeen, 4 -> four, 13 -> thirteen, 1 -> one, 70 -> seventy, 80 -> eighty, 6 -> six, 20 -> twenty, 30 -> thirty, 2 -> two, 50 -> fifty, 14 -> fourteen, 19 -> nineteen, 9 -> nine, 18 -> eighteen)

scala> map += 1000  -> "one thousand"
res27: map.type = Map(10 -> ten, 5 -> five, 15 -> fifteen, 60 -> sixty, 90 -> ninety, 11 -> eleven, 16 -> sixteen, 8 -> eight, 3 -> three, 40 -> forty, 7 -> seven, 12 -> twelve, 17 -> seventeen, 4 -> four, 13 -> thirteen, 1 -> one, 70 -> seventy, 80 -> eighty, 6 -> six, 20 -> twenty, 30 -> thirty, 2 -> two, 50 -> fifty, 14 -> fourteen, 19 -> nineteen, 1000 -> one thousand, 9 -> nine, 18 -> eighteen)
scala> def numeral_string (n:Int):String = {
     |     if (map.contains(n)) {
     |         map(n)
     |     } else {
     |         var s = ""
     |
     |         // 100の位
     |         val n1 =  n / 100
     |         if (n1 != 0) s = map(n1) + " hundred"
     |
     |         // 10の位 + 1の位
     |         val n2 = n % 100
     |         if ((n1 != 0 ) && (n2 != 0)) s += " and "
     |
     |         if ((0 < n2) && (n2 <= 20)) {
     |             s += map(n2)
     |         } else {
     |             // 10の位
     |             val n3 = n2 / 10
     |             if (2 <= n3) s += map(n3 * 10)
     |
     |             // 1の位
     |             val n4 = (n2 % 10)
     |             if (0 < n4) s += "-" + map(n4)
     |         }
     |         s
     |     }
     | }
numeral_string: (n: Int)String
scala> (1 to 5).map(numeral_string)
res28: scala.collection.immutable.IndexedSeq[String] = Vector(one, two, three, four, five)
scala> (1 to 5).
     | map(numeral_string)
res29: scala.collection.immutable.IndexedSeq[String] = Vector(one, two, three, four, five)

scala> .map(_.replace(" ",""))
res30: scala.collection.immutable.IndexedSeq[java.lang.String] = Vector(one, two, three, four, five)

scala> .map(_.replace("-",""))
res31: scala.collection.immutable.IndexedSeq[java.lang.String] = Vector(one, two, three, four, five)
scala> (1 to 5).
     | map(numeral_string)
res32: scala.collection.immutable.IndexedSeq[String] = Vector(one, two, three, four, five)

scala> .map(_.replace(" ",""))
res33: scala.collection.immutable.IndexedSeq[java.lang.String] = Vector(one, two, three, four, five)

scala> .map(_.replace("-",""))
res34: scala.collection.immutable.IndexedSeq[java.lang.String] = Vector(one, two, three, four, five)

scala> .map(_.length)
res35: scala.collection.immutable.IndexedSeq[Int] = Vector(3, 3, 5, 4, 4)
scala> (1 to 5).
     | map(numeral_string)
res36: scala.collection.immutable.IndexedSeq[String] = Vector(one, two, three, four, five)

scala> .map(_.replace(" ",""))
res37: scala.collection.immutable.IndexedSeq[java.lang.String] = Vector(one, two, three, four, five)

scala> .map(_.replace("-",""))
res38: scala.collection.immutable.IndexedSeq[java.lang.String] = Vector(one, two, three, four, five)

scala> .map(_.length)
res39: scala.collection.immutable.IndexedSeq[Int] = Vector(3, 3, 5, 4, 4)

scala> .sum
res40: Int = 19
scala> (1 to 1000).
     | map(numeral_string)
res41: scala.collection.immutable.IndexedSeq[String] = Vector(one, two, three, four, five, six, seven, eight, nine, ten, eleven, twelve, thirteen, fourteen, fifteen, sixteen, seventeen, eighteen, nineteen, twenty, twenty-one, twenty-two, twenty-three, twenty-four, twenty-five, twenty-six, twenty-seven, twenty-eight, twenty-nine, thirty, thirty-one, thirty-two, thirty-three, thirty-four, thirty-five, thirty-six, thirty-seven, thirty-eight, thirty-nine, forty, forty-one, forty-two, forty-three, forty-four, forty-five, forty-six, forty-seven, forty-eight, forty-nine, fifty, fifty-one, fifty-two, fifty-three, fifty-four, fifty-five, fifty-six, fifty-seven, fifty-eight, fifty-nine, sixty, sixty-one, sixty-two, sixty-three, sixty-four, sixty-five, sixty-six, sixty-seven, sixty-eight, sixty-ni...
scala> .map(_.replace(" ",""))
res42: scala.collection.immutable.IndexedSeq[java.lang.String] = Vector(one, two, three, four, five, six, seven, eight, nine, ten, eleven, twelve, thirteen, fourteen, fifteen, sixteen, seventeen, eighteen, nineteen, twenty, twenty-one, twenty-two, twenty-three, twenty-four, twenty-five, twenty-six, twenty-seven, twenty-eight, twenty-nine, thirty, thirty-one, thirty-two, thirty-three, thirty-four, thirty-five, thirty-six, thirty-seven, thirty-eight, thirty-nine, forty, forty-one, forty-two, forty-three, forty-four, forty-five, forty-six, forty-seven, forty-eight, forty-nine, fifty, fifty-one, fifty-two, fifty-three, fifty-four, fifty-five, fifty-six, fifty-seven, fifty-eight, fifty-nine, sixty, sixty-one, sixty-two, sixty-three, sixty-four, sixty-five, sixty-six, sixty-seven, sixty-eight...
scala> .map(_.replace("-",""))
res43: scala.collection.immutable.IndexedSeq[java.lang.String] = Vector(one, two, three, four, five, six, seven, eight, nine, ten, eleven, twelve, thirteen, fourteen, fifteen, sixteen, seventeen, eighteen, nineteen, twenty, twentyone, twentytwo, twentythree, twentyfour, twentyfive, twentysix, twentyseven, twentyeight, twentynine, thirty, thirtyone, thirtytwo, thirtythree, thirtyfour, thirtyfive, thirtysix, thirtyseven, thirtyeight, thirtynine, forty, fortyone, fortytwo, fortythree, fortyfour, fortyfive, fortysix, fortyseven, fortyeight, fortynine, fifty, fiftyone, fiftytwo, fiftythree, fiftyfour, fiftyfive, fiftysix, fiftyseven, fiftyeight, fiftynine, sixty, sixtyone, sixtytwo, sixtythree, sixtyfour, sixtyfive, sixtysix, sixtyseven, sixtyeight, sixtynine, seventy, seventyone, seventytwo...
scala> .map(_.length)
res44: scala.collection.immutable.IndexedSeq[Int] = Vector(3, 3, 5, 4, 4, 3, 5, 5, 4, 3, 6, 6, 8, 8, 7, 7, 9, 8, 8, 6, 9, 9, 11, 10, 10, 9, 11, 11, 10, 6, 9, 9, 11, 10, 10, 9, 11, 11, 10, 5, 8, 8, 10, 9, 9, 8, 10, 10, 9, 5, 8, 8, 10, 9, 9, 8, 10, 10, 9, 5, 8, 8, 10, 9, 9, 8, 10, 10, 9, 7, 10, 10, 12, 11, 11, 10, 12, 12, 11, 6, 9, 9, 11, 10, 10, 9, 11, 11, 10, 6, 9, 9, 11, 10, 10, 9, 11, 11, 10, 10, 16, 16, 18, 17, 17, 16, 18, 18, 17, 16, 19, 19, 21, 21, 20, 20, 22, 21, 21, 19, 22, 22, 24, 23, 23, 22, 24, 24, 23, 19, 22, 22, 24, 23, 23, 22, 24, 24, 23, 18, 21, 21, 23, 22, 22, 21, 23, 23, 22, 18, 21, 21, 23, 22, 22, 21, 23, 23, 22, 18, 21, 21, 23, 22, 22, 21, 23, 23, 22, 20, 23, 23, 25, 24, 24, 23, 25, 25, 24, 19, 22, 22, 24, 23, 23, 22, 24, 24, 23, 19, 22, 22, 24, 23, 23, 22, 24, 24, 23,...
scala> .sum
res45: Int = 21124