| 414 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |      1 | // 2 x 2 x 2 Rubik's Cube
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |      2 | //========================
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |      3 | 
 | 
| 461 |      4 | // !! UPDATE for Scala 3
 | 
|  |      5 | // !! 
 | 
|  |      6 | // !! Scala 3 allocates much more memory to 
 | 
|  |      7 | // !! the JVM such that the memory issues from
 | 
|  |      8 | // !! Scala 2 and the video do not arise. 
 | 
|  |      9 | 
 | 
|  |     10 | 
 | 
|  |     11 | 
 | 
| 460 |     12 | // for more memory for the JVM, call
 | 
| 414 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     13 | //
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     14 | // JAVA_OPTS="-Xmx2g" scala
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     15 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     16 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     17 | // for measuring memory usage
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     18 | val mb = 1024*1024
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     19 | val runtime = Runtime.getRuntime
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     20 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     21 | def memory() = {
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     22 |   println(s"  ** Used Memory:  ${(runtime.totalMemory - runtime.freeMemory) / mb}")
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     23 |   println(s"  ** Free Memory:  ${runtime.freeMemory / mb}")
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     24 |   println(s"  ** Total Memory: ${runtime.totalMemory / mb}")
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     25 |   println(s"  ** Max Memory:   ${runtime.maxMemory / mb}")
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     26 | }
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     27 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     28 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     29 | abstract class Colour
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     30 | case object White extends Colour
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     31 | case object Yellow extends Colour
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     32 | case object Orange extends Colour
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     33 | case object Red extends Colour
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     34 | case object Green extends Colour
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     35 | case object Blue extends Colour
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     36 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     37 | // Faces
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     38 | //    -------
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     39 | //   |c11 c12|
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     40 | //   |c21 c22|
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     41 | //    -------  
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     42 | case class Face(c11: Colour, c12: Colour,
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     43 |                 c21: Colour, c22: Colour)
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     44 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     45 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     46 | // Cubes
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     47 | //     +--+
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     48 | //     |f2|
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     49 | //  +--+  +--+
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     50 | //  |f5 f1 f6|
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     51 | //  +--+  +--+
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     52 | //     |f3|
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     53 | //     |f4|
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     54 | //     +--+ 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     55 | case class Cube(f1: Face, f2: Face, f3: Face,
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     56 |                 f4: Face, f5: Face, f6: Face)
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     57 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     58 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     59 | // starting cube
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     60 | val init = 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     61 |     Cube(Face(White, Green, White, White), 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     62 |          Face(Blue, Yellow, Orange, Red), 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     63 |          Face(Red, Blue, Red, Blue),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     64 |          Face(White, Yellow, Red, Orange),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     65 |          Face(Yellow, Green, Blue, Green),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     66 |          Face(Yellow, Green, Orange, Orange))
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     67 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     68 | // solved cube
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     69 | val solved = 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     70 |     Cube(Face(Yellow, Yellow, Yellow, Yellow), 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     71 |          Face(Orange, Orange, Orange, Orange), 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     72 |          Face(Red, Red, Red, Red),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     73 |          Face(White, White, White, White),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     74 |          Face(Blue, Blue, Blue, Blue),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     75 |          Face(Green, Green, Green, Green))  
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     76 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     77 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     78 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     79 | // actions
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     80 | def up(c: Cube) : Cube =
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     81 |     Cube(Face(c.f1.c11, c.f3.c12, c.f1.c21, c.f3.c22),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     82 |          Face(c.f2.c11, c.f1.c12, c.f2.c21, c.f1.c22),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     83 |          Face(c.f3.c11, c.f4.c12, c.f3.c21, c.f4.c22),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     84 |          Face(c.f4.c11, c.f2.c12, c.f4.c21, c.f2.c22),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     85 |          Face(c.f5.c11, c.f5.c12, c.f5.c21, c.f5.c22),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     86 |          Face(c.f6.c21, c.f6.c11, c.f6.c22, c.f6.c12))
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     87 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     88 | def clock(c: Cube) : Cube =
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     89 |     Cube(Face(c.f1.c21, c.f1.c11, c.f1.c22, c.f1.c12),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     90 |          Face(c.f2.c11, c.f2.c12, c.f5.c22, c.f5.c12),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     91 |          Face(c.f6.c21, c.f6.c11, c.f3.c21, c.f3.c22),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     92 |          Face(c.f4.c11, c.f4.c12, c.f4.c21, c.f4.c22),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     93 |          Face(c.f5.c11, c.f3.c11, c.f5.c21, c.f3.c12),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     94 |          Face(c.f2.c21, c.f6.c12, c.f2.c22, c.f6.c22))
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     95 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     96 | def right(c: Cube) : Cube =
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     97 |     Cube(Face(c.f5.c11, c.f5.c12, c.f1.c21, c.f1.c22),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     98 |          Face(c.f2.c12, c.f2.c22, c.f2.c11, c.f2.c21),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     99 |          Face(c.f3.c11, c.f3.c12, c.f3.c21, c.f3.c22),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    100 |          Face(c.f4.c11, c.f4.c12, c.f6.c12, c.f6.c11),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    101 |          Face(c.f4.c22, c.f4.c21, c.f5.c21, c.f5.c22),
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    102 |          Face(c.f1.c11, c.f1.c12, c.f6.c21, c.f6.c22))         
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    103 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    104 | 
 | 
| 460 |    105 | // simple bf-search without generating a solution, just true
 | 
| 414 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    106 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    107 | def actions(c: Cube) : List[Cube] = 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    108 |   List(up(c), clock(c), right(c)) 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    109 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    110 | def search(cs: List[Cube], d: Int) : Boolean = { 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    111 |   println(s"Depth: $d    Cands: ${cs.length}")  
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    112 |   //memory()
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    113 |   if (cs.exists(solved == _)) true
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    114 |   else search(cs.flatMap(actions), d + 1)
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    115 | }  
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    116 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    117 | search(List(init), 0)
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    118 | 
 | 
| 460 |    119 | 
 | 
|  |    120 | // set version
 | 
| 414 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    121 | def actions_set(c: Cube) : Set[Cube] =
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    122 |   Set(up(c), clock(c), right(c))
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    123 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    124 | def search_set(cs: Set[Cube], d: Int) : Boolean = {
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    125 |   println(s"Depth: $d candidates: ${cs.size}")
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    126 |   //memory()
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    127 |   if (cs.contains(solved)) true
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    128 |   else search_set(cs.flatMap(actions_set), d + 1)
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    129 | }  
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    130 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    131 | search_set(Set(init), 0)
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    132 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    133 | 
 | 
| 460 |    134 | // for generating list of actions
 | 
| 414 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    135 | abstract class Action
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    136 | case object Up extends Action
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    137 | case object Right extends Action
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    138 | case object Clock extends Action
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    139 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    140 | type Actions = List[Action]
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    141 | 
 | 
| 460 |    142 | // list version generating a list of actions
 | 
| 414 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    143 | def actions_list(c: Cube, act: Actions) : List[(Cube, Actions)] = 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    144 |   List((up(c), Up::act), 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    145 |        (clock(c), Clock::act), 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    146 |        (right(c), Right::act)) 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    147 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    148 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    149 | def search_list(cs: List[(Cube, Actions)], d: Int) : (Cube, Actions) = { 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    150 |   println(s"Depth: $d    Cands: ${cs.length}")  
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    151 |   val res = cs.find(_._1 == solved)
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    152 |   if (res.isDefined) res.get
 | 
| 461 |    153 |   else search_list(cs.flatMap{ (c, as) => actions_list(c, as) }, d + 1)
 | 
| 414 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    154 | }  
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    155 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    156 | search_list(List((init, Nil)), 0)._2.reverse.mkString("\n") 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    157 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    158 | 
 | 
| 460 |    159 | // map version generating a list of actions
 | 
| 414 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    160 | def actions_map(c: Cube, as: Actions) : Map[Cube, Actions] = 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    161 |   Map(up(c) -> (Up::as), 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    162 |       clock(c) -> (Clock::as), 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    163 |       right(c) -> (Right::as)) 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    164 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    165 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    166 | def search_map(cs: Map[Cube, Actions], d: Int) : Actions = { 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    167 |   println(s"Depth: $d    Cands: ${cs.keySet.size}")  
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    168 |   val res = cs.keySet.find(_ == solved)
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    169 |   if (res.isDefined) cs(res.get)
 | 
| 461 |    170 |   else search_map(cs.flatMap{ (c, as) => actions_list(c, as) }, d + 1)
 | 
| 414 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    171 | }  
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    172 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    173 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    174 | search_map(Map(init -> Nil), 0).reverse.mkString("\n")
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    175 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    176 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    177 | 
 | 
| 460 |    178 | // bidirectional breadth-first search
 | 
| 414 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    179 | def bsearch(cs: Map[Cube, Actions], 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    180 |             bs: Map[Cube, Actions], d: Int) : Actions = { 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    181 |   println(s"Depth: $d    Cands: ${cs.keySet.size}/${bs.keySet.size}") 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    182 |   val res = cs.keySet intersect bs.keySet 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    183 |   if (!res.isEmpty) (cs(res.head).reverse ::: bs(res.head))
 | 
| 460 |    184 |   else bsearch(cs.flatMap{ (c, as) => actions_map(c, as) }, 
 | 
|  |    185 |                bs.flatMap{ (c, as) => actions_map(c, as) }, d + 1)
 | 
|  |    186 | }  
 | 
|  |    187 | 
 | 
|  |    188 | bsearch(Map(init ->  Nil), Map(solved -> Nil), 0).mkString("\n")
 | 
|  |    189 | 
 | 
|  |    190 | 
 | 
|  |    191 | 
 | 
| 414 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    192 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    193 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    194 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    195 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    196 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    197 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    198 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    199 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    200 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    201 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    202 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    203 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    204 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    205 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    206 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    207 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    208 | 
 |