@@ -3,20 +3,17 @@ package y2016
3
3
import scala .util .parsing .combinator .RegexParsers
4
4
5
5
trait Day21 {
6
+ def swap (arr : Array [Char ], i : Int , j : Int ): Unit =
7
+ val tmp = arr(i); arr(i) = arr(j); arr(j) = tmp
8
+
9
+ def reverse (arr : Array [Char ], start : Int , end : Int ): Unit =
10
+ for i <- start to start + end / 2 if i < (end - i + start) do swap(arr, i, end - i + start)
6
11
7
12
def rotate (arr : Array [Char ], k : Int ): Unit =
8
13
reverse(arr, 0 , k - 1 )
9
14
reverse(arr, k, arr.length - 1 )
10
15
reverse(arr, 0 , arr.length - 1 )
11
16
12
- def reverse (arr : Array [Char ], start : Int , end : Int ): Unit =
13
- for i <- start to start + end / 2 if i < (end - i + start) do swap(arr, i, end - i + start)
14
-
15
- def swap (arr : Array [Char ], i : Int , j : Int ): Unit =
16
- val tmp = arr(i)
17
- arr(i) = arr(j)
18
- arr(j) = tmp
19
-
20
17
object Parser extends RegexParsers {
21
18
def swapPos : Parser [Array [Char ] => Unit ] = (" swap position" ~> " \\ d+" .r) ~ (" with position" ~> " \\ d+" .r) ^^ {
22
19
case left ~ right => arr => swap(arr, left.toInt, right.toInt)
@@ -62,9 +59,11 @@ trait Day21 {
62
59
63
60
def solve1 (input : Seq [String ], letters : String ): String =
64
61
val array = letters.toCharArray
65
- input.foreach { line => Parser .parseAll(Parser .allParsers, line).get.apply (array) }
62
+ input.foreach { line => Parser .parseAll(Parser .allParsers, line).get(array) }
66
63
array.mkString
67
64
68
65
def solve2 (input : Seq [String ], letters : String ): String =
69
- " abcdefgh" .permutations.withFilter(perm => solve1(input, perm) == letters).next()
66
+ // not really *much* faster but a little
67
+ import collection .parallel .CollectionConverters .ImmutableSeqIsParallelizable
68
+ " abcdefgh" .permutations.toSeq.par.find(perm => solve1(input, perm) == letters).get
70
69
}
0 commit comments