Scala で Project Euler Problem 8
まづ、複数行文字列
scala> var str = """1234567890 | 1234567890 | 1234567890""" str: java.lang.String = 1234567890 1234567890 1234567890
1文字ずつ、取り出す
scala> str.foreach { c => | print(c.toChar) | } 1234567890 1234567890 1234567890 scala> for (i <- 1 to 10) { | print(i) | } 12345678910 scala> str.foreach { c => | println(c.toInt) | } 49 50 51 52 53 54 55 56 57 48 10 49 50 51 52 53 54 55 56 57 48 10 49 50 51 52 53 54 55 56 57 48 scala> str.foreach { c => | if (c.toChar != 10) print(c.toChar) | } 123456789012345678901234567890
5文字の積
scala> for (i <- 1 to 10) { | var n = str.charAt(i) * str.charAt(i + 1) | println(str.charAt(i) + " * " + str.charAt(i + 1) + " = " + n) | } 2 * 3 = 2550 3 * 4 = 2652 4 * 5 = 2756 5 * 6 = 2862 6 * 7 = 2970 7 * 8 = 3080 8 * 9 = 3192 9 * 0 = 2736 0 * = 480 * 1 = 490 scala> for (i <- 1 to 10) { | var n = str.charAt(i).toInt * str.charAt(i + 1).toInt | println(str.charAt(i) + " * " + str.charAt(i + 1) + " = " + n) | } 2 * 3 = 2550 3 * 4 = 2652 4 * 5 = 2756 5 * 6 = 2862 6 * 7 = 2970 7 * 8 = 3080 8 * 9 = 3192 9 * 0 = 2736 0 * = 480 * 1 = 490 scala> for (i <- 1 to 10) { | var n = (str.charAt(i) - 48) * (str.charAt(i + 1) - 48) | println(str.charAt(i) + " * " + str.charAt(i + 1) + " = " + n) | } 2 * 3 = 6 3 * 4 = 12 4 * 5 = 20 5 * 6 = 30 6 * 7 = 42 7 * 8 = 56 8 * 9 = 72 9 * 0 = 0 0 * = 0 * 1 = -38 scala> for (i <- 1 to 10) { | if (str.charAt(i) != 10) { | var n = (str.charAt(i) - 48) * (str.charAt(i + 1) - 48) | println(str.charAt(i) + " * " + str.charAt(i + 1) + " = " + n) | } | } 2 * 3 = 6 3 * 4 = 12 4 * 5 = 20 5 * 6 = 30 6 * 7 = 42 7 * 8 = 56 8 * 9 = 72 9 * 0 = 0 0 * = 0 scala> str.length res15: Int = 32 scala> str = str.replaceAll("\n", "") str: java.lang.String = 123456789012345678901234567890 scala> str.length res18: Int = 30 scala> for (i <- 1 to 10) { | var n = (str.charAt(i) - 48) * (str.charAt(i + 1) - 48) | println(str.charAt(i) + " * " + str.charAt(i + 1) + " = " + n) | } 2 * 3 = 6 3 * 4 = 12 4 * 5 = 20 5 * 6 = 30 6 * 7 = 42 7 * 8 = 56 8 * 9 = 72 9 * 0 = 0 0 * 1 = 0 1 * 2 = 2 scala> for (i <- 0 to str.length - 5) { | println(str.substring(i, i + 5) + " -> " + str.substring(i, i + 5).toArray.map(_ - 48).reduceLeft(_*_)) | } 12345 -> 120 23456 -> 720 34567 -> 2520 45678 -> 6720 56789 -> 15120 67890 -> 0 78901 -> 0 89012 -> 0 90123 -> 0 01234 -> 0 12345 -> 120 23456 -> 720 34567 -> 2520 45678 -> 6720 56789 -> 15120 67890 -> 0 78901 -> 0 89012 -> 0 90123 -> 0 01234 -> 0 12345 -> 120 23456 -> 720 34567 -> 2520 45678 -> 6720 56789 -> 15120 67890 -> 0 scala> val lst = for (i <- 0 to str.length - 5) yield { | str.substring(i, i + 5).toArray.map(_ - 48).reduceLeft(_*_) | } lst: scala.collection.immutable.IndexedSeq[Int] = Vector(120, 720, 2520, 6720, 15120, 0, 0, 0, 0, 0, 120, 720, 2520, 6720, 15120, 0, 0, 0, 0, 0, 120, 720, 2520, 6720, 15120, 0) scala> lst.max res30: Int = 15120
まとめ
scala> var str = """ | 73167176531330624919225119674426574742355349194934 | 96983520312774506326239578318016984801869478851843 | 85861560789112949495459501737958331952853208805511 | 12540698747158523863050715693290963295227443043557 | 66896648950445244523161731856403098711121722383113 | 62229893423380308135336276614282806444486645238749 | 30358907296290491560440772390713810515859307960866 | 70172427121883998797908792274921901699720888093776 | 65727333001053367881220235421809751254540594752243 | 52584907711670556013604839586446706324415722155397 | 53697817977846174064955149290862569321978468622482 | 83972241375657056057490261407972968652414535100474 | 82166370484403199890008895243450658541227588666881 | 16427171479924442928230863465674813919123162824586 | 17866458359124566529476545682848912883142607690042 | 24219022671055626321111109370544217506941658960408 | 07198403850962455444362981230987879927244284909188 | 84580156166097919133875499200524063689912560717606 | 05886116467109405077541002256983155200055935729725 | 71636269561882670428252483600823257530420752963450 | """ str: java.lang.String = " 73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511 12540698747158523863050715693290963295227443043557 66896648950445244523161731856403098711121722383113 62229893423380308135336276614282806444486645238749 30358907296290491560440772390713810515859307960866 70172427121883998797908792274921901699720888093776 65727333001053367881220235421809751254540594752243 52584907711670556013604839586446706324415722155397 53697817977846174064955149290862569321978468622482 83972241375657056057490261407972968652414535100474 82166370484403199890008895243450658541227588666881 16427171479924442928230863465674813919123162824586 17866458359124566529476545682848912883142607690042 24219... scala> str = str.replaceAll("\n", "") str: java.lang.String = 73167176531330624919225119674426574742355349194934969835203127745063262395783180169848018694788518438586156078911294949545950173795833195285320880551112540698747158523863050715693290963295227443043557668966489504452445231617318564030987111217223831136222989342338030813533627661428280644448664523874930358907296290491560440772390713810515859307960866701724271218839987979087922749219016997208880937766572733300105336788122023542180975125454059475224352584907711670556013604839586446706324415722155397536978179778461740649551492908625693219784686224828397224137565705605749026140797296865241453510047482166370484403199890008895243450658541227588666881164271714799244429282308634656748139191231628245861786645835912456652947654568284891288314260769004224219022671055626321111... scala> val lst = for (i <- 0 to str.length - 5) yield { | str.substring(i, i + 5).toArray.map(_ - 48).reduceLeft(_*_) | } lst: scala.collection.immutable.IndexedSeq[Int] = Vector(882, 126, 294, 1764, 1470, 630, 630, 270, 135, 0, 0, 0, 0, 0, 432, 648, 648, 324, 180, 180, 20, 90, 270, 378, 1512, 6048, 1344, 1344, 960, 1680, 1680, 5880, 3920, 1568, 672, 840, 600, 450, 900, 2700, 540, 972, 1296, 2916, 972, 3888, 3888, 5832, 5832, 15552, 11664, 6480, 2160, 0, 0, 0, 0, 0, 294, 392, 1960, 0, 0, 0, 0, 0, 432, 216, 648, 1620, 1890, 7560, 7560, 840, 1344, 0, 0, 0, 0, 0, 1728, 13824, 0, 0, 0, 0, 0, 1728, 12096, 12096, 16128, 8960, 2240, 2560, 1280, 480, 768, 3840, 3840, 5760, 1920, 1200, 1440, 0, 0, 0, 0, 0, 504, 144, 162, 72, 648, 2592, 11664, 6480, 6480, 3600, 8100, 4500, 0, 0, 0, 0, 0, 1323, 6615, 7560, 7560, 3240, 360, 648, 405, 270, 720, 3600, 1200, 480, 0, 0, 0, 0, 0, 0, 0, 0, 25, 10, 10, 40, 0, 0, 0, 0, 0, 120... scala> lst.max res31: Int = 40824