ONLY DO WHAT ONLY YOU CAN DO

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

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