progs/lecture3.scala
changeset 321 7b0055205ec9
parent 320 cdfb2ce30a3d
child 323 1f8005b4cdf6
equal deleted inserted replaced
320:cdfb2ce30a3d 321:7b0055205ec9
    45 // visits pages potentially more than once
    45 // visits pages potentially more than once
    46 def crawl(url: String, n: Int) : Unit = {
    46 def crawl(url: String, n: Int) : Unit = {
    47   if (n == 0) ()
    47   if (n == 0) ()
    48   else {
    48   else {
    49     println(s"  Visiting: $n $url")
    49     println(s"  Visiting: $n $url")
    50     for (u <- get_all_URLs(get_page(url))) crawl(u, n - 1)
    50     val page = get_page(url)
       
    51     for (u <- get_all_URLs(page)) crawl(u, n - 1)
    51   }
    52   }
    52 }
    53 }
    53 
    54 
    54 // some starting URLs for the crawler
    55 // some starting URLs for the crawler
    55 val startURL = """https://nms.kcl.ac.uk/christian.urban/"""
    56 val startURL = """https://nms.kcl.ac.uk/christian.urban/"""
   119 
   120 
   120 // checks whether a jump tour exists at all
   121 // checks whether a jump tour exists at all
   121 
   122 
   122 def search(xs: List[Int]) : Boolean = xs match {
   123 def search(xs: List[Int]) : Boolean = xs match {
   123   case Nil => true
   124   case Nil => true
   124   case (x::xs) =>
   125   case x::xs =>
   125     if (xs.length < x) true else moves(xs, x).exists(search(_))
   126     if (xs.length < x) true 
       
   127     else moves(xs, x).exists(search(_))
   126 }
   128 }
   127 
   129 
   128 
   130 
   129 search(List(5,3,2,5,1,1))
   131 search(List(5,3,2,5,1,1))
   130 search(List(3,5,1,0,0,0,1))
   132 search(List(3,5,1,0,0,0,1))
   136 search(List(1))
   138 search(List(1))
   137 search(List(5,1,1))
   139 search(List(5,1,1))
   138 search(List(3,5,1,0,0,0,0,0,0,0,0,1))
   140 search(List(3,5,1,0,0,0,0,0,0,0,0,1))
   139 
   141 
   140 // generates *all* jump tours
   142 // generates *all* jump tours
   141 //    if we are only interested in the shortes one, we could
   143 //    if we are only interested in the shortest one, we could
   142 //    shortcircut the calculation and only return List(x) in
   144 //    shortcircut the calculation and only return List(x) in
   143 //    case where xs.length < x, because no tour can be shorter
   145 //    case where xs.length < x, because no tour can be shorter
   144 //    than 1
   146 //    than 1
   145 // 
   147 // 
   146 
   148 
   147 def jumps(xs: List[Int]) : List[List[Int]] = xs match {
   149 def jumps(xs: List[Int]) : List[List[Int]] = xs match {
   148   case Nil => Nil
   150   case Nil => Nil
   149   case (x::xs) => {
   151   case x::xs => {
   150     val children = moves(xs, x)
   152     val children = moves(xs, x)
   151     val results = children.map(cs => jumps(cs).map(x :: _)).flatten
   153     val results = children.map(cs => jumps(cs).map(x :: _)).flatten
   152     if (xs.length < x) List(x)::results else results
   154     if (xs.length < x) List(x)::results else results
   153   }
   155   }
   154 }
   156 }
   178 
   180 
   179 // User-defined Datatypes
   181 // User-defined Datatypes
   180 //========================
   182 //========================
   181 
   183 
   182 
   184 
   183 abstract class Colour
   185 sealed abstract class Colour
   184 case object Red extends Colour 
   186 case object Red extends Colour 
   185 case object Green extends Colour 
   187 case object Green extends Colour 
   186 case object Blue extends Colour
   188 case object Blue extends Colour
   187 
   189 
   188 
   190 
   194 
   196 
   195 fav_colour(Green)
   197 fav_colour(Green)
   196 
   198 
   197 // ... a tiny bit more useful: Roman Numerals
   199 // ... a tiny bit more useful: Roman Numerals
   198 
   200 
   199 abstract class RomanDigit 
   201 sealed abstract class RomanDigit 
   200 case object I extends RomanDigit 
   202 case object I extends RomanDigit 
   201 case object V extends RomanDigit 
   203 case object V extends RomanDigit 
   202 case object X extends RomanDigit 
   204 case object X extends RomanDigit 
   203 case object L extends RomanDigit 
   205 case object L extends RomanDigit 
   204 case object C extends RomanDigit 
   206 case object C extends RomanDigit 
   267 // User-defined Datatypes and Pattern Matching
   269 // User-defined Datatypes and Pattern Matching
   268 //=============================================
   270 //=============================================
   269 
   271 
   270 // trees
   272 // trees
   271 
   273 
   272 abstract class Exp
   274 sealed abstract class Exp
   273 case class N(n: Int) extends Exp                  // for numbers
   275 case class N(n: Int) extends Exp                  // for numbers
   274 case class Plus(e1: Exp, e2: Exp) extends Exp
   276 case class Plus(e1: Exp, e2: Exp) extends Exp
   275 case class Times(e1: Exp, e2: Exp) extends Exp
   277 case class Times(e1: Exp, e2: Exp) extends Exp
   276 
   278 
   277 def string(e: Exp) : String = e match {
   279 def string(e: Exp) : String = e match {
   312 println(string(e2))
   314 println(string(e2))
   313 println(string(simp(e2)))
   315 println(string(simp(e2)))
   314 
   316 
   315 
   317 
   316 // Tokens and Reverse Polish Notation
   318 // Tokens and Reverse Polish Notation
   317 abstract class Token
   319 sealed abstract class Token
   318 case class T(n: Int) extends Token
   320 case class T(n: Int) extends Token
   319 case object PL extends Token
   321 case object PL extends Token
   320 case object TI extends Token
   322 case object TI extends Token
   321 
   323 
   322 def rp(e: Exp) : List[Token] = e match {
   324 def rp(e: Exp) : List[Token] = e match {