changeset 321 | 7b0055205ec9 |
parent 320 | cdfb2ce30a3d |
child 323 | 1f8005b4cdf6 |
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 { |