updated
authorChristian Urban <urbanc@in.tum.de>
Tue, 04 Feb 2020 14:15:42 +0000
changeset 331 e3878cdd38bc
parent 330 c3d3461a5e77
child 332 703c7e42bf46
updated
Attic/marking2/knight1.scala
Attic/marking2/knight1_test.sh
Attic/marking2/knight1a_test.scala
Attic/marking2/knight1b_test.scala
Attic/marking2/knight1c_test.scala
Attic/marking2/knight2.scala
Attic/marking2/knight2a_test.scala
Attic/marking2/knight2b_test.scala
Attic/marking2/knight3.scala
Attic/marking2/knight3_test.sh
Attic/marking2/knight3a_test.scala
Attic/marking2/knight3b_test.scala
Attic/marking2/knight3c_test.scala
Attic/marking2/mark
Attic/marking2/mk
Attic/marking2/mk-advanced
Attic/marking2/tails
marking1/drumb_test.sh
marking1/drumb_test7.scala
marking1/mk-advanced
marking2/danube_test.sh
marking2/mk-advanced
marking3/knight1_test.sh
marking3/knight1_test4.scala
marking3/knight1_test5.scala
marking3/knight2_test.sh
marking3/knight2_test6.scala
marking3/knight2_test7.scala
marking3/knight2_test8.scala
marking3/knight3_test.sh
marking3/knight3_test9.scala
marking3/knight_test6.scala
marking3/knight_test7.scala
marking3/knight_test8.scala
marking3/knight_test9.scala
marking3/marking2/knight1.scala
marking3/marking2/knight1_test.sh
marking3/marking2/knight1a_test.scala
marking3/marking2/knight1b_test.scala
marking3/marking2/knight1c_test.scala
marking3/marking2/knight2.scala
marking3/marking2/knight2a_test.scala
marking3/marking2/knight2b_test.scala
marking3/marking2/knight3.scala
marking3/marking2/knight3_test.sh
marking3/marking2/knight3a_test.scala
marking3/marking2/knight3b_test.scala
marking3/marking2/knight3c_test.scala
marking3/marking2/mark
marking3/marking2/mk
marking3/marking2/mk-advanced
marking3/marking2/tails
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/knight1.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,79 @@
+// Part 1 about finding and counting Knight's tours
+//==================================================
+
+object CW7a {
+
+type Pos = (Int, Int)    // a position on a chessboard 
+type Path = List[Pos]    // a path...a list of positions
+
+def print_board(dim: Int, path: Path): Unit = {
+  println
+  for (i <- 0 until dim) {
+    for (j <- 0 until dim) {
+      print(f"${path.reverse.indexOf((j, dim - i - 1))}%3.0f ")
+    }
+    println
+  } 
+}
+
+def add_pair(x: Pos)(y: Pos): Pos = 
+  (x._1 + y._1, x._2 + y._2)
+
+def is_legal(dim: Int, path: Path)(x: Pos): Boolean = 
+  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
+
+assert(is_legal(8, Nil)((3,4)) == true)
+assert(is_legal(8, List((4,1), (1,0)))((4,1)) == false)
+assert(is_legal(2, Nil)((0,0)) == true)
+
+
+
+def moves(x: Pos): List[Pos] = 
+  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
+       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair(x))
+
+def legal_moves(dim: Int, path: Path, x: Pos): List[Pos] = 
+  moves(x).filter(is_legal(dim, path))
+
+def count_tours(dim: Int, path: Path): Int = {
+  if (path.length == dim * dim) 1
+  else 
+    (for (x <- legal_moves(dim, path, path.head)) yield count_tours(dim, x::path)).sum
+}
+
+def enum_tours(dim: Int, path: Path): List[Path] = {
+  if (path.length == dim * dim) List(path)
+  else 
+    (for (x <- legal_moves(dim, path, path.head)) yield enum_tours(dim, x::path)).flatten
+}
+
+def count_all_tours(dim: Int) = {
+  for (i <- (0 until dim).toList; 
+       j <- (0 until dim).toList) yield count_tours(dim, List((i, j)))
+}
+
+def enum_all_tours(dim: Int): List[Path] = {
+  (for (i <- (0 until dim).toList; 
+        j <- (0 until dim).toList) yield enum_tours(dim, List((i, j)))).flatten
+}
+
+/*
+for (dim <- 1 to 5) {
+  println(s"${dim} x ${dim} " + count_tours(dim, List((0, 0))))
+}
+
+for (dim <- 1 to 5) {
+  println(s"${dim} x ${dim} " + count_all_tours(dim))
+}
+
+for (dim <- 1 to 5) {
+  val ts = enum_tours(dim, List((0, 0)))
+  println(s"${dim} x ${dim} ")   
+  if (ts != Nil) {
+    print_board(dim, ts.head)
+    println(ts.head)
+  }
+}
+*/ 
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/knight1_test.sh	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,206 @@
+#!/bin/bash
+
+# to make the script fail safely
+set -euo pipefail
+
+out=${1:-output}
+
+echo "" > $out
+
+echo "Below is the feedback and provisional marks for your submission" >> $out
+echo "for assignment 7 Part 1.  Please note all marks are provisional until" >> $out
+echo "ratified by the assessment board -- this is not an official" >> $out
+echo "results transcript." >> $out
+echo "" >> $out
+
+echo "Below is the feedback for your submission of CW 7, Part 1." >> $out
+echo "" >> $out
+
+
+# marks for CW7 part 1
+marks=$(( 0 ))
+
+
+# compilation tests (used to be 30 secs)
+
+function scala_compile {
+  (ulimit -t 360; JAVA_OPTS="-Xmx1g" scala "$1" 2> /dev/null 1> /dev/null) 
+}
+
+# functional tests
+
+function scala_assert {
+  (ulimit -t 360; JAVA_OPTS="-Xmx1g" scala -i "$1" "$2" -e "" 2> /dev/null 1> /dev/null)
+}
+
+# purity test
+
+function scala_vars {
+   (egrep '\bvar\b|\breturn\b|\.par|ListBuffer|mutable|new Array' "$1" 2> /dev/null 1> /dev/null)
+}
+
+
+# knights1: purity test
+
+echo "knight1.scala does not contain vars, returns, Arrays, ListBuffers etc?" | tee -a $out
+
+if (scala_vars knight1.scala)
+then
+  echo "  --> fail" | tee -a $out
+  tsts0=$(( 1 ))
+else
+  echo "  --> success" | tee -a $out
+  tsts0=$(( 0 )) 
+fi
+
+
+# compilation test
+
+if [ $tsts0 -eq 0 ]
+then    
+  echo "knight1.scala runs?" | tee -a $out
+
+  if (scala_compile knight1.scala)
+  then
+    echo "  --> success " | tee -a $out
+    tsts1=$(( 0 ))
+  else
+    echo "  --> scala did not run knight1.scala" | tee -a $out
+    tsts1=$(( 1 )) 
+  fi
+else
+  tsts1=$(( 1 ))   
+fi
+
+### knight1a test
+
+if [ $tsts1 -eq 0 ]
+then
+    echo " is_legal(8, Nil)(3, 4) == true " | tee -a $out
+    echo " is_legal(8, List((4, 1), (1, 0)))(4, 1) == false " | tee -a $out
+    echo " is_legal(2, Nil)(0, 0) == true" | tee -a $out                          
+
+    if (scala_assert "knight1.scala" "knight1a_test.scala")
+    then
+        echo "  --> success" | tee -a $out
+	marks=$(( marks + 1 ))
+    else
+        echo "  --> test failed" | tee -a $out
+    fi
+fi
+
+### knight1b test
+
+if [ $tsts1 -eq 0 ]
+then
+  echo " legal_moves(8, Nil, (2,2)) == List((3,4), (4,3), (4,1), (3,0), (1,0), (0,1), (0,3), (1,4))" | tee -a $out
+  echo " legal_moves(8, Nil, (7,7)) == List((6,5), (5,6))" | tee -a $out
+  echo " legal_moves(8, List((4,1), (1,0)), (2,2)) == List((3,4), (4,3), (3,0), (0,1), (0,3), (1,4))" | tee -a $out
+  echo " legal_moves(8, List((6,6)), (7,7)) == List((6,5), (5,6))" | tee -a $out
+  echo " legal_moves(1, Nil, (0,0)) == Nil" | tee -a $out
+  echo " legal_moves(2, Nil, (0,0)) == Nil" | tee -a $out
+  echo " legal_moves(3, Nil, (0,0)) == List((1,2), (2,1))" | tee -a $out
+  
+  if (scala_assert "knight1.scala" "knight1b_test.scala")
+  then
+     echo "  --> success" | tee -a $out
+     marks=$(( marks + 1 ))
+  else
+    echo "  --> test failed" | tee -a $out
+  fi
+fi
+
+
+### knight1c test
+
+if [ $tsts1 -eq 0 ]
+then
+  echo " all_tours from every position on the board" | tee -a $out
+  echo " dim = 1: 1" | tee -a $out
+  echo "       2: 0,0,0,0" >>  $out
+  echo "       3: 0,0,0,0,0,0,0,0,0" >>  $out
+  echo "       4: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" | tee -a $out
+  echo "       5: 304,0,56,0,304,0,56,0,56,0,56,0,64,0,56,0,56,0,56,0,304,0,56,0,304" | tee -a $out
+  echo " enum_tours(5, List((0,2)) ) => 56 tours? and all correct?" | tee -a $out
+  
+  if (scala_assert "knight1.scala" "knight1c_test.scala") 
+  then
+     echo "  --> success" | tee -a $out
+     marks=$(( marks + 2 ))
+  else
+    echo "  --> test failed" | tee -a $out
+  fi
+fi
+
+
+# knights2: var test
+
+echo "knight2.scala does not contain vars, returns, Arrays, ListBuffers etc?" | tee -a $out
+
+if (scala_vars knight2.scala)
+then
+  echo "  --> fail" | tee -a $out
+  tsts0=$(( 1 ))
+else
+  echo "  --> success" | tee -a $out
+  tsts0=$(( 0 )) 
+fi
+
+
+# compilation test
+if  [ $tsts0 -eq 0 ]
+then    
+  echo "knight2.scala runs?" | tee -a $out
+
+  if (scala_compile knight2.scala)
+  then
+    echo "  --> success" | tee -a $out
+    tsts1=$(( 0 ))
+  else
+    echo "  --> scala did not run knight2.scala" | tee -a $out
+    tsts1=$(( 1 )) 
+  fi
+else
+  tsts1=$(( 1 ))     
+fi
+
+### knight2a test
+
+if [ $tsts1 -eq 0 ]
+then
+  echo " val f = (x:(Int, Int)) => if (x._1 > 3) Some(List(x)) else None " | tee -a $out
+  echo "   first(List((1,0),(2,0),(3,0),(4,0)), f) == Some(List((4,0)))" | tee -a $out
+  echo "   first(List((1,0),(2,0),(3,0)), f) == None" | tee -a $out
+
+  if (scala_assert "knight2.scala" "knight2a_test.scala") 
+  then
+    echo "  --> success" | tee -a $out
+    marks=$(( marks + 1 ))
+  else
+    echo "  --> test failed" | tee -a $out
+  fi
+fi
+
+
+### knight2b test
+
+if [ $tsts1 -eq 0 ]
+then
+  echo " is first_tour(8, List((0, 0))) ok? " | tee -a $out
+  echo " is first_tour(4, List((0, 0))) == None " | tee -a $out
+
+  if (scala_assert "knight2.scala" "knight2b_test.scala") 
+  then
+     echo "  --> success" | tee -a $out
+     marks=$(( marks + 2 ))
+  else
+    echo "  --> test failed" | tee -a $out
+  fi
+fi
+
+
+## final marks
+echo "Overall mark for Part 1" | tee -a $out
+echo "$marks" | tee -a $out
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/knight1a_test.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,5 @@
+
+assert(CW7a.is_legal(8, Nil)(3, 4) == true)
+assert(CW7a.is_legal(8, List((4, 1), (1, 0)))(4, 1) == false)
+assert(CW7a.is_legal(2, Nil)(0, 0) == true)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/knight1b_test.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,11 @@
+
+assert(CW7a.legal_moves(8, Nil, (2,2)) == 
+             List((3,4), (4,3), (4,1), (3,0), (1,0), (0,1), (0,3), (1,4)))
+assert(CW7a.legal_moves(8, Nil, (7,7)) == List((6,5), (5,6)))
+assert(CW7a.legal_moves(8, List((4,1), (1,0)), (2,2)) == 
+       List((3,4), (4,3), (3,0), (0,1), (0,3), (1,4)))
+assert(CW7a.legal_moves(8, List((6,6)), (7,7)) == List((6,5), (5,6)))
+assert(CW7a.legal_moves(1, Nil, (0,0)) == List())
+assert(CW7a.legal_moves(2, Nil, (0,0)) == List())
+assert(CW7a.legal_moves(3, Nil, (0,0)) == List((1,2), (2,1)))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/knight1c_test.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,47 @@
+
+//import scala.concurrent._
+//import scala.concurrent.duration._
+//import ExecutionContext.Implicits.global
+//import scala.language.postfixOps 
+
+type Pos = (Int, Int)    // a position on a chessboard 
+type Path = List[Pos]    // a path...a list of positions
+
+def count_all_tours_urban(dim: Int) = {
+  for (i <- (0 until dim).toList; 
+       j <- (0 until dim).toList) yield CW7a.count_tours(dim, List((i, j)))
+}
+
+def add_pair_urban(x: Pos)(y: Pos): Pos = 
+  (x._1 + y._1, x._2 + y._2)
+
+def is_legal_urban(dim: Int, path: Path)(x: Pos): Boolean = 
+  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
+
+def moves_urban(x: Pos): List[Pos] = 
+  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
+       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair_urban(x))
+
+def legal_moves_urban(dim: Int, path: Path, x: Pos): List[Pos] = 
+  moves_urban(x).filter(is_legal_urban(dim, path))
+
+def correct_urban(dim: Int)(p: Path): Boolean = p match {
+  case Nil => true
+  case x::Nil => true
+  case x::y::p => if (legal_moves_urban(dim, p, y).contains(x)) correct_urban(dim)(y::p) else false
+}
+
+
+//lazy val f = Future {
+  assert(count_all_tours_urban(1) == List(1))
+  assert(count_all_tours_urban(2) == List(0, 0, 0, 0))
+  assert(count_all_tours_urban(3) == List(0, 0, 0, 0, 0, 0, 0, 0, 0))
+  assert(count_all_tours_urban(4) == List(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
+  assert(count_all_tours_urban(5) == List(304, 0, 56, 0, 304, 0, 56, 0, 56, 0, 56, 0, 64, 0, 56, 0, 56, 0, 56, 0, 304, 0, 56, 0, 304))
+
+  val ts = CW7a.enum_tours(5, List((0, 2)))
+  assert(ts.map(correct_urban(5)).forall(_ == true) == true)
+  assert(ts.length == 56)  
+//}
+
+//Await.result(f, 360 second)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/knight2.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,61 @@
+// Part 2 about finding a single tour for a board
+//================================================
+
+object CW7b {
+
+type Pos = (Int, Int)    // a position on a chessboard 
+type Path = List[Pos]    // a path...a list of positions
+
+def print_board(dim: Int, path: Path) : Unit = {
+  println
+  for (i <- 0 until dim) {
+    for (j <- 0 until dim) {
+      print(f"${path.reverse.indexOf((i, j))}%3.0f ")
+    }
+    println
+  } 
+}
+
+def add_pair(x: Pos)(y: Pos) : Pos = 
+  (x._1 + y._1, x._2 + y._2)
+
+def is_legal(dim: Int, path: Path)(x: Pos) : Boolean = 
+  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
+
+def moves(x: Pos) : List[Pos] = 
+  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
+       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair(x))
+
+def legal_moves(dim: Int, path: Path, x: Pos) : List[Pos] = 
+  moves(x).filter(is_legal(dim, path))
+
+
+def first(xs: List[Pos], f: Pos => Option[Path]) : Option[Path] = xs match {
+  case Nil => None
+  case x::xs => {
+    val result = f(x)
+    if (result.isDefined) result else first(xs, f)
+  }
+}
+
+//first(List((1, 0),(2, 0),(3, 0),(4, 0)), (x => if (x._1 > 3) Some(List(x)) else None))
+//first(List((1, 0),(2, 0),(3, 0)), (x => if (x._1 > 3) Some(List(x)) else None))
+
+def first_tour(dim: Int, path: Path) : Option[Path] = {
+  if (path.length == dim * dim) Some(path)
+  else
+    first(legal_moves(dim, path, path.head), (x: Pos) => first_tour(dim, x::path))
+}
+
+/* 
+val ts1 = first_tour(8, List((0, 0))).get
+  assert(correct_urban(8)(ts1) == true)
+
+val ts2 = first_tour(4, List((0, 0)))
+assert(ts2 == None)  
+
+print_board(8, first_tour(8, List((0, 0))).get)
+*/
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/knight2a_test.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,5 @@
+
+val f = (x:(Int, Int)) => if (x._1 > 3) Some(List(x)) else None
+
+assert(CW7b.first(List((1,0),(2,0),(3,0),(4,0)), f) == Some(List((4,0))))
+assert(CW7b.first(List((1,0),(2,0),(3,0)), f) == None)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/knight2b_test.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,40 @@
+
+//import scala.concurrent._
+//import scala.concurrent.duration._
+//import ExecutionContext.Implicits.global
+//import scala.language.postfixOps 
+
+type Pos = (Int, Int)    // a position on a chessboard 
+type Path = List[Pos]    // a path...a list of positions
+
+def add_pair_urban(x: Pos)(y: Pos): Pos = 
+  (x._1 + y._1, x._2 + y._2)
+
+def is_legal_urban(dim: Int, path: Path)(x: Pos): Boolean = 
+  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
+
+def moves_urban(x: Pos): List[Pos] = 
+  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
+       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair_urban(x))
+
+def legal_moves_urban(dim: Int, path: Path, x: Pos): List[Pos] = 
+  moves_urban(x).filter(is_legal_urban(dim, path))
+
+def correct_urban(dim: Int)(p: Path): Boolean = p match {
+  case Nil => true
+  case x::Nil => true
+  case x::y::p => 
+    if (legal_moves_urban(dim, p, y).contains(x)) correct_urban(dim)(y::p) else false
+}
+
+
+//lazy val f = Future {
+
+  val ts1 = CW7b.first_tour(8, List((0, 0))).get
+  assert(correct_urban(8)(ts1) == true)
+
+  val ts2 = CW7b.first_tour(4, List((0, 0)))
+  assert(ts2 == None)  
+//}
+
+//Await.result(f, 300 second)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/knight3.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,96 @@
+// Part 3 about finding a single tour using the Warnsdorf Rule
+//=============================================================
+
+object CW7c {
+
+type Pos = (Int, Int)
+type Path = List[Pos]
+
+def print_board(dim: Int, path: Path): Unit = {
+  println
+  for (i <- 0 until dim) {
+    for (j <- 0 until dim) {
+      print(f"${path.reverse.indexOf((i, j))}%3.0f ")
+    }
+    println
+  } 
+}
+
+def add_pair(x: Pos)(y: Pos): Pos = 
+  (x._1 + y._1, x._2 + y._2)
+
+def is_legal(dim: Int, path: Path)(x: Pos): Boolean = 
+  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
+
+def moves(x: Pos): List[Pos] = 
+  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
+       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair(x))
+
+def legal_moves(dim: Int, path: Path, x: Pos): List[Pos] = 
+  moves(x).filter(is_legal(dim, path))
+
+def ordered_moves(dim: Int, path: Path, x: Pos): List[Pos] = 
+  legal_moves(dim, path, x).sortBy((x) => legal_moves(dim, path, x).length)
+
+
+import scala.annotation.tailrec
+
+@tailrec
+def first(xs: List[Pos], f: Pos => Option[Path]): Option[Path] = xs match {
+  case Nil => None
+  case x::xs => {
+    val result = f(x)
+    if (result.isDefined) result else first(xs, f)
+  }
+}
+
+
+def first_closed_tour_heuristic(dim: Int, path: Path): Option[Path] = {
+  if (path.length == dim * dim && moves(path.head).contains(path.last)) Some(path)
+  else
+    first(ordered_moves(dim, path, path.head), (x: Pos) => first_closed_tour_heuristic(dim, x::path))
+}
+
+/*
+for (dim <- 1 to 6) {
+  val t = first_closed_tour_heuristic(dim, List((dim / 2, dim / 2)))
+  println(s"${dim} x ${dim} closed: " + (if (t == None) "" else { print_board(dim, t.get) ; "" }))
+}*/
+
+
+def first_tour_heuristic(dim: Int, path: Path): Option[Path] = {
+
+  @tailrec
+  def aux(dim: Int, path: Path, moves: List[Pos]): Option[Path] =  
+  if (path.length == dim * dim) Some(path)
+  else
+    moves match {
+      case Nil => None
+      case x::xs => {
+        val r = first_tour_heuristic(dim, x::path)
+        if (r.isDefined) r else aux(dim, path, xs)
+    }
+  }    
+ 
+  aux(dim, path, ordered_moves(dim, path, path.head)) 
+}
+
+/*
+def first_tour_heuristic(dim: Int, path: Path): Option[Path] = {
+  if (path.length == dim * dim) Some(path)
+  else
+    first(ordered_moves(dim, path, path.head), (x: Pos) => first_tour_heuristic(dim, x::path))
+}
+*/
+
+/*
+for (dim <- 1 to 50) {
+  val t = first_tour_heuristic(dim, List((dim / 2, dim / 2)))
+  println(s"${dim} x ${dim}: " + (if (t == None) "" else { print_board(dim, t.get) ; "" }))
+}
+*/
+
+}
+
+
+//CW7c.first_tour_heuristic(50, List((0,0))).get
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/knight3_test.sh	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,124 @@
+#!/bin/bash
+
+# to make the script fail safely
+set -euo pipefail
+
+
+out=${1:-output}
+
+echo "" > $out
+
+echo "Below is the feedback and provisional marks for your submission" >> $out
+echo "for assignment 7 Part 2.  Please note all marks are provisional until" >> $out
+echo "ratified by the assessment board -- this is not an official" >> $out
+echo "results transcript." >> $out
+echo "" >> $out
+
+# marks for CW7 part 2
+marks=$(( 0 ))
+
+# compilation tests
+
+function scala_compile {
+    (ulimit -t 360; JAVA_OPTS="-Xmx1g" scala "$1" 2> /dev/null 1> /dev/null)
+}
+
+# functional tests
+
+function scala_assert {
+    (ulimit -t 360; JAVA_OPTS="-Xmx4g -Xss200m" scala -i "$1" "$2" -e "" 2> /dev/null 1> /dev/null)
+}
+
+
+# purity test
+
+function scala_vars {
+   (egrep '\bvar\b|\breturn\b|\.par|ListBuffer|mutable|new Array' "$1" 2> /dev/null 1> /dev/null)
+}
+
+
+# knights3: purity test
+#
+echo "knight3.scala does not contain vars, returns, Arrays, ListBuffers etc?" | tee -a $out
+
+
+if (scala_vars knight3.scala)
+then
+  echo "  --> test failed" | tee -a $out
+  tsts0=$(( 1 ))
+else
+  echo "  --> success" | tee -a $out
+  tsts0=$(( 0 )) 
+fi
+
+
+# compilation test
+if  [ $tsts0 -eq 0 ]
+then    
+  echo "knight3.scala runs?" | tee -a $out
+
+  if (scala_compile knight3.scala)
+  then
+    echo "  --> success" | tee -a $out
+    tsts1=$(( 0 ))
+  else
+    echo "  --> scala knight3.scala did not run successfully" | tee -a $out
+    tsts1=$(( 1 )) 
+  fi
+else
+  tsts1=$(( 1 ))     
+fi
+
+# ordered move test
+
+if [ $tsts1 -eq 0 ]
+then
+  echo " ordered_moves(8, List((3,4), (3,2)), (1,3)) == List((0,1), (0,5), (2,1), (2,5))" | tee -a $out
+  echo " ordered_moves(8, List((4,0)), (0,0)) == List((2,1), (1,2))" | tee -a $out
+  echo " ordered_moves(8, List((0,4)), (0,0)) == List((1,2), (2,1))" | tee -a $out
+  
+  if (scala_assert "knight3.scala" "knight3a_test.scala")
+  then
+      echo "  --> success" | tee -a $out
+      marks=$(( marks + 1 ))
+  else
+    echo "  --> test failed" | tee -a $out
+  fi
+fi
+
+
+# first-closed-tour test
+
+if [ $tsts1 -eq 0 ]
+then
+  echo " first_closed_tour_heuristic(6, List((3,3))) found and correct?" | tee -a $out
+  
+  if (scala_assert "knight3.scala" "knight3b_test.scala")
+  then
+      echo "  --> success" | tee -a $out
+      marks=$(( marks + 1 ))
+  else
+      echo "  --> test failed" | tee -a $out
+  fi
+fi
+
+
+
+if [ $tsts1 -eq 0 ]
+then
+  echo " first_tour_heuristic(8, List((0,0))) found and correct?" | tee -a $out
+  echo " first_tour_heuristic(40, List((0,0))) found and correct?" | tee -a $out
+  
+  if (scala_assert "knight3.scala" "knight3c_test.scala")
+  then
+      echo "  --> success" | tee -a $out
+      marks=$(( marks + 1 ))
+  else
+    echo "  --> test failed" | tee -a $out
+  fi
+fi
+
+
+## final marks
+echo "Overall mark for CW 7, Part 2" | tee -a $out
+echo "$marks" | tee -a $out
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/knight3a_test.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,5 @@
+
+assert(CW7c.ordered_moves(8, List((3,4), (3,2)), (1,3)) == List((0,1), (0,5), (2,1), (2,5)))
+assert(CW7c.ordered_moves(8, List((4,0)), (0,0)) == List((2,1), (1,2)))
+assert(CW7c.ordered_moves(8, List((0,4)), (0,0)) == List((1,2), (2,1)))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/knight3b_test.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,40 @@
+
+//import scala.concurrent._
+//import scala.concurrent.duration._
+//import ExecutionContext.Implicits.global
+//import scala.language.postfixOps 
+
+type Pos = (Int, Int)
+type Path = List[Pos]
+
+def add_pair_urban(x: Pos)(y: Pos): Pos = 
+  (x._1 + y._1, x._2 + y._2)
+
+def is_legal_urban(dim: Int, path: Path)(x: Pos): Boolean = 
+  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
+
+def moves_urban(x: Pos): List[Pos] = 
+  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
+       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair_urban(x))
+
+def legal_moves_urban(dim: Int, path: Path, x: Pos): List[Pos] = 
+  moves_urban(x).filter(is_legal_urban(dim, path))
+
+def correct_urban(dim: Int)(p: Path): Boolean = p match {
+  case Nil => true
+  case x::Nil => true
+  case x::y::p => 
+    if (legal_moves_urban(dim, p, y).contains(x)) correct_urban(dim)(y::p) else false
+}
+
+def correct_closed_urban(dim: Int)(p: Path) =
+  correct_urban(6)(p) &&  moves_urban(p.head).contains(p.last)
+
+//lazy val f = Future {
+
+  val tsc = CW7c.first_closed_tour_heuristic(6, List((3, 3))).get
+  assert(correct_closed_urban(6)(tsc) == true)
+
+//}
+
+//Await.result(f, 300 second)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/knight3c_test.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,50 @@
+
+//import scala.concurrent._
+//import scala.concurrent.duration._
+//import ExecutionContext.Implicits.global
+//import scala.language.postfixOps 
+
+println(Runtime.getRuntime.maxMemory)
+
+type Pos = (Int, Int)
+type Path = List[Pos]
+
+def add_pair_urban(x: Pos)(y: Pos): Pos = 
+  (x._1 + y._1, x._2 + y._2)
+
+def is_legal_urban(dim: Int, path: Path)(x: Pos): Boolean = 
+  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
+
+def moves_urban(x: Pos): List[Pos] = 
+  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
+       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair_urban(x))
+
+def legal_moves_urban(dim: Int, path: Path, x: Pos): List[Pos] = 
+  moves_urban(x).filter(is_legal_urban(dim, path))
+
+def correct_urban(dim: Int)(p: Path): Boolean = p match {
+  case Nil => true
+  case x::Nil => true
+  case x::y::p => 
+    if (legal_moves_urban(dim, p, y).contains(x)) correct_urban(dim)(y::p) else false
+}
+
+// !!!!!!! the futures need to be removed
+//lazy val f1 = Future {
+
+  val ts8 = CW7c.first_tour_heuristic(8, List((0,0))).get
+  assert(correct_urban(8)(ts8) == true)
+
+//}
+
+//Await.result(f1, 360 second)
+
+
+//lazy val f2 = Future {
+
+  val ts40 = CW7c.first_tour_heuristic(40, List((0,0))).get
+  assert(correct_urban(40)(ts40) == true)
+
+//}
+
+//Await.result(f2, 360 second)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/mark	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,9 @@
+#!/bin/sh
+###set -e
+
+trap "exit" INT
+
+./collatz_test.sh output1
+./alcohol_test.sh output2
+./drumb_test.sh output3
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/mk	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,28 @@
+#!/bin/sh
+###set -e
+
+trap "exit" INT
+
+files=${1:-assignment20177-*}
+
+for sd in $files; do
+  cd $sd
+  echo $sd
+  touch .
+  cp ../../../marking2/knight1_test.sh .
+  cp ../../../marking2/kinght1a_test.scala .
+  cp ../../../marking2/knight1b_test.scala .
+  cp ../../../marking2/knight1c_test.scala .
+  cp ../../../marking2/knight2a_test.scala .
+  cp ../../../marking2/knight2b_test.scala .
+  ./knight1_test.sh output
+  rm knight1_test.sh
+  rm kinght1a_test.scala
+  rm kinght1b_test.scala
+  rm kinght1c_test.scala 
+  rm kinght2a_test.scala
+  rm kinght2b_test.scala
+  cd ..
+done
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/mk-advanced	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,24 @@
+#!/bin/sh
+###set -e
+
+trap "exit" INT
+
+files=${1:-assignment20177-*}
+
+for sd in $files; do
+  cd $sd
+  echo $sd
+  touch .
+  cp ../../../marking2/knight3_test.sh .
+  cp ../../../marking2/knight3a_test.scala .
+  cp ../../../marking2/knight3b_test.scala .
+  cp ../../../marking2/knight3c_test.scala .
+  ./knight3_test.sh output
+  rm knight3_test.sh
+  rm knight3a_test.scala
+  rm knight3b_test.scala
+  rm knight3c_test.scala
+  cd ..
+done
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Attic/marking2/tails	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,15 @@
+#!/bin/sh
+###set -e
+
+trap "exit" INT
+
+files=${1:-assignment20177-*}
+
+for sd in $files; do
+  cd $sd
+  #echo $sd
+  tail -1 output
+  cd ..
+done
+
+
--- a/marking1/drumb_test.sh	Tue Feb 04 11:20:31 2020 +0000
+++ b/marking1/drumb_test.sh	Tue Feb 04 14:15:42 2020 +0000
@@ -1,4 +1,6 @@
 #!/bin/bash
+
+# to make the script fail safely
 set -euo pipefail
 
 out=${1:-output}
@@ -25,13 +27,13 @@
 # compilation tests
 
 function scala_compile {
-    (ulimit -t 60; JAVA_OPTS="-Xmx1g" scala "$1" 2> /dev/null 1> /dev/null)
+    (ulimit -t 30; JAVA_OPTS="-Xmx1g" scala "$1" 2> /dev/null 1> /dev/null)
 }
 
 # functional tests
 
 function scala_assert {
-    (ulimit -t 60; JAVA_OPTS="-Xmx4g" scala -i "$1" -- "$2" -e "" 2> /dev/null 1> /dev/null)
+    (ulimit -t 30; JAVA_OPTS="-Xmx4g" scala -i "$1" -- "$2" -e "" 2> /dev/null 1> /dev/null)
 }
 
 
--- a/marking1/drumb_test7.scala	Tue Feb 04 11:20:31 2020 +0000
+++ b/marking1/drumb_test7.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -13,7 +13,12 @@
 assert(CW6b.investment(List("GOOG", "AAPL", "BIDU"), 2000 to 2002, 100) == 42)
 assert(CW6b.investment(List("GOOG", "AAPL", "BIDU"), 2000 to 2003, 100) == 27)
 assert(CW6b.investment(List("GOOG", "AAPL", "BIDU"), 2000 to 2004, 100) == 38)
-assert(CW6b.investment(List("GOOG", "AAPL", "BIDU"), 2000 to 2005, 100) == 113)
-assert(CW6b.investment(List("GOOG", "AAPL", "BIDU"), 2000 to 2006, 100) == 254)
-assert(CW6b.investment(List("GOOG", "AAPL", "BIDU"), 2000 to 2007, 100) == 349)
-assert(CW6b.investment(List("GOOG", "AAPL", "BIDU"), 1990 to 2017, 100) == 11504)
+
+// 113
+assert((112 to 114).contains(CW6b.investment(List("GOOG", "AAPL", "BIDU"), 2000 to 2005, 100)))
+// 254
+assert((252 to 256).contains(CW6b.investment(List("GOOG", "AAPL", "BIDU"), 2000 to 2006, 100)))
+// 349
+assert((346 to 352).contains(CW6b.investment(List("GOOG", "AAPL", "BIDU"), 2000 to 2007, 100)))
+//11504
+assert((11389 to 11619).contains(CW6b.investment(List("GOOG", "AAPL", "BIDU"), 1990 to 2017, 100)))
--- a/marking1/mk-advanced	Tue Feb 04 11:20:31 2020 +0000
+++ b/marking1/mk-advanced	Tue Feb 04 14:15:42 2020 +0000
@@ -10,17 +10,17 @@
   cd $sd
   echo $sd
   touch .
-  cp ../../../../marking1/drump_test.sh .
-  cp ../../../../marking1/drumb_test1.scala .
-  cp ../../../../marking1/drumb_test2.scala .
-  cp ../../../../marking1/drumb_test3.scala .
-  cp ../../../../marking1/drumb_test4.scala .
-  cp ../../../../marking1/drumb_test5.scala .
-  cp ../../../../marking1/drumb_test6.scala .
-  cp ../../../../marking1/drumb_test7.scala .
-  cp ../../../../marking1/*.csv .
+  cp ../../../../../marking1/drumb_test.sh .
+  cp ../../../../../marking1/drumb_test1.scala .
+  cp ../../../../../marking1/drumb_test2.scala .
+  cp ../../../../../marking1/drumb_test3.scala .
+  cp ../../../../../marking1/drumb_test4.scala .
+  cp ../../../../../marking1/drumb_test5.scala .
+  cp ../../../../../marking1/drumb_test6.scala .
+  cp ../../../../../marking1/drumb_test7.scala .
+  cp ../../../../../marking1/*.csv .
   ./drumb_test.sh output
-  rm drump_test.sh
+  rm drumb_test.sh
   rm drumb_test1.scala
   rm drumb_test2.scala
   rm drumb_test3.scala
--- a/marking2/danube_test.sh	Tue Feb 04 11:20:31 2020 +0000
+++ b/marking2/danube_test.sh	Tue Feb 04 14:15:42 2020 +0000
@@ -7,20 +7,22 @@
 out=${1:-output}
 
 
-
+echo -e `date` >> $out
 echo -e  "" > $out
-
 echo -e  "Below is the feedback and provisional marks for your submission" >> $out
 echo -e  "for core assignment 7.  Please note all marks are provisional until" >> $out
 echo -e  "ratified by the assessment board -- this is not an official" >> $out
 echo -e  "results transcript." >> $out
 echo -e  "" >> $out
 
+# marks for core CW7
+marks=$(( 0 ))
+
+echo -e "" >> $out
 echo -e  "Below is the feedback for your submission danube.scala" >> $out
 echo -e  "" >> $out
 
-# marks for core CW7
-marks=$(( 0 ))
+
 
 
 # compilation tests
@@ -38,17 +40,17 @@
 # purity test
 
 function scala_vars {
-   (egrep '\bvar\b|\breturn\b|ListBuffer|mutable' "$1" 2> /dev/null 1> /dev/null)
+   (egrep '\bvar\b|\breturn\b|\.par|ListBuffer|mutable|new Array' "$1" 2> /dev/null 1> /dev/null)
 }
 
 
 # var, .par return, ListBuffer test
 #
-echo -e  "danube.scala does not contain vars, returns etc?" | tee -a $out
+echo -e  "danube.scala does not contain vars, returns,  Arrays, ListBuffers etc?" | tee -a $out
 
 if (scala_vars danube.scala)
 then
-  echo -e  "  --> test failed" | tee -a $out
+  echo -e  "  --> TEST FAILED\n" | tee -a $out
   tsts0=$(( 1 ))  
 else
   echo -e  "  --> success" | tee -a $out
@@ -87,7 +89,7 @@
       echo -e  "  --> success" | tee -a $out
       marks=$(( marks + 1 ))
   else
-    echo -e  "  --> ONE OF THE TESTS FAILED\n" | tee -a $out
+      echo -e  "  --> ONE OF THE TESTS FAILED\n" | tee -a $out
   fi
 fi
 
@@ -106,7 +108,7 @@
       echo -e  "  --> success" | tee -a $out
       marks=$(( marks + 1 ))
   else
-    echo -e  "  --> ONE OF THE TESTS FAILED\n" | tee -a $out
+      echo -e  "  --> ONE OF THE TESTS FAILED\n" | tee -a $out
   fi
 fi
 
@@ -193,6 +195,7 @@
 
 
 ## final marks
+echo -e "" >> $out
 echo -e  "Overall mark for CW 7 Core Part" | tee -a $out
 echo -e  "$marks" | tee -a $out
 
--- a/marking2/mk-advanced	Tue Feb 04 11:20:31 2020 +0000
+++ b/marking2/mk-advanced	Tue Feb 04 14:15:42 2020 +0000
@@ -3,21 +3,25 @@
 
 trap "exit" INT
 
-files=${1:-assignment20187-*}
+files=${1:-assignment2019scala-*/Part7}
 
 for sd in $files; do
   cd $sd
   echo $sd
   touch .
-  cp ../../../marking2/danube_test2.sh .
-  cp ../../../marking2/danube_test3.scala .
-  cp ../../../marking2/danube_test4.scala .
-  cp ../../../marking2/danube_test5.scala .
-  cp ../../../marking2/danube_test6.scala .
-  cp ../../../marking2/movies.csv .
-  cp ../../../marking2/ratings.csv .
-  ./danube_test2.sh output
+  cp ../../../../../marking2/danube_test.sh .
+  cp ../../../../../marking2/danube_test1.scala .
+  cp ../../../../../marking2/danube_test2.scala .
+  cp ../../../../../marking2/danube_test3.scala .
+  cp ../../../../../marking2/danube_test4.scala .
+  cp ../../../../../marking2/danube_test5.scala .
+  cp ../../../../../marking2/danube_test6.scala .
+  cp ../../../../../marking2/movies.csv .
+  cp ../../../../../marking2/ratings.csv .
+  ./danube_test.sh output
   rm danube_test2.sh
+  rm danube_test1.scala
+  rm danube_test2.scala
   rm danube_test3.scala
   rm danube_test4.scala
   rm danube_test5.scala
@@ -25,6 +29,7 @@
   rm ratings.csv
   rm movies.csv
   cd ..
+  cd ..
 done
 
 
--- a/marking3/knight1_test.sh	Tue Feb 04 11:20:31 2020 +0000
+++ b/marking3/knight1_test.sh	Tue Feb 04 14:15:42 2020 +0000
@@ -165,7 +165,7 @@
   then
      END=$(date +%s)
      DIFF=$(( $END - $START ))
-     echo " It took $DIFF seconds" | tee -a $out 
+     echo "  It took $DIFF seconds" | tee -a $out 
      echo -e "  --> success\n" | tee -a $out
      marks=$(( marks + 1 ))
   else
--- a/marking3/knight1_test4.scala	Tue Feb 04 11:20:31 2020 +0000
+++ b/marking3/knight1_test4.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -1,5 +1,7 @@
+import CW8a._
 
-val f = (x:(Int, Int)) => if (x._1 > 3) Some(List(x)) else None
 
-assert(first(List((1,0),(2,0),(3,0),(4,0)), f) == Some(List((4,0))))
-assert(first(List((1,0),(2,0),(3,0)), f) == None)
+val f_urban = (x:(Int, Int)) => if (x._1 > 3) Some(List(x)) else None
+
+assert(first(List((1,0),(2,0),(3,0),(4,0)), f_urban) == Some(List((4,0))))
+assert(first(List((1,0),(2,0),(3,0)), f_urban) == None)
--- a/marking3/knight1_test5.scala	Tue Feb 04 11:20:31 2020 +0000
+++ b/marking3/knight1_test5.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -1,3 +1,4 @@
+import CW8a._
 
 //type Pos = (Int, Int)    // a position on a chessboard 
 //type Path = List[Pos]    // a path...a list of positions
@@ -23,8 +24,8 @@
 }
 
 
-val ts1_urban = first_tour(8, List((0, 0))).get
-assert(correct_urban(8)(ts1_urban) == true)
+val ts1_urban = first_tour(6, List((0, 0))).get
+assert(correct_urban(6)(ts1_urban) == true)
 
 val ts2_urban = first_tour(4, List((0, 0)))
 assert(ts2_urban == None)  
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/marking3/knight2_test.sh	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,275 @@
+#!/bin/bash
+
+# to make the script fail safely
+set -euo pipefail
+
+
+out=${1:-output}
+
+echo "" > $out
+
+echo "Below is the feedback and provisional marks for your submission" >> $out
+echo "for core assignment 8.  Please note all marks are provisional until" >> $out
+echo "ratified by the assessment board -- this is not an official" >> $out
+echo "results transcript." >> $out
+echo "" >> $out
+
+# marks for core CW8
+marks=$(( 0 ))
+
+# compilation tests
+
+function scala_compile {
+    (ulimit -t 30; JAVA_OPTS="-Xmx1g" scala -nc "$1" 2> /dev/null 1> /dev/null)
+}
+
+# functional tests
+
+function scala_assert {
+    (ulimit -t 30; JAVA_OPTS="-Xmx1g" scala -nc -i "$1" "$2" -e "" 2> /dev/null 1> /dev/null)
+}
+
+function scala_assert_long {
+  (ulimit -t 60; JAVA_OPTS="-Xmx1g" scala -nc -i "$1" "$2" -e "" 2> /dev/null 1> /dev/null)
+}
+
+#function scala_assert_elong {
+#  (ulimit -t 90; JAVA_OPTS="-Xmx1g" scala -nc -i "$1" "$2" -e "" 2> /dev/null 1> /dev/null)
+#}
+
+# purity test
+
+function scala_vars {
+   (egrep '\bvar\b|\breturn\b|\.par|ListBuffer|mutable|new Array' "$1" 2> /dev/null 1> /dev/null)
+}
+
+# knights1: purity test
+
+echo -e "knight1.scala does not contain vars, returns,  Arrays, ListBuffers etc?" | tee -a $out
+
+if (scala_vars knight1.scala)
+then
+  echo -e "  --> TEST FAILED\n" | tee -a $out
+  tsts0=$(( 1 ))
+else
+  echo -e "  --> success" | tee -a $out
+  tsts0=$(( 0 )) 
+fi
+
+
+# compilation test
+
+if [ $tsts0 -eq 0 ]
+then    
+  echo -e "knight1.scala runs?" | tee -a $out
+
+  if (scala_compile knight1.scala)
+  then
+    echo -e "  --> success " | tee -a $out
+    tsts1=$(( 0 ))
+  else
+    echo -e "  --> SCALA DID NOT RUN knight1.scala\n" | tee -a $out
+    tsts1=$(( 1 )) 
+  fi
+else
+  tsts1=$(( 1 ))   
+fi
+
+
+### knight4 test
+
+if [ $tsts1 -eq 0 ]
+then
+  echo -e " Let f = (x:(Int, Int)) => if (x._1 > 3) Some(List(x)) else None " | tee -a $out
+  echo -e "   first(List((1,0),(2,0),(3,0),(4,0)), f) == Some(List((4,0)))" | tee -a $out
+  echo -e "   first(List((1,0),(2,0),(3,0)), f) == None" | tee -a $out  
+  
+  if (scala_assert "knight1.scala" "knight1_test4.scala") 
+  then
+      echo -e "  --> success" | tee -a $out
+      marks=$(( marks + 1 ))
+  else
+      echo -e "  --> TEST FAILED\n" | tee -a $out
+  fi
+fi
+
+### knight5 test
+
+if [ $tsts1 -eq 0 ]
+then
+  echo -e " is first_tour(6, List((0, 0))) ok? " | tee -a $out
+  echo -e " is first_tour(4, List((0, 0))) == None " | tee -a $out
+  START=$(date +%s)
+  
+  if (scala_assert_long "knight1.scala" "knight1_test5.scala") 
+  then
+      END=$(date +%s)
+      DIFF=$(( $END - $START ))
+      echo "  It took $DIFF seconds" | tee -a $out  
+      echo -e "  --> success" | tee -a $out
+      marks=$(( marks + 1 ))
+  else
+      END=$(date +%s)
+      DIFF=$(( $END - $START ))
+      echo "  It took $DIFF seconds" | tee -a $out 
+      echo -e "  --> TEST FAILED\n" | tee -a $out
+  fi
+fi
+
+
+
+# knights2: purity test
+#
+echo "knight2.scala does not contain vars, returns, Arrays, ListBuffers etc?" | tee -a $out
+
+
+if (scala_vars knight2.scala)
+then
+  echo -e "  --> TEST FAILED\n" | tee -a $out
+  tsts0=$(( 1 ))
+else
+  echo -e "  --> success" | tee -a $out
+  tsts0=$(( 0 )) 
+fi
+
+
+# compilation test
+if  [ $tsts0 -eq 0 ]
+then    
+  echo "knight2.scala runs?" | tee -a $out
+
+  if (scala_compile knight2.scala)
+  then
+    echo -e "  --> success" | tee -a $out
+    tsts1=$(( 0 ))
+  else
+    echo -e "  --> SCALA DID NOT RUN knight2.scala\n" | tee -a $out
+    tsts1=$(( 1 )) 
+  fi
+else
+  tsts1=$(( 1 ))     
+fi
+
+# ordered move test
+
+if [ $tsts1 -eq 0 ]
+then
+  echo -e " ordered_moves(8, List((3,4), (3,2)), (1,3)) == List((0,1), (0,5), (2,1), (2,5))" | tee -a $out
+  echo -e " ordered_moves(8, List((4,0)), (0,0)) == List((2,1), (1,2))" | tee -a $out
+  echo -e " ordered_moves(8, List((0,4)), (0,0)) == List((1,2), (2,1))" | tee -a $out
+  
+  if (scala_assert "knight2.scala" "knight2_test6.scala")
+  then
+      echo -e "  --> success" | tee -a $out
+      marks=$(( marks + 1 ))
+  else
+      echo -e "  --> TEST FAILED\n" | tee -a $out
+  fi
+fi
+
+
+# first-closed-tour test
+
+if [ $tsts1 -eq 0 ]
+then
+  echo -e " first_closed_tour_heuristics(6, List((3,3))) found and correct?" | tee -a $out
+  START=$(date +%s)
+  
+  if (scala_assert "knight2.scala" "knight2_test7.scala")
+  then
+      END=$(date +%s)
+      DIFF=$(( $END - $START ))
+      echo "  It took $DIFF seconds" | tee -a $out 
+      echo -e "  --> success" | tee -a $out
+      marks=$(( marks + 1 ))
+  else
+      END=$(date +%s)
+      DIFF=$(( $END - $START ))
+      echo "  It took $DIFF seconds" | tee -a $out 
+      echo -e "  --> TEST FAILED\n" | tee -a $out
+  fi
+fi
+
+
+# first-tour test
+
+if [ $tsts1 -eq 0 ]
+then
+  echo -e " first_tour_heuristics(8, List((0,0))) found and correct?" | tee -a $out
+  echo -e " first_tour_heuristics(30, List((0,0))) found and correct?" | tee -a $out
+  START=$(date +%s)
+  
+  if (scala_assert_long "knight2.scala" "knight2_test8.scala")
+  then
+      END=$(date +%s)
+      DIFF=$(( $END - $START ))
+      echo "  It took $DIFF seconds" | tee -a $out
+      echo -e "  --> success" | tee -a $out
+      marks=$(( marks + 1 ))
+  else
+      END=$(date +%s)
+      DIFF=$(( $END - $START ))
+      echo "  It took $DIFF seconds" | tee -a $out
+      echo -e "  --> TEST FAILED\n" | tee -a $out
+  fi
+fi
+
+
+
+# knights3: purity test
+#
+echo -e "knight3.scala does not contain vars, returns, Arrays, ListBuffers etc?" | tee -a $out
+
+
+if (scala_vars knight3.scala)
+then
+  echo "  --> TEST FAILED\n" | tee -a $out
+  tsts0=$(( 1 ))
+else
+  echo "  --> success" | tee -a $out
+  tsts0=$(( 0 )) 
+fi
+
+# compilation test
+if  [ $tsts0 -eq 0 ]
+then    
+  echo "knight3.scala runs?" | tee -a $out
+
+  if (scala_compile knight3.scala)
+  then
+    echo "  --> success" | tee -a $out
+    tsts1=$(( 0 ))
+  else
+    echo -e "  --> SCALA DID NOT RUN knight3.scala\n" | tee -a $out  
+    tsts1=$(( 1 )) 
+  fi
+else
+  tsts1=$(( 1 ))     
+fi
+
+
+if [ $tsts1 -eq 0 ]
+then
+  echo -e " tour_on_mega_board(70, List((0,0))) found and correct?" | tee -a $out
+  START=$(date +%s)
+  
+  if (scala_assert "knight3.scala" "knight3_test9.scala")
+  then
+      END=$(date +%s)
+      DIFF=$(( $END - $START ))
+      echo "  It took $DIFF seconds" | tee -a $out
+      echo -e "  --> success" | tee -a $out
+      marks=$(( marks + 1 ))
+  else
+      END=$(date +%s)
+      DIFF=$(( $END - $START ))
+      echo "  It took $DIFF seconds" | tee -a $out
+      echo -e "  --> test  failed" | tee -a $out 
+  fi
+fi
+
+
+## final marks
+echo -e "" >> $out
+echo -e "Overall mark for CW 8 Core Part" | tee -a $out
+echo -e "$marks" | tee -a $out
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/marking3/knight2_test6.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,19 @@
+import CW8b._
+
+assert(ordered_moves(8, List((3,4), (3,2)), (1, 3)) == List((0,1), (0,5), (2,1), (2,5)))
+assert(ordered_moves(8, List((4,0)), (0,0)) == List((2,1), (1,2)))
+assert(ordered_moves(8, List((0,4)), (0,0)) == List((1,2), (2,1)))
+
+
+
+/*
+import scala.concurrent._
+import scala.concurrent.duration._
+import ExecutionContext.Implicits.global
+import scala.language.postfixOps 
+
+lazy val f = Future {
+}
+
+Await.result(f, 120 second)
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/marking3/knight2_test7.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,32 @@
+import CW8b._
+
+//type Pos = (Int, Int)
+//type Path = List[Pos]
+
+def add_pair_urban(x: Pos)(y: Pos): Pos = 
+  (x._1 + y._1, x._2 + y._2)
+
+def is_legal_urban(dim: Int, path: Path)(x: Pos): Boolean = 
+  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
+
+def moves_urban(x: Pos): List[Pos] = 
+  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
+       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair_urban(x))
+
+def legal_moves_urban(dim: Int, path: Path, x: Pos): List[Pos] = 
+  moves_urban(x).filter(is_legal_urban(dim, path))
+
+def correct_urban(dim: Int)(p: Path): Boolean = p match {
+  case Nil => true
+  case x::Nil => true
+  case x::y::p => 
+    if (legal_moves_urban(dim, p, y).contains(x)) correct_urban(dim)(y::p) else false
+}
+
+def correct_closed_urban(dim: Int)(p: Path) =
+  correct_urban(6)(p) &&  moves_urban(p.head).contains(p.last)
+
+
+val tsc_urban = first_closed_tour_heuristics(6, List((3, 3))).get
+assert(correct_closed_urban(6)(tsc_urban) == true)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/marking3/knight2_test8.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,32 @@
+import CW8b._
+
+//type Pos = (Int, Int)
+//type Path = List[Pos]
+
+def add_pair_urban(x: Pos)(y: Pos): Pos = 
+  (x._1 + y._1, x._2 + y._2)
+
+def is_legal_urban(dim: Int, path: Path)(x: Pos): Boolean = 
+  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
+
+def moves_urban(x: Pos): List[Pos] = 
+  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
+       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair_urban(x))
+
+def legal_moves_urban(dim: Int, path: Path, x: Pos): List[Pos] = 
+  moves_urban(x).filter(is_legal_urban(dim, path))
+
+def correct_urban(dim: Int)(p: Path): Boolean = p match {
+  case Nil => true
+  case x::Nil => true
+  case x::y::p => 
+    if (legal_moves_urban(dim, p, y).contains(x)) correct_urban(dim)(y::p) else false
+}
+
+
+val ts8_urban = first_tour_heuristics(8, List((0,0))).get
+assert(correct_urban(8)(ts8_urban) == true)
+
+val ts30_urban = first_tour_heuristics(30, List((0,0))).get
+assert(correct_urban(30)(ts30_urban) == true)
+
--- a/marking3/knight3_test.sh	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,178 +0,0 @@
-#!/bin/bash
-
-# to make the script fail safely
-set -euo pipefail
-
-
-out=${1:-output}
-
-echo "" > $out
-
-echo "Below is the feedback and provisional marks for your submission" >> $out
-echo "for assignment 8 Advanced Part 2.  Please note all marks are provisional until" >> $out
-echo "ratified by the assessment board -- this is not an official" >> $out
-echo "results transcript." >> $out
-echo "" >> $out
-
-# marks for CW8 part 2
-marks=$(( 0 ))
-
-# compilation tests
-
-function scala_compile {
-    (ulimit -t 30; JAVA_OPTS="-Xmx1g" scala -nc "$1" 2> /dev/null 1> /dev/null)
-}
-
-# functional tests
-
-function scala_assert {
-    (ulimit -t 30; JAVA_OPTS="-Xmx1g" scala -nc -i "$1" "$2" -e "" 2> /dev/null 1> /dev/null)
-}
-
-function scala_assert_long {
-  (ulimit -t 60; JAVA_OPTS="-Xmx1g" scala -nc -i "$1" "$2" -e "" 2> /dev/null 1> /dev/null)
-}
-
-function scala_assert_elong {
-  (ulimit -t 90; JAVA_OPTS="-Xmx1g" scala -nc -i "$1" "$2" -e "" 2> /dev/null 1> /dev/null)
-}
-
-# purity test
-
-function scala_vars {
-   (egrep '\bvar\b|\breturn\b|\.par|ListBuffer|mutable|new Array' "$1" 2> /dev/null 1> /dev/null)
-}
-
-
-# knights2: purity test
-#
-echo "knight2.scala does not contain vars, returns, Arrays, ListBuffers etc?" | tee -a $out
-
-
-if (scala_vars knight2.scala)
-then
-  echo "  --> test failed" | tee -a $out
-  tsts0=$(( 1 ))
-else
-  echo "  --> success" | tee -a $out
-  tsts0=$(( 0 )) 
-fi
-
-
-# compilation test
-if  [ $tsts0 -eq 0 ]
-then    
-  echo "knight2.scala runs?" | tee -a $out
-
-  if (scala_compile knight2.scala)
-  then
-    echo "  --> success" | tee -a $out
-    tsts1=$(( 0 ))
-  else
-    echo "  --> scala knight2.scala did not run successfully" | tee -a $out
-    tsts1=$(( 1 )) 
-  fi
-else
-  tsts1=$(( 1 ))     
-fi
-
-# ordered move test
-
-if [ $tsts1 -eq 0 ]
-then
-  echo " ordered_moves(8, List((3,4), (3,2)), (1,3)) == List((0,1), (0,5), (2,1), (2,5))" | tee -a $out
-  echo " ordered_moves(8, List((4,0)), (0,0)) == List((2,1), (1,2))" | tee -a $out
-  echo " ordered_moves(8, List((0,4)), (0,0)) == List((1,2), (2,1))" | tee -a $out
-  
-  if (scala_assert "knight2.scala" "knight_test6.scala")
-  then
-      echo "  --> success" | tee -a $out
-      marks=$(( marks + 1 ))
-  else
-    echo "  --> test failed" | tee -a $out
-  fi
-fi
-
-
-# first-closed-tour test
-
-if [ $tsts1 -eq 0 ]
-then
-  echo " first_closed_tour_heuristic(6, List((3,3))) found and correct?" | tee -a $out
-  
-  if (scala_assert "knight2.scala" "knight_test7.scala")
-  then
-      echo "  --> success" | tee -a $out
-      marks=$(( marks + 1 ))
-  else
-      echo "  --> test failed" | tee -a $out
-  fi
-fi
-
-
-
-if [ $tsts1 -eq 0 ]
-then
-  echo " first_tour_heuristic(8, List((0,0))) found and correct?" | tee -a $out
-  echo " first_tour_heuristic(40, List((0,0))) found and correct?" | tee -a $out
-  
-  if (scala_assert "knight2.scala" "knight_test8.scala")
-  then
-      echo "  --> success" | tee -a $out
-      marks=$(( marks + 1 ))
-  else
-    echo "  --> test failed" | tee -a $out
-  fi
-fi
-
-
-
-# knights3: purity test
-#
-echo -e "knight3.scala does not contain vars, returns, Arrays, ListBuffers etc?" | tee -a $out
-
-
-if (scala_vars knight3.scala)
-then
-  echo "  --> test failed" | tee -a $out
-  tsts0=$(( 1 ))
-else
-  echo "  --> success" | tee -a $out
-  tsts0=$(( 0 )) 
-fi
-
-# compilation test
-if  [ $tsts0 -eq 0 ]
-then    
-  echo "knight3.scala runs?" | tee -a $out
-
-  if (scala_compile knight3.scala)
-  then
-    echo "  --> success" | tee -a $out
-    tsts1=$(( 0 ))
-  else
-    echo -e "  --> test failed" | tee -a $out  
-    tsts1=$(( 1 )) 
-  fi
-else
-  tsts1=$(( 1 ))     
-fi
-
-
-if [ $tsts1 -eq 0 ]
-then
-  echo -e " tour_on_mega_board(70, List((0,0))) found and correct?" | tee -a $out
-  
-  if (scala_assert_long "knight3.scala" "knight_test9.scala")
-  then
-      echo -e "  --> success" | tee -a $out
-      marks=$(( marks + 1 ))
-  else
-      echo -e "  --> test  failed" | tee -a $out 
-  fi
-fi
-
-
-## final marks
-echo "Overall mark for CW 8, Part 2" | tee -a $out
-echo "$marks" | tee -a $out
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/marking3/knight3_test9.scala	Tue Feb 04 14:15:42 2020 +0000
@@ -0,0 +1,29 @@
+import CW8c._
+
+//type Pos = (Int, Int)
+//type Path = List[Pos]
+
+def add_pair_urban(x: Pos)(y: Pos): Pos = 
+  (x._1 + y._1, x._2 + y._2)
+
+def is_legal_urban(dim: Int, path: Path)(x: Pos): Boolean = 
+  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
+
+def moves_urban(x: Pos): List[Pos] = 
+  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
+       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair_urban(x))
+
+def legal_moves_urban(dim: Int, path: Path, x: Pos): List[Pos] = 
+  moves_urban(x).filter(is_legal_urban(dim, path))
+
+def correct_urban(dim: Int)(p: Path): Boolean = p match {
+  case Nil => true
+  case x::Nil => true
+  case x::y::p => 
+    if (legal_moves_urban(dim, p, y).contains(x)) correct_urban(dim)(y::p) else false
+}
+
+
+val ts70_urban = tour_on_mega_board(70, List((0,0))).get
+assert(correct_urban(70)(ts70_urban) == true)
+
--- a/marking3/knight_test6.scala	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-
-
-assert(ordered_moves(8, List((3,4), (3,2)), (1, 3)) == List((0,1), (0,5), (2,1), (2,5)))
-assert(ordered_moves(8, List((4,0)), (0,0)) == List((2,1), (1,2)))
-assert(ordered_moves(8, List((0,4)), (0,0)) == List((1,2), (2,1)))
-
-
-
-/*
-import scala.concurrent._
-import scala.concurrent.duration._
-import ExecutionContext.Implicits.global
-import scala.language.postfixOps 
-
-lazy val f = Future {
-}
-
-Await.result(f, 120 second)
-*/
--- a/marking3/knight_test7.scala	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-
-//type Pos = (Int, Int)
-//type Path = List[Pos]
-
-def add_pair_urban(x: Pos)(y: Pos): Pos = 
-  (x._1 + y._1, x._2 + y._2)
-
-def is_legal_urban(dim: Int, path: Path)(x: Pos): Boolean = 
-  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
-
-def moves_urban(x: Pos): List[Pos] = 
-  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
-       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair_urban(x))
-
-def legal_moves_urban(dim: Int, path: Path, x: Pos): List[Pos] = 
-  moves_urban(x).filter(is_legal_urban(dim, path))
-
-def correct_urban(dim: Int)(p: Path): Boolean = p match {
-  case Nil => true
-  case x::Nil => true
-  case x::y::p => 
-    if (legal_moves_urban(dim, p, y).contains(x)) correct_urban(dim)(y::p) else false
-}
-
-def correct_closed_urban(dim: Int)(p: Path) =
-  correct_urban(6)(p) &&  moves_urban(p.head).contains(p.last)
-
-
-val tsc = first_closed_tour_heuristic(6, List((3, 3))).get
-assert(correct_closed_urban(6)(tsc) == true)
-
--- a/marking3/knight_test8.scala	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-
-//type Pos = (Int, Int)
-//type Path = List[Pos]
-
-def add_pair_urban(x: Pos)(y: Pos): Pos = 
-  (x._1 + y._1, x._2 + y._2)
-
-def is_legal_urban(dim: Int, path: Path)(x: Pos): Boolean = 
-  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
-
-def moves_urban(x: Pos): List[Pos] = 
-  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
-       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair_urban(x))
-
-def legal_moves_urban(dim: Int, path: Path, x: Pos): List[Pos] = 
-  moves_urban(x).filter(is_legal_urban(dim, path))
-
-def correct_urban(dim: Int)(p: Path): Boolean = p match {
-  case Nil => true
-  case x::Nil => true
-  case x::y::p => 
-    if (legal_moves_urban(dim, p, y).contains(x)) correct_urban(dim)(y::p) else false
-}
-
-
-val ts8 = first_tour_heuristic(8, List((0,0))).get
-assert(correct_urban(8)(ts8) == true)
-
-val ts30 = first_tour_heuristic(30, List((0,0))).get
-assert(correct_urban(30)(ts30) == true)
-
--- a/marking3/knight_test9.scala	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-
-//type Pos = (Int, Int)
-//type Path = List[Pos]
-
-def add_pair_urban(x: Pos)(y: Pos): Pos = 
-  (x._1 + y._1, x._2 + y._2)
-
-def is_legal_urban(dim: Int, path: Path)(x: Pos): Boolean = 
-  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
-
-def moves_urban(x: Pos): List[Pos] = 
-  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
-       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair_urban(x))
-
-def legal_moves_urban(dim: Int, path: Path, x: Pos): List[Pos] = 
-  moves_urban(x).filter(is_legal_urban(dim, path))
-
-def correct_urban(dim: Int)(p: Path): Boolean = p match {
-  case Nil => true
-  case x::Nil => true
-  case x::y::p => 
-    if (legal_moves_urban(dim, p, y).contains(x)) correct_urban(dim)(y::p) else false
-}
-
-
-val ts70 = tour_on_mega_board(70, List((0,0))).get
-assert(correct_urban(70)(ts70) == true)
-
--- a/marking3/marking2/knight1.scala	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-// Part 1 about finding and counting Knight's tours
-//==================================================
-
-object CW7a {
-
-type Pos = (Int, Int)    // a position on a chessboard 
-type Path = List[Pos]    // a path...a list of positions
-
-def print_board(dim: Int, path: Path): Unit = {
-  println
-  for (i <- 0 until dim) {
-    for (j <- 0 until dim) {
-      print(f"${path.reverse.indexOf((j, dim - i - 1))}%3.0f ")
-    }
-    println
-  } 
-}
-
-def add_pair(x: Pos)(y: Pos): Pos = 
-  (x._1 + y._1, x._2 + y._2)
-
-def is_legal(dim: Int, path: Path)(x: Pos): Boolean = 
-  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
-
-assert(is_legal(8, Nil)((3,4)) == true)
-assert(is_legal(8, List((4,1), (1,0)))((4,1)) == false)
-assert(is_legal(2, Nil)((0,0)) == true)
-
-
-
-def moves(x: Pos): List[Pos] = 
-  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
-       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair(x))
-
-def legal_moves(dim: Int, path: Path, x: Pos): List[Pos] = 
-  moves(x).filter(is_legal(dim, path))
-
-def count_tours(dim: Int, path: Path): Int = {
-  if (path.length == dim * dim) 1
-  else 
-    (for (x <- legal_moves(dim, path, path.head)) yield count_tours(dim, x::path)).sum
-}
-
-def enum_tours(dim: Int, path: Path): List[Path] = {
-  if (path.length == dim * dim) List(path)
-  else 
-    (for (x <- legal_moves(dim, path, path.head)) yield enum_tours(dim, x::path)).flatten
-}
-
-def count_all_tours(dim: Int) = {
-  for (i <- (0 until dim).toList; 
-       j <- (0 until dim).toList) yield count_tours(dim, List((i, j)))
-}
-
-def enum_all_tours(dim: Int): List[Path] = {
-  (for (i <- (0 until dim).toList; 
-        j <- (0 until dim).toList) yield enum_tours(dim, List((i, j)))).flatten
-}
-
-/*
-for (dim <- 1 to 5) {
-  println(s"${dim} x ${dim} " + count_tours(dim, List((0, 0))))
-}
-
-for (dim <- 1 to 5) {
-  println(s"${dim} x ${dim} " + count_all_tours(dim))
-}
-
-for (dim <- 1 to 5) {
-  val ts = enum_tours(dim, List((0, 0)))
-  println(s"${dim} x ${dim} ")   
-  if (ts != Nil) {
-    print_board(dim, ts.head)
-    println(ts.head)
-  }
-}
-*/ 
-
-}
--- a/marking3/marking2/knight1_test.sh	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,206 +0,0 @@
-#!/bin/bash
-
-# to make the script fail safely
-set -euo pipefail
-
-out=${1:-output}
-
-echo "" > $out
-
-echo "Below is the feedback and provisional marks for your submission" >> $out
-echo "for assignment 7 Part 1.  Please note all marks are provisional until" >> $out
-echo "ratified by the assessment board -- this is not an official" >> $out
-echo "results transcript." >> $out
-echo "" >> $out
-
-echo "Below is the feedback for your submission of CW 7, Part 1." >> $out
-echo "" >> $out
-
-
-# marks for CW7 part 1
-marks=$(( 0 ))
-
-
-# compilation tests (used to be 30 secs)
-
-function scala_compile {
-  (ulimit -t 360; JAVA_OPTS="-Xmx1g" scala "$1" 2> /dev/null 1> /dev/null) 
-}
-
-# functional tests
-
-function scala_assert {
-  (ulimit -t 360; JAVA_OPTS="-Xmx1g" scala -i "$1" "$2" -e "" 2> /dev/null 1> /dev/null)
-}
-
-# purity test
-
-function scala_vars {
-   (egrep '\bvar\b|\breturn\b|\.par|ListBuffer|mutable|new Array' "$1" 2> /dev/null 1> /dev/null)
-}
-
-
-# knights1: purity test
-
-echo "knight1.scala does not contain vars, returns, Arrays, ListBuffers etc?" | tee -a $out
-
-if (scala_vars knight1.scala)
-then
-  echo "  --> fail" | tee -a $out
-  tsts0=$(( 1 ))
-else
-  echo "  --> success" | tee -a $out
-  tsts0=$(( 0 )) 
-fi
-
-
-# compilation test
-
-if [ $tsts0 -eq 0 ]
-then    
-  echo "knight1.scala runs?" | tee -a $out
-
-  if (scala_compile knight1.scala)
-  then
-    echo "  --> success " | tee -a $out
-    tsts1=$(( 0 ))
-  else
-    echo "  --> scala did not run knight1.scala" | tee -a $out
-    tsts1=$(( 1 )) 
-  fi
-else
-  tsts1=$(( 1 ))   
-fi
-
-### knight1a test
-
-if [ $tsts1 -eq 0 ]
-then
-    echo " is_legal(8, Nil)(3, 4) == true " | tee -a $out
-    echo " is_legal(8, List((4, 1), (1, 0)))(4, 1) == false " | tee -a $out
-    echo " is_legal(2, Nil)(0, 0) == true" | tee -a $out                          
-
-    if (scala_assert "knight1.scala" "knight1a_test.scala")
-    then
-        echo "  --> success" | tee -a $out
-	marks=$(( marks + 1 ))
-    else
-        echo "  --> test failed" | tee -a $out
-    fi
-fi
-
-### knight1b test
-
-if [ $tsts1 -eq 0 ]
-then
-  echo " legal_moves(8, Nil, (2,2)) == List((3,4), (4,3), (4,1), (3,0), (1,0), (0,1), (0,3), (1,4))" | tee -a $out
-  echo " legal_moves(8, Nil, (7,7)) == List((6,5), (5,6))" | tee -a $out
-  echo " legal_moves(8, List((4,1), (1,0)), (2,2)) == List((3,4), (4,3), (3,0), (0,1), (0,3), (1,4))" | tee -a $out
-  echo " legal_moves(8, List((6,6)), (7,7)) == List((6,5), (5,6))" | tee -a $out
-  echo " legal_moves(1, Nil, (0,0)) == Nil" | tee -a $out
-  echo " legal_moves(2, Nil, (0,0)) == Nil" | tee -a $out
-  echo " legal_moves(3, Nil, (0,0)) == List((1,2), (2,1))" | tee -a $out
-  
-  if (scala_assert "knight1.scala" "knight1b_test.scala")
-  then
-     echo "  --> success" | tee -a $out
-     marks=$(( marks + 1 ))
-  else
-    echo "  --> test failed" | tee -a $out
-  fi
-fi
-
-
-### knight1c test
-
-if [ $tsts1 -eq 0 ]
-then
-  echo " all_tours from every position on the board" | tee -a $out
-  echo " dim = 1: 1" | tee -a $out
-  echo "       2: 0,0,0,0" >>  $out
-  echo "       3: 0,0,0,0,0,0,0,0,0" >>  $out
-  echo "       4: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" | tee -a $out
-  echo "       5: 304,0,56,0,304,0,56,0,56,0,56,0,64,0,56,0,56,0,56,0,304,0,56,0,304" | tee -a $out
-  echo " enum_tours(5, List((0,2)) ) => 56 tours? and all correct?" | tee -a $out
-  
-  if (scala_assert "knight1.scala" "knight1c_test.scala") 
-  then
-     echo "  --> success" | tee -a $out
-     marks=$(( marks + 2 ))
-  else
-    echo "  --> test failed" | tee -a $out
-  fi
-fi
-
-
-# knights2: var test
-
-echo "knight2.scala does not contain vars, returns, Arrays, ListBuffers etc?" | tee -a $out
-
-if (scala_vars knight2.scala)
-then
-  echo "  --> fail" | tee -a $out
-  tsts0=$(( 1 ))
-else
-  echo "  --> success" | tee -a $out
-  tsts0=$(( 0 )) 
-fi
-
-
-# compilation test
-if  [ $tsts0 -eq 0 ]
-then    
-  echo "knight2.scala runs?" | tee -a $out
-
-  if (scala_compile knight2.scala)
-  then
-    echo "  --> success" | tee -a $out
-    tsts1=$(( 0 ))
-  else
-    echo "  --> scala did not run knight2.scala" | tee -a $out
-    tsts1=$(( 1 )) 
-  fi
-else
-  tsts1=$(( 1 ))     
-fi
-
-### knight2a test
-
-if [ $tsts1 -eq 0 ]
-then
-  echo " val f = (x:(Int, Int)) => if (x._1 > 3) Some(List(x)) else None " | tee -a $out
-  echo "   first(List((1,0),(2,0),(3,0),(4,0)), f) == Some(List((4,0)))" | tee -a $out
-  echo "   first(List((1,0),(2,0),(3,0)), f) == None" | tee -a $out
-
-  if (scala_assert "knight2.scala" "knight2a_test.scala") 
-  then
-    echo "  --> success" | tee -a $out
-    marks=$(( marks + 1 ))
-  else
-    echo "  --> test failed" | tee -a $out
-  fi
-fi
-
-
-### knight2b test
-
-if [ $tsts1 -eq 0 ]
-then
-  echo " is first_tour(8, List((0, 0))) ok? " | tee -a $out
-  echo " is first_tour(4, List((0, 0))) == None " | tee -a $out
-
-  if (scala_assert "knight2.scala" "knight2b_test.scala") 
-  then
-     echo "  --> success" | tee -a $out
-     marks=$(( marks + 2 ))
-  else
-    echo "  --> test failed" | tee -a $out
-  fi
-fi
-
-
-## final marks
-echo "Overall mark for Part 1" | tee -a $out
-echo "$marks" | tee -a $out
-
-
--- a/marking3/marking2/knight1a_test.scala	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-
-assert(CW7a.is_legal(8, Nil)(3, 4) == true)
-assert(CW7a.is_legal(8, List((4, 1), (1, 0)))(4, 1) == false)
-assert(CW7a.is_legal(2, Nil)(0, 0) == true)
-
--- a/marking3/marking2/knight1b_test.scala	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-
-assert(CW7a.legal_moves(8, Nil, (2,2)) == 
-             List((3,4), (4,3), (4,1), (3,0), (1,0), (0,1), (0,3), (1,4)))
-assert(CW7a.legal_moves(8, Nil, (7,7)) == List((6,5), (5,6)))
-assert(CW7a.legal_moves(8, List((4,1), (1,0)), (2,2)) == 
-       List((3,4), (4,3), (3,0), (0,1), (0,3), (1,4)))
-assert(CW7a.legal_moves(8, List((6,6)), (7,7)) == List((6,5), (5,6)))
-assert(CW7a.legal_moves(1, Nil, (0,0)) == List())
-assert(CW7a.legal_moves(2, Nil, (0,0)) == List())
-assert(CW7a.legal_moves(3, Nil, (0,0)) == List((1,2), (2,1)))
-
--- a/marking3/marking2/knight1c_test.scala	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-
-//import scala.concurrent._
-//import scala.concurrent.duration._
-//import ExecutionContext.Implicits.global
-//import scala.language.postfixOps 
-
-type Pos = (Int, Int)    // a position on a chessboard 
-type Path = List[Pos]    // a path...a list of positions
-
-def count_all_tours_urban(dim: Int) = {
-  for (i <- (0 until dim).toList; 
-       j <- (0 until dim).toList) yield CW7a.count_tours(dim, List((i, j)))
-}
-
-def add_pair_urban(x: Pos)(y: Pos): Pos = 
-  (x._1 + y._1, x._2 + y._2)
-
-def is_legal_urban(dim: Int, path: Path)(x: Pos): Boolean = 
-  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
-
-def moves_urban(x: Pos): List[Pos] = 
-  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
-       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair_urban(x))
-
-def legal_moves_urban(dim: Int, path: Path, x: Pos): List[Pos] = 
-  moves_urban(x).filter(is_legal_urban(dim, path))
-
-def correct_urban(dim: Int)(p: Path): Boolean = p match {
-  case Nil => true
-  case x::Nil => true
-  case x::y::p => if (legal_moves_urban(dim, p, y).contains(x)) correct_urban(dim)(y::p) else false
-}
-
-
-//lazy val f = Future {
-  assert(count_all_tours_urban(1) == List(1))
-  assert(count_all_tours_urban(2) == List(0, 0, 0, 0))
-  assert(count_all_tours_urban(3) == List(0, 0, 0, 0, 0, 0, 0, 0, 0))
-  assert(count_all_tours_urban(4) == List(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
-  assert(count_all_tours_urban(5) == List(304, 0, 56, 0, 304, 0, 56, 0, 56, 0, 56, 0, 64, 0, 56, 0, 56, 0, 56, 0, 304, 0, 56, 0, 304))
-
-  val ts = CW7a.enum_tours(5, List((0, 2)))
-  assert(ts.map(correct_urban(5)).forall(_ == true) == true)
-  assert(ts.length == 56)  
-//}
-
-//Await.result(f, 360 second)
--- a/marking3/marking2/knight2.scala	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-// Part 2 about finding a single tour for a board
-//================================================
-
-object CW7b {
-
-type Pos = (Int, Int)    // a position on a chessboard 
-type Path = List[Pos]    // a path...a list of positions
-
-def print_board(dim: Int, path: Path) : Unit = {
-  println
-  for (i <- 0 until dim) {
-    for (j <- 0 until dim) {
-      print(f"${path.reverse.indexOf((i, j))}%3.0f ")
-    }
-    println
-  } 
-}
-
-def add_pair(x: Pos)(y: Pos) : Pos = 
-  (x._1 + y._1, x._2 + y._2)
-
-def is_legal(dim: Int, path: Path)(x: Pos) : Boolean = 
-  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
-
-def moves(x: Pos) : List[Pos] = 
-  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
-       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair(x))
-
-def legal_moves(dim: Int, path: Path, x: Pos) : List[Pos] = 
-  moves(x).filter(is_legal(dim, path))
-
-
-def first(xs: List[Pos], f: Pos => Option[Path]) : Option[Path] = xs match {
-  case Nil => None
-  case x::xs => {
-    val result = f(x)
-    if (result.isDefined) result else first(xs, f)
-  }
-}
-
-//first(List((1, 0),(2, 0),(3, 0),(4, 0)), (x => if (x._1 > 3) Some(List(x)) else None))
-//first(List((1, 0),(2, 0),(3, 0)), (x => if (x._1 > 3) Some(List(x)) else None))
-
-def first_tour(dim: Int, path: Path) : Option[Path] = {
-  if (path.length == dim * dim) Some(path)
-  else
-    first(legal_moves(dim, path, path.head), (x: Pos) => first_tour(dim, x::path))
-}
-
-/* 
-val ts1 = first_tour(8, List((0, 0))).get
-  assert(correct_urban(8)(ts1) == true)
-
-val ts2 = first_tour(4, List((0, 0)))
-assert(ts2 == None)  
-
-print_board(8, first_tour(8, List((0, 0))).get)
-*/
-
-}
-
--- a/marking3/marking2/knight2a_test.scala	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-
-val f = (x:(Int, Int)) => if (x._1 > 3) Some(List(x)) else None
-
-assert(CW7b.first(List((1,0),(2,0),(3,0),(4,0)), f) == Some(List((4,0))))
-assert(CW7b.first(List((1,0),(2,0),(3,0)), f) == None)
--- a/marking3/marking2/knight2b_test.scala	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-
-//import scala.concurrent._
-//import scala.concurrent.duration._
-//import ExecutionContext.Implicits.global
-//import scala.language.postfixOps 
-
-type Pos = (Int, Int)    // a position on a chessboard 
-type Path = List[Pos]    // a path...a list of positions
-
-def add_pair_urban(x: Pos)(y: Pos): Pos = 
-  (x._1 + y._1, x._2 + y._2)
-
-def is_legal_urban(dim: Int, path: Path)(x: Pos): Boolean = 
-  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
-
-def moves_urban(x: Pos): List[Pos] = 
-  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
-       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair_urban(x))
-
-def legal_moves_urban(dim: Int, path: Path, x: Pos): List[Pos] = 
-  moves_urban(x).filter(is_legal_urban(dim, path))
-
-def correct_urban(dim: Int)(p: Path): Boolean = p match {
-  case Nil => true
-  case x::Nil => true
-  case x::y::p => 
-    if (legal_moves_urban(dim, p, y).contains(x)) correct_urban(dim)(y::p) else false
-}
-
-
-//lazy val f = Future {
-
-  val ts1 = CW7b.first_tour(8, List((0, 0))).get
-  assert(correct_urban(8)(ts1) == true)
-
-  val ts2 = CW7b.first_tour(4, List((0, 0)))
-  assert(ts2 == None)  
-//}
-
-//Await.result(f, 300 second)
--- a/marking3/marking2/knight3.scala	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-// Part 3 about finding a single tour using the Warnsdorf Rule
-//=============================================================
-
-object CW7c {
-
-type Pos = (Int, Int)
-type Path = List[Pos]
-
-def print_board(dim: Int, path: Path): Unit = {
-  println
-  for (i <- 0 until dim) {
-    for (j <- 0 until dim) {
-      print(f"${path.reverse.indexOf((i, j))}%3.0f ")
-    }
-    println
-  } 
-}
-
-def add_pair(x: Pos)(y: Pos): Pos = 
-  (x._1 + y._1, x._2 + y._2)
-
-def is_legal(dim: Int, path: Path)(x: Pos): Boolean = 
-  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
-
-def moves(x: Pos): List[Pos] = 
-  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
-       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair(x))
-
-def legal_moves(dim: Int, path: Path, x: Pos): List[Pos] = 
-  moves(x).filter(is_legal(dim, path))
-
-def ordered_moves(dim: Int, path: Path, x: Pos): List[Pos] = 
-  legal_moves(dim, path, x).sortBy((x) => legal_moves(dim, path, x).length)
-
-
-import scala.annotation.tailrec
-
-@tailrec
-def first(xs: List[Pos], f: Pos => Option[Path]): Option[Path] = xs match {
-  case Nil => None
-  case x::xs => {
-    val result = f(x)
-    if (result.isDefined) result else first(xs, f)
-  }
-}
-
-
-def first_closed_tour_heuristic(dim: Int, path: Path): Option[Path] = {
-  if (path.length == dim * dim && moves(path.head).contains(path.last)) Some(path)
-  else
-    first(ordered_moves(dim, path, path.head), (x: Pos) => first_closed_tour_heuristic(dim, x::path))
-}
-
-/*
-for (dim <- 1 to 6) {
-  val t = first_closed_tour_heuristic(dim, List((dim / 2, dim / 2)))
-  println(s"${dim} x ${dim} closed: " + (if (t == None) "" else { print_board(dim, t.get) ; "" }))
-}*/
-
-
-def first_tour_heuristic(dim: Int, path: Path): Option[Path] = {
-
-  @tailrec
-  def aux(dim: Int, path: Path, moves: List[Pos]): Option[Path] =  
-  if (path.length == dim * dim) Some(path)
-  else
-    moves match {
-      case Nil => None
-      case x::xs => {
-        val r = first_tour_heuristic(dim, x::path)
-        if (r.isDefined) r else aux(dim, path, xs)
-    }
-  }    
- 
-  aux(dim, path, ordered_moves(dim, path, path.head)) 
-}
-
-/*
-def first_tour_heuristic(dim: Int, path: Path): Option[Path] = {
-  if (path.length == dim * dim) Some(path)
-  else
-    first(ordered_moves(dim, path, path.head), (x: Pos) => first_tour_heuristic(dim, x::path))
-}
-*/
-
-/*
-for (dim <- 1 to 50) {
-  val t = first_tour_heuristic(dim, List((dim / 2, dim / 2)))
-  println(s"${dim} x ${dim}: " + (if (t == None) "" else { print_board(dim, t.get) ; "" }))
-}
-*/
-
-}
-
-
-//CW7c.first_tour_heuristic(50, List((0,0))).get
--- a/marking3/marking2/knight3_test.sh	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,124 +0,0 @@
-#!/bin/bash
-
-# to make the script fail safely
-set -euo pipefail
-
-
-out=${1:-output}
-
-echo "" > $out
-
-echo "Below is the feedback and provisional marks for your submission" >> $out
-echo "for assignment 7 Part 2.  Please note all marks are provisional until" >> $out
-echo "ratified by the assessment board -- this is not an official" >> $out
-echo "results transcript." >> $out
-echo "" >> $out
-
-# marks for CW7 part 2
-marks=$(( 0 ))
-
-# compilation tests
-
-function scala_compile {
-    (ulimit -t 360; JAVA_OPTS="-Xmx1g" scala "$1" 2> /dev/null 1> /dev/null)
-}
-
-# functional tests
-
-function scala_assert {
-    (ulimit -t 360; JAVA_OPTS="-Xmx4g -Xss200m" scala -i "$1" "$2" -e "" 2> /dev/null 1> /dev/null)
-}
-
-
-# purity test
-
-function scala_vars {
-   (egrep '\bvar\b|\breturn\b|\.par|ListBuffer|mutable|new Array' "$1" 2> /dev/null 1> /dev/null)
-}
-
-
-# knights3: purity test
-#
-echo "knight3.scala does not contain vars, returns, Arrays, ListBuffers etc?" | tee -a $out
-
-
-if (scala_vars knight3.scala)
-then
-  echo "  --> test failed" | tee -a $out
-  tsts0=$(( 1 ))
-else
-  echo "  --> success" | tee -a $out
-  tsts0=$(( 0 )) 
-fi
-
-
-# compilation test
-if  [ $tsts0 -eq 0 ]
-then    
-  echo "knight3.scala runs?" | tee -a $out
-
-  if (scala_compile knight3.scala)
-  then
-    echo "  --> success" | tee -a $out
-    tsts1=$(( 0 ))
-  else
-    echo "  --> scala knight3.scala did not run successfully" | tee -a $out
-    tsts1=$(( 1 )) 
-  fi
-else
-  tsts1=$(( 1 ))     
-fi
-
-# ordered move test
-
-if [ $tsts1 -eq 0 ]
-then
-  echo " ordered_moves(8, List((3,4), (3,2)), (1,3)) == List((0,1), (0,5), (2,1), (2,5))" | tee -a $out
-  echo " ordered_moves(8, List((4,0)), (0,0)) == List((2,1), (1,2))" | tee -a $out
-  echo " ordered_moves(8, List((0,4)), (0,0)) == List((1,2), (2,1))" | tee -a $out
-  
-  if (scala_assert "knight3.scala" "knight3a_test.scala")
-  then
-      echo "  --> success" | tee -a $out
-      marks=$(( marks + 1 ))
-  else
-    echo "  --> test failed" | tee -a $out
-  fi
-fi
-
-
-# first-closed-tour test
-
-if [ $tsts1 -eq 0 ]
-then
-  echo " first_closed_tour_heuristic(6, List((3,3))) found and correct?" | tee -a $out
-  
-  if (scala_assert "knight3.scala" "knight3b_test.scala")
-  then
-      echo "  --> success" | tee -a $out
-      marks=$(( marks + 1 ))
-  else
-      echo "  --> test failed" | tee -a $out
-  fi
-fi
-
-
-
-if [ $tsts1 -eq 0 ]
-then
-  echo " first_tour_heuristic(8, List((0,0))) found and correct?" | tee -a $out
-  echo " first_tour_heuristic(40, List((0,0))) found and correct?" | tee -a $out
-  
-  if (scala_assert "knight3.scala" "knight3c_test.scala")
-  then
-      echo "  --> success" | tee -a $out
-      marks=$(( marks + 1 ))
-  else
-    echo "  --> test failed" | tee -a $out
-  fi
-fi
-
-
-## final marks
-echo "Overall mark for CW 7, Part 2" | tee -a $out
-echo "$marks" | tee -a $out
--- a/marking3/marking2/knight3a_test.scala	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-
-assert(CW7c.ordered_moves(8, List((3,4), (3,2)), (1,3)) == List((0,1), (0,5), (2,1), (2,5)))
-assert(CW7c.ordered_moves(8, List((4,0)), (0,0)) == List((2,1), (1,2)))
-assert(CW7c.ordered_moves(8, List((0,4)), (0,0)) == List((1,2), (2,1)))
-
--- a/marking3/marking2/knight3b_test.scala	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-
-//import scala.concurrent._
-//import scala.concurrent.duration._
-//import ExecutionContext.Implicits.global
-//import scala.language.postfixOps 
-
-type Pos = (Int, Int)
-type Path = List[Pos]
-
-def add_pair_urban(x: Pos)(y: Pos): Pos = 
-  (x._1 + y._1, x._2 + y._2)
-
-def is_legal_urban(dim: Int, path: Path)(x: Pos): Boolean = 
-  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
-
-def moves_urban(x: Pos): List[Pos] = 
-  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
-       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair_urban(x))
-
-def legal_moves_urban(dim: Int, path: Path, x: Pos): List[Pos] = 
-  moves_urban(x).filter(is_legal_urban(dim, path))
-
-def correct_urban(dim: Int)(p: Path): Boolean = p match {
-  case Nil => true
-  case x::Nil => true
-  case x::y::p => 
-    if (legal_moves_urban(dim, p, y).contains(x)) correct_urban(dim)(y::p) else false
-}
-
-def correct_closed_urban(dim: Int)(p: Path) =
-  correct_urban(6)(p) &&  moves_urban(p.head).contains(p.last)
-
-//lazy val f = Future {
-
-  val tsc = CW7c.first_closed_tour_heuristic(6, List((3, 3))).get
-  assert(correct_closed_urban(6)(tsc) == true)
-
-//}
-
-//Await.result(f, 300 second)
--- a/marking3/marking2/knight3c_test.scala	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-
-//import scala.concurrent._
-//import scala.concurrent.duration._
-//import ExecutionContext.Implicits.global
-//import scala.language.postfixOps 
-
-println(Runtime.getRuntime.maxMemory)
-
-type Pos = (Int, Int)
-type Path = List[Pos]
-
-def add_pair_urban(x: Pos)(y: Pos): Pos = 
-  (x._1 + y._1, x._2 + y._2)
-
-def is_legal_urban(dim: Int, path: Path)(x: Pos): Boolean = 
-  0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x)
-
-def moves_urban(x: Pos): List[Pos] = 
-  List(( 1,  2),( 2,  1),( 2, -1),( 1, -2),
-       (-1, -2),(-2, -1),(-2,  1),(-1,  2)).map(add_pair_urban(x))
-
-def legal_moves_urban(dim: Int, path: Path, x: Pos): List[Pos] = 
-  moves_urban(x).filter(is_legal_urban(dim, path))
-
-def correct_urban(dim: Int)(p: Path): Boolean = p match {
-  case Nil => true
-  case x::Nil => true
-  case x::y::p => 
-    if (legal_moves_urban(dim, p, y).contains(x)) correct_urban(dim)(y::p) else false
-}
-
-// !!!!!!! the futures need to be removed
-//lazy val f1 = Future {
-
-  val ts8 = CW7c.first_tour_heuristic(8, List((0,0))).get
-  assert(correct_urban(8)(ts8) == true)
-
-//}
-
-//Await.result(f1, 360 second)
-
-
-//lazy val f2 = Future {
-
-  val ts40 = CW7c.first_tour_heuristic(40, List((0,0))).get
-  assert(correct_urban(40)(ts40) == true)
-
-//}
-
-//Await.result(f2, 360 second)
--- a/marking3/marking2/mark	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-#!/bin/sh
-###set -e
-
-trap "exit" INT
-
-./collatz_test.sh output1
-./alcohol_test.sh output2
-./drumb_test.sh output3
-
--- a/marking3/marking2/mk	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-#!/bin/sh
-###set -e
-
-trap "exit" INT
-
-files=${1:-assignment20177-*}
-
-for sd in $files; do
-  cd $sd
-  echo $sd
-  touch .
-  cp ../../../marking2/knight1_test.sh .
-  cp ../../../marking2/kinght1a_test.scala .
-  cp ../../../marking2/knight1b_test.scala .
-  cp ../../../marking2/knight1c_test.scala .
-  cp ../../../marking2/knight2a_test.scala .
-  cp ../../../marking2/knight2b_test.scala .
-  ./knight1_test.sh output
-  rm knight1_test.sh
-  rm kinght1a_test.scala
-  rm kinght1b_test.scala
-  rm kinght1c_test.scala 
-  rm kinght2a_test.scala
-  rm kinght2b_test.scala
-  cd ..
-done
-
-
--- a/marking3/marking2/mk-advanced	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-#!/bin/sh
-###set -e
-
-trap "exit" INT
-
-files=${1:-assignment20177-*}
-
-for sd in $files; do
-  cd $sd
-  echo $sd
-  touch .
-  cp ../../../marking2/knight3_test.sh .
-  cp ../../../marking2/knight3a_test.scala .
-  cp ../../../marking2/knight3b_test.scala .
-  cp ../../../marking2/knight3c_test.scala .
-  ./knight3_test.sh output
-  rm knight3_test.sh
-  rm knight3a_test.scala
-  rm knight3b_test.scala
-  rm knight3c_test.scala
-  cd ..
-done
-
-
--- a/marking3/marking2/tails	Tue Feb 04 11:20:31 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-#!/bin/sh
-###set -e
-
-trap "exit" INT
-
-files=${1:-assignment20177-*}
-
-for sd in $files; do
-  cd $sd
-  #echo $sd
-  tail -1 output
-  cd ..
-done
-
-