Scala exercises for beginners

The following exercises have come from of a course that I give on Functional Programming. I have assigned them difficulty ratings to make it a bit more exciting. Download the compilable source code from here or find it below. Enjoy :)

These exercises can be translated into any language powerful enough to possess algebraic data types and case matching (yes, I am talking to you). Haskell is another such language and I will convert these exercises to Haskell if prompted.

// You are not permitted to use these List methods:
// * length
// * map
// * filter
// * ::: (and variations such as ++)
// * flatten
// * flatMap
// * reverse (and variations i.e. reverseMap, reverse_:::)
// This also means you are not permitted to use for-comprehensions on Lists.
// You are permitted to use the functions you write yourself. For example, Exercise 2 may use Exercise 1 or Exercise 3.
// Using permitted existing methods where appropriate will attract marks for elegance.
 
// TOTAL marks:    /66
 
object Exercises {
  def succ(n: Int) = n + 1
  def pred(n: Int) = n - 1
 
  // Exercise 1
  // Relative Difficulty: 1
  // Correctness: 2.0 marks
  // Performance: 0.5 mark
  // Elegance: 0.5 marks
  // Total: 3
  def add(x: Int, y: Int): Int = error("todo: Assume x and y are 0 or positive. Do not use + or - on Int. Only permitted to use succ/pred (above).")
 
  // Exercise 2
  // Relative Difficulty: 2
  // Correctness: 2.5 marks
  // Performance: 1 mark
  // Elegance: 0.5 marks
  // Total: 4
  def sum(x: List[Int]): Int = error("todo")
 
  // Exercise 3
  // Relative Difficulty: 2
  // Correctness: 2.5 marks
  // Performance: 1 mark
  // Elegance: 0.5 marks
  // Total: 4
  def length[A](x: List[A]): Int = error("todo")
 
  // Exercise 4
  // Relative Difficulty: 5
  // Correctness: 4.5 marks
  // Performance: 1.0 mark
  // Elegance: 1.5 marks
  // Total: 7
  def map[A, B](x: List[A], f: A => B): List[B] = error("todo")
 
  // Exercise 5
  // Relative Difficulty: 5
  // Correctness: 4.5 marks
  // Performance: 1.5 marks
  // Elegance: 1 mark
  // Total: 7
  def filter[A](x: List[A], f: A => Boolean): List[A] = error("todo")
 
  // Exercise 6
  // Relative Difficulty: 5
  // Correctness: 4.5 marks
  // Performance: 1.5 marks
  // Elegance: 1 mark
  // Total: 7
  def append[A](x: List[A], y: List[A]): List[A] = error("todo")
 
  // Exercise 7
  // Relative Difficulty: 5
  // Correctness: 4.5 marks
  // Performance: 1.5 marks
  // Elegance: 1 mark
  // Total: 7
  def concat[A](x: List[List[A]]): List[A] = error("todo")
 
  // Exercise 8
  // Relative Difficulty: 7
  // Correctness: 5.0 marks
  // Performance: 1.5 marks
  // Elegance: 1.5 mark
  // Total: 8
  def concatMap[A, B](x: List[A], f: A => List[B]): List[B] = error("todo")
 
  // Exercise 9
  // Relative Difficulty: 8
  // Correctness: 3.5 marks
  // Performance: 3.0 marks
  // Elegance: 2.5 marks
  // Total: 9
  def maximum(x: List[Int]): Int = error("todo")
 
  // Exercise 10
  // Relative Difficulty: 10
  // Correctness: 5.0 marks
  // Performance: 2.5 marks
  // Elegance: 2.5 marks
  // Total: 10
  def reverse[A](x: List[A]): List[A] = error("todo")
}

28 Responses to “Scala exercises for beginners”

  1. Justin Camerer Says:

    Well, this is pretty bad ass. I’m going to attempt these in scala and haskell when I get a chance. Great idea! Thanks.

  2. Justin Camerer Says:

    I finished them. If I submit this to you, can I get credit for the course you teach?

  3. Tony Morris Says:

    I’ll give you a gold star and a cookie :)
    Submit the answer here in base 64 if you like and I’ll provide feedback when I get a moment.

    Or email it to me: val x = "tmorris"; x + "@" + x + ".net"

  4. Garrett Rowe Says:

    I like oatmeal raisin!

    Ly8gVE9UQUwgbWFya3M6ICAgIC82Ng0KDQpvYmplY3QgRXhlcmNpc2VzIHsNCiAgZGVmIHN1Y2MobjogSW50KSA9IG4gKyAxDQogIGRlZiBwcmVkKG46IEludCkgPSBuIC0gMQ0KDQogIC8vIEV4ZXJjaXNlIDENCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMQ0KICAvLyBDb3JyZWN0bmVzczogMi4wIG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAwLjUgbWFyaw0KICAvLyBFbGVnYW5jZTogMC41IG1hcmtzDQogIC8vIFRvdGFsOiAzDQogIGRlZiBhZGQoeDogSW50LCB5OiBJbnQpOiBJbnQgPSB7DQogICAgIGRlZiBhKG46IEludCwgcmVzOiBJbnQpOiBJbnQgPSB7DQogICAgICAgIGlmIChuID09IDApIHsNCiAgICAgICAgICAgcmVzDQogICAgICAgIH0gZWxzZSBpZiAobiA+IDApIHsNCiAgICAgICAgICAgYShwcmVkKG4pLCBzdWNjKHJlcykpDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgIGEoc3VjYyhuKSwgcHJlZChyZXMpKQ0KICAgICAgICB9DQogICAgIH0NCiAgICAgYSh4LCB5KQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgMg0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiAyDQogIC8vIENvcnJlY3RuZXNzOiAyLjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEgbWFyaw0KICAvLyBFbGVnYW5jZTogMC41IG1hcmtzDQogIC8vIFRvdGFsOiA0DQogIGRlZiBzdW0oeDogTGlzdFtJbnRdKTogSW50ID0gew0KICAgICB4LmZvbGRSaWdodCAoMCkgKGFkZChfLCBfKSkNCiAgfQ0KDQogIC8vIEV4ZXJjaXNlIDMNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMg0KICAvLyBDb3JyZWN0bmVzczogMi41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAxIG1hcmsNCiAgLy8gRWxlZ2FuY2U6IDAuNSBtYXJrcw0KICAvLyBUb3RhbDogNA0KICBkZWYgbGVuZ3RoW0FdKHg6IExpc3RbQV0pOiBJbnQgPSB7DQogICAgIHguZm9sZFJpZ2h0ICgwKSAoKHksIG4pID0+IHN1Y2MobikpDQogIH0NCg0KICAvLyBFeGVyY2lzZSA0DQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDUNCiAgLy8gQ29ycmVjdG5lc3M6IDQuNSBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMS4wIG1hcmsNCiAgLy8gRWxlZ2FuY2U6IDEuNSBtYXJrcw0KICAvLyBUb3RhbDogNw0KICBkZWYgbWFwW0EsIEJdKHg6IExpc3RbQV0sIGY6IEEgPT4gQik6IExpc3RbQl0gPSB7DQogICAgIHguZm9sZFJpZ2h0IChMaXN0W0JdKCkpICgoYSwgbCkgPT4gZihhKTo6bCkNCiAgfQ0KDQogIC8vIEV4ZXJjaXNlIDUNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogNQ0KICAvLyBDb3JyZWN0bmVzczogNC41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAxLjUgbWFya3MNCiAgLy8gRWxlZ2FuY2U6IDEgbWFyaw0KICAvLyBUb3RhbDogNw0KICBkZWYgZmlsdGVyW0FdKHg6IExpc3RbQV0sIGY6IEEgPT4gQm9vbGVhbik6IExpc3RbQV0gPSB7DQogICAgIHguZm9sZFJpZ2h0IChMaXN0W0FdKCkpICgoYSwgbCkgPT4gaWYgKGYoYSkpIGE6OmwgZWxzZSBsKQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgNg0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA1DQogIC8vIENvcnJlY3RuZXNzOiA0LjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuNSBtYXJrcw0KICAvLyBFbGVnYW5jZTogMSBtYXJrDQogIC8vIFRvdGFsOiA3DQogIGRlZiBhcHBlbmRbQV0oeDogTGlzdFtBXSwgeTogTGlzdFtBXSk6IExpc3RbQV0gPSB7DQogICAgIHguZm9sZFJpZ2h0ICh5KSAoKGEsIGwpID0+IGE6OmwpDQogIH0NCg0KICAvLyBFeGVyY2lzZSA3DQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDUNCiAgLy8gQ29ycmVjdG5lc3M6IDQuNSBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMS41IG1hcmtzDQogIC8vIEVsZWdhbmNlOiAxIG1hcmsNCiAgLy8gVG90YWw6IDcNCiAgZGVmIGNvbmNhdFtBXSh4OiBMaXN0W0xpc3RbQV1dKTogTGlzdFtBXSA9IHsNCiAgICAgeC5mb2xkUmlnaHQgKExpc3RbQV0oKSkgKChhLCBsKSA9PiBhcHBlbmQoYSwgbCkpDQogIH0NCg0KICAvLyBFeGVyY2lzZSA4DQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDcNCiAgLy8gQ29ycmVjdG5lc3M6IDUuMCBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMS41IG1hcmtzDQogIC8vIEVsZWdhbmNlOiAxLjUgbWFyaw0KICAvLyBUb3RhbDogOA0KICBkZWYgY29uY2F0TWFwW0EsIEJdKHg6IExpc3RbQV0sIGY6IEEgPT4gTGlzdFtCXSk6IExpc3RbQl0gPSB7DQogICAgIGNvbmNhdChtYXAoeCwgZikpDQogIH0NCiAgDQogIC8vIEV4ZXJjaXNlIDkNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogOA0KICAvLyBDb3JyZWN0bmVzczogMy41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAzLjAgbWFya3MNCiAgLy8gRWxlZ2FuY2U6IDIuNSBtYXJrcw0KICAvLyBUb3RhbDogOQ0KICBkZWYgbWF4aW11bSh4OiBMaXN0W0ludF0pOiBJbnQgPSB4IG1hdGNoIHsNCiAgICAgY2FzZSBOaWwgICAgID0+IGVycm9yKFxcXCJtYXhpbXVtIG9mIGVtcHR5IGxpc3QgaXMgdW5kZWZpbmVkIVxcXCIpDQogICAgIGNhc2UgKGU6OmVzKSA9PiBlcy5mb2xkUmlnaHQgKGUpICgoeSwgbikgPT4gaWYgKHkgPiBuKSB5IGVsc2UgbikNCiAgfQ0KICAgICANCg0KICAvLyBFeGVyY2lzZSAxMA0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiAxMA0KICAvLyBDb3JyZWN0bmVzczogNS4wIG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAyLjUgbWFya3MNCiAgLy8gRWxlZ2FuY2U6IDIuNSBtYXJrcw0KICAvLyBUb3RhbDogMTANCiAgZGVmIHJldmVyc2VbQV0oeDogTGlzdFtBXSk6IExpc3RbQV0gPSB7DQogICAgIHguZm9sZExlZnQgKExpc3RbQV0oKSkgKChsLCB4KSA9PiB4OjpsKQ0KICB9DQp9

  5. Justin Camerer Says:

    w00t!

    Ly8gWW91IGFyZSBub3QgcGVybWl0dGVkIHRvIHVzZSB0aGVzZSBMaXN0IG1ldGhvZHM6DQovLyAqIGxlbmd0aA0KLy8gKiBtYXANCi8vICogZmlsdGVyDQovLyAqIDo6OiAoYW5kIHZhcmlhdGlvbnMgc3VjaCBhcyArKykNCi8vICogZmxhdHRlbg0KLy8gKiBmbGF0TWFwDQovLyAqIHJldmVyc2UgKGFuZCB2YXJpYXRpb25zIGkuZS4gcmV2ZXJzZU1hcCwgcmV2ZXJzZV86OjopDQovLyBUaGlzIGFsc28gbWVhbnMgeW91IGFyZSBub3QgcGVybWl0dGVkIHRvIHVzZSBmb3ItY29tcHJlaGVuc2lvbnMgb24gTGlzdHMuDQovLyBZb3UgYXJlIHBlcm1pdHRlZCB0byB1c2UgdGhlIGZ1bmN0aW9ucyB5b3Ugd3JpdGUgeW91cnNlbGYuIEZvciBleGFtcGxlLCBFeGVyY2lzZSAyIG1heSB1c2UgRXhlcmNpc2UgMSBvciBFeGVyY2lzZSAzLg0KLy8gVXNpbmcgcGVybWl0dGVkIGV4aXN0aW5nIG1ldGhvZHMgd2hlcmUgYXBwcm9wcmlhdGUgd2lsbCBhdHRyYWN0IG1hcmtzIGZvciBlbGVnYW5jZS4NCg0KLy8gVE9UQUwgbWFya3M6ICAgIC82Ng0KDQpvYmplY3QgRXhlcmNpc2VzIHsNCiAgZGVmIHN1Y2MobjogSW50KSA9IG4gKyAxDQogIGRlZiBwcmVkKG46IEludCkgPSBuIC0gMQ0KDQogIC8vIEV4ZXJjaXNlIDENCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMQ0KICAvLyBDb3JyZWN0bmVzczogMi4wIG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAwLjUgbWFyaw0KICAvLyBFbGVnYW5jZTogMC41IG1hcmtzDQogIC8vIFRvdGFsOiAzDQogIGRlZiBhZGQoeDogSW50LCB5OiBJbnQpOiBJbnQgPSB4IG1hdGNoIHsNCiAgICBjYXNlIDAgPT4gaWYoeSA9PSAwKSAwIGVsc2UgYWRkKHksIHgpDQogICAgY2FzZSBfID0+IGlmKHggPiAwKSBzdWNjKGFkZChwcmVkKHgpLCB5KSkNCiAgICAgICAgICAgICAgZWxzZSAgICAgIHByZWQoYWRkKHN1Y2MoeCksIHkpKQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgMg0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiAyDQogIC8vIENvcnJlY3RuZXNzOiAyLjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEgbWFyaw0KICAvLyBFbGVnYW5jZTogMC41IG1hcmtzDQogIC8vIFRvdGFsOiA0DQogIGRlZiBzdW0oeDogTGlzdFtJbnRdKTogSW50ID0geCBtYXRjaCB7DQogICAgY2FzZSBoZWFkIDo6IE5pbCAgPT4gYWRkKGhlYWQsIDApDQogICAgY2FzZSBoZWFkIDo6IHRhaWwgPT4gYWRkKGhlYWQsIHN1bSh0YWlsKSkNCiAgfQ0KDQogIC8vIEV4ZXJjaXNlIDMNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMg0KICAvLyBDb3JyZWN0bmVzczogMi41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAxIG1hcmsNCiAgLy8gRWxlZ2FuY2U6IDAuNSBtYXJrcw0KICAvLyBUb3RhbDogNA0KICBkZWYgbGVuZ3RoW0FdKHg6IExpc3RbQV0pOiBJbnQgPSB4IG1hdGNoIHsNCiAgICBjYXNlIE5pbCA9PiAwDQogICAgY2FzZSBoZWFkIDo6IHRhaWwgPT4gc3VjYyhsZW5ndGgodGFpbCkpDQogIH0NCg0KICAvLyBFeGVyY2lzZSA0DQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDUNCiAgLy8gQ29ycmVjdG5lc3M6IDQuNSBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMS4wIG1hcmsNCiAgLy8gRWxlZ2FuY2U6IDEuNSBtYXJrcw0KICAvLyBUb3RhbDogNw0KICBkZWYgbWFwW0EsIEJdKHg6IExpc3RbQV0sIGY6IEEgPT4gQik6IExpc3RbQl0gPSB4IG1hdGNoIHsNCiAgICBjYXNlIE5pbCA9PiBOaWwNCiAgICBjYXNlIGhlYWQgOjogdGFpbCA9PiBmKGhlYWQpIDo6IG1hcCh0YWlsLCBmKQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgNQ0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA1DQogIC8vIENvcnJlY3RuZXNzOiA0LjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuNSBtYXJrcw0KICAvLyBFbGVnYW5jZTogMSBtYXJrDQogIC8vIFRvdGFsOiA3DQogIGRlZiBmaWx0ZXJbQV0oeDogTGlzdFtBXSwgZjogQSA9PiBCb29sZWFuKTogTGlzdFtBXSA9IHggbWF0Y2ggew0KICAgIGNhc2UgTmlsID0+IE5pbA0KICAgIGNhc2UgaGVhZCA6OiB0YWlsID0+IGlmKGYoaGVhZCkpIGhlYWQgOjogZmlsdGVyKHRhaWwsIGYpDQogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgZmlsdGVyKHRhaWwsIGYpDQogIH0NCg0KICAvLyBFeGVyY2lzZSA2DQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDUNCiAgLy8gQ29ycmVjdG5lc3M6IDQuNSBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMS41IG1hcmtzDQogIC8vIEVsZWdhbmNlOiAxIG1hcmsNCiAgLy8gVG90YWw6IDcNCiAgZGVmIGFwcGVuZFtBXSh4OiBMaXN0W0FdLCB5OiBMaXN0W0FdKTogTGlzdFtBXSA9IHggbWF0Y2ggew0KICAgIGNhc2UgTmlsID0+IHkNCiAgICBjYXNlIGhlYWQgOjogTmlsICA9PiBoZWFkIDo6IHkNCiAgICBjYXNlIGhlYWQgOjogdGFpbCA9PiBoZWFkIDo6IGFwcGVuZCh0YWlsLCB5KQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgNw0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA1DQogIC8vIENvcnJlY3RuZXNzOiA0LjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuNSBtYXJrcw0KICAvLyBFbGVnYW5jZTogMSBtYXJrDQogIC8vIFRvdGFsOiA3DQogIGRlZiBjb25jYXRbQV0oeDogTGlzdFtMaXN0W0FdXSk6IExpc3RbQV0gPSB4IG1hdGNoIHsNCiAgICBjYXNlIGhlYWQgOjogTmlsID0+IGhlYWQNCiAgICBjYXNlIGhlYWQgOjogdGFpbCA9PiBhcHBlbmQoaGVhZCwgY29uY2F0KHRhaWwpKQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgOA0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA3DQogIC8vIENvcnJlY3RuZXNzOiA1LjAgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuNSBtYXJrcw0KICAvLyBFbGVnYW5jZTogMS41IG1hcmsNCiAgLy8gVG90YWw6IDgNCiAgZGVmIGNvbmNhdE1hcFtBLCBCXSh4OiBMaXN0W0FdLCBmOiBBID0+IExpc3RbQl0pOiBMaXN0W0JdID0geCBtYXRjaCB7DQogICAgY2FzZSBoZWFkIDo6IE5pbCA9PiBmKGhlYWQpDQogICAgY2FzZSBoZWFkIDo6IHRhaWwgPT4gYXBwZW5kKGYoaGVhZCksIGNvbmNhdE1hcCh0YWlsLCBmKSkNCiAgfQ0KICANCiAgLy8gRXhlcmNpc2UgOQ0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA4DQogIC8vIENvcnJlY3RuZXNzOiAzLjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDMuMCBtYXJrcw0KICAvLyBFbGVnYW5jZTogMi41IG1hcmtzDQogIC8vIFRvdGFsOiA5DQogIGRlZiBtYXhpbXVtKHg6IExpc3RbSW50XSk6IEludCA9IHggbWF0Y2ggew0KICAgIGNhc2UgaGVhZCA6OiBOaWwgPT4gaGVhZA0KICAgIGNhc2UgaGVhZCA6OiB0YWlsID0+IHsNCiAgICAgIHZhbCBtYXhfdGFpbCA9IG1heGltdW0odGFpbCkNCiAgICAgIGlmKGhlYWQgPiBtYXhfdGFpbCkgaGVhZCBlbHNlIG1heF90YWlsDQogICAgfQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgMTANCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMTANCiAgLy8gQ29ycmVjdG5lc3M6IDUuMCBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMi41IG1hcmtzDQogIC8vIEVsZWdhbmNlOiAyLjUgbWFya3MNCiAgLy8gVG90YWw6IDEwDQogIGRlZiByZXZlcnNlW0FdKHg6IExpc3RbQV0pOiBMaXN0W0FdID0geCBtYXRjaCB7DQogICAgY2FzZSBoZWFkIDo6IHRhaWwgPT4gYXBwZW5kKHJldmVyc2UodGFpbCksIExpc3QoaGVhZCkpDQogICAgY2FzZSBOaWwgPT4gTmlsDQogIH0NCn0NCg0Kb2JqZWN0IE1haW4gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7DQogIHByaW50bG4oRXhlcmNpc2VzLmFkZCgxMCwyKSkNCiAgcHJpbnRsbihFeGVyY2lzZXMuc3VtKExpc3QoMTAsMiwzLDUsNikpKQ0KICBwcmludGxuKEV4ZXJjaXNlcy5sZW5ndGgoTGlzdCgxMCwyLDMsNSw2KSkpDQogIHByaW50bG4oRXhlcmNpc2VzLm1hcChMaXN0KDEsMiwzLDQsNSksICh4OkludCkgPT4geCAqIHgpKQ0KICBwcmludGxuKEV4ZXJjaXNlcy5maWx0ZXIoTGlzdCgxLDIsMyw0LDUpLCAoeDpJbnQpID0+IHggPiAzKSkNCiAgcHJpbnRsbihFeGVyY2lzZXMuYXBwZW5kKExpc3QoMSwyLDMpLCBMaXN0KDQsNSw2KSkpDQogIHByaW50bG4oRXhlcmNpc2VzLmNvbmNhdChMaXN0KExpc3QoMSwyLDMpLCBMaXN0KDQsNSw2KSwgTGlzdCg3LDgsOSkpKSkNCiAgcHJpbnRsbihFeGVyY2lzZXMuY29uY2F0TWFwKExpc3QoMSwyLDMsNCw1LDYpLCAoeDpJbnQpID0+IExpc3QoeCwgeCAqIDIsIHggKiAzKSkpDQogIHByaW50bG4oRXhlcmNpc2VzLm1heGltdW0oMSA6OiA1IDo6IDMgOjogTmlsKSkNCiAgcHJpbnRsbihFeGVyY2lzZXMucmV2ZXJzZSgxIDo6IDIgOjogMyA6OiBOaWwpKQ0KfQ0KDQo=

  6. Martin Says:

    You wrote: “Haskell is another such language and I will convert these exercises to Haskell if prompted.”

    I hereby prompt you. :)

  7. Tobias Says:

    Wait, list concatenation is not allowed? How do I construct/deconstruct a list then (thinking x:xs in Haskell)?

  8. vlad Says:

    @Tobias: the : operator is cons, not concatenation.

  9. vlad Says:

    (the list concatenation operator in Haskell is ++)

  10. jeff Heon Says:

    I take it the fold operations are forbidden too?

  11. Tony Morris Says:

    No, folds are not forbidden.

  12. Tobias Says:

    vlad thanks, guess I was confused by the ::: operator.
    without checking the others:

    LS0gdGhpcyBjb3VsZCBkZS1ib2lsZXJwbGF0ZSB0aGUgY29kZSBhIGJpdCA7KQ0KLS0oPykgOjogQm9vbCAtPiAodCwgdCkgLT4gdA0KYSA/IChiLCBjKSA9IGlmIGEgdGhlbiBiIGVsc2UgYw0KDQpteXN1Y2MgbiA9IG4gKyAxDQpteXByZWQgbiA9IG4gLSAxDQoNCm15YWRkIHggeSA9IGlmIHkgPiAwDQogICAgICAgICAgICB0aGVuIG15YWRkIChteXN1Y2MgeCkgKG15cHJlZCB5KQ0KICAgICAgICAgICAgZWxzZSB4DQoNCm15c3VtICh4OnhzKSA9IGlmIG51bGwgeHMNCiAgICAgICAgICAgICAgIHRoZW4geA0KICAgICAgICAgICAgICAgZWxzZSBteWFkZCB4IChteXN1bSB4cykNCg0KbXlsZW5ndGggKHg6eHMpID0gaWYgbnVsbCB4cw0KICAgICAgICAgICAgICAgICAgdGhlbiAxDQogICAgICAgICAgICAgICAgICBlbHNlIHN1Y2MgJCBteWxlbmd0aCB4cw0KDQpteW1hcCAoeDp4cykgZiA9IGlmIG51bGwgeHMNCiAgICAgICAgICAgICAgICAgdGhlbiAoZiB4KSA6IFtdDQogICAgICAgICAgICAgICAgIGVsc2UgKGYgeCkgOiBteW1hcCB4cyBmDQoNCm15ZmlsdGVyIGxpc3QgZiA9IG15ZmlsdGVyXCcgbGlzdCBmIFtdDQogICAgICAgICAgICAgICAgICB3aGVyZSBteWZpbHRlclwnICh4OnhzKSBmIHJzbHQgPSBpZiBmIHgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiB4IDogKG15ZmlsdGVyXCcgeHMgZiByc2×0KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIChteWZpbHRlclwnIHhzIGYgcnNsdCkNCiAgICAgICAgICAgICAgICAgICAgICAgIG15ZmlsdGVyXCcgXyAgICAgIF8gcnNsdCA9IHJzbHQNCg0KbXlhcHBlbmQgeHMgeXMgPSAodHJhdmVyc2UgeHMgLiB0cmF2ZXJzZSB5cykgW10NCiAgICAgICAgICAgICAgICAgd2hlcmUgdHJhdmVyc2UgKHg6eHMpIHJzbHQgPSBpZiBudWxsIHhzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiB4IDogcnNsdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeCA6ICh0cmF2ZXJzZSB4cyByc2×0KQ0KICAgICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZSBfICAgICAgcnNsdCA9IHJzbHQNCg0KbXljb25jYXQgKHg6eHMpID0gaWYgbnVsbCB4cw0KICAgICAgICAgICAgICAgICAgdGhlbiB4DQogICAgICAgICAgICAgICAgICBlbHNlIG15YXBwZW5kIHggKG15Y29uY2F0IHhzKQ0KDQotLSBub3Qgc3VyZSB3aGljaCB2ZXJzaW9uIGlzIGNvcnJlY3QgYWNjb3JkaW5nIHRvIHRoZSBkZWZpbml0aW9uDQpteWNvbmNhdE1hcCAoeDp4cykgZiA9IGlmIG51bGwgeHMNCiAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBmIHgNCiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBteWFwcGVuZCAoZiB4KSAobXljb25jYXRNYXAgeHMgZikNCi0tbXljb25jYXRNYXAgKHg6eHMpIGYgPSBpZiBudWxsIHhzDQotLSAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBteW1hcCB4IGYNCi0tICAgICAgICAgICAgICAgICAgICAgICBlbHNlIG15YXBwZW5kIChteW1hcCB4IGYpIChteWNvbmNhdE1hcCB4cyBmKQ0KDQpteW1heGltdW0gKHg6eTp0YWlsKSA9IGlmIG51bGwgdGFpbA0KICAgICAgICAgICAgICAgICAgICAgICB0aGVuICh5ID4geCkgPyAoeSwgeCkNCiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiB5ID4geA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gbXltYXhpbXVtICh5OnRhaWwpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBteW1heGltdW0gKHg6dGFpbCkNCm15bWF4aW11bSBfICAgICAgICAgID0gZXJyb3IgXCJMaXN0IGlzIHRvIHNob3J0LlwiDQoNCm15cmV2ZXJzZSAoeDp4cykgPSBpZiBudWxsIHhzDQogICAgICAgICAgICAgICAgICAgdGhlbiBbeF0NCiAgICAgICAgICAgICAgICAgICBlbHNlIG15YXBwZW5kIChteXJldmVyc2UgeHMpIFt4XQ0K

    (hey wait, folds are ok? arghh..)

  13. Tobias Says:

    mh seems like base64 didn’t work out.
    here is a paste: http://haskell.pastebin.com/m68231f5f

  14. vlad Says:

    After all, some people would lead you to believe that understanding fold* is half (or maybe a quarter) of the battle.

  15. Tony Morris Says:

    Using fold is more elegant.

    I should have perhaps defined a custom algebraic type that is isomorphic to scala.List and predefined the folds. Sorry for this confusion. The Haskell version will do this.

  16. vlad Says:

    Are we intended to use pattern matching?

  17. Tony Morris Says:

    “Are we intended to use pattern matching?”

    Only if appropriate. Use higher-level abstractions if available.

    I will be posting the Haskell equivalent soon, which helps alleviate this confusion, sorry.

  18. jeff Heon Says:

    I must admit I had recently read the chapter “Working with Lists” from the Programming in Scala book, so my style is heavily influenced by it (recursivity and pattern matching.) In the case of reverse, I simply remembered how they did it, so no credit for me.

    I ended up having the most difficulty with concatMap, because I was approaching it in a weird way I guess. I then made a simpler version 2.

    Well, there it is for me.
    Ly8gSmVmZiBIZW9uDQoNCi8vIFRPVEFMIG1hcmtzOiAgICAvNjYNCg0Kb2JqZWN0IEV4ZXJjaXNlcyB7DQogIGRlZiBzdWNjKG46IEludCkgPSBuICsgMQ0KICBkZWYgcHJlZChuOiBJbnQpID0gbiAtIDENCg0KICAvLyBFeGVyY2lzZSAxDQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDENCiAgLy8gQ29ycmVjdG5lc3M6IDIuMCBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMC41IG1hcmsNCiAgLy8gRWxlZ2FuY2U6IDAuNSBtYXJrcw0KICAvLyBUb3RhbDogMw0KICBkZWYgYWRkKHg6IEludCwgeTogSW50KTogSW50ID0geSBtYXRjaCB7DQoJY2FzZSAwID0+IHg7DQoJY2FzZSBfID0+IGFkZChzdWNjKHgpLCBwcmVkKHkpKQ0KICB9DQogIA0KDQogIC8vIEV4ZXJjaXNlIDINCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMg0KICAvLyBDb3JyZWN0bmVzczogMi41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAxIG1hcmsNCiAgLy8gRWxlZ2FuY2U6IDAuNSBtYXJrcw0KICAvLyBUb3RhbDogNA0KICBkZWYgc3VtKHg6IExpc3RbSW50XSk6IEludCA9IHggbWF0Y2ggew0KICAJY2FzZSBOaWwgPT4gMA0KICAJY2FzZSBoZWFkIDo6IE5pbCA9PiBoZWFkDQogIAljYXNlIGhlYWQgOjogdGFpbCA9PiBhZGQoaGVhZCwgc3VtKHRhaWwpKQ0KICB9DQogIAkNCg0KICAvLyBFeGVyY2lzZSAzDQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDINCiAgLy8gQ29ycmVjdG5lc3M6IDIuNSBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMSBtYXJrDQogIC8vIEVsZWdhbmNlOiAwLjUgbWFya3MNCiAgLy8gVG90YWw6IDQNCiAgZGVmIGxlbmd0aFtBXSh4OiBMaXN0W0FdKTogSW50ID0geCBtYXRjaCB7DQogIAljYXNlIE5pbCA9PiAwDQogIAljYXNlIGhlYWQgOjogTmlsID0+IDENCiAgCWNhc2UgaGVhZCA6OiB0YWlsID0+IHN1Y2MobGVuZ3RoW0FdKHRhaWwpKQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgNA0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA1DQogIC8vIENvcnJlY3RuZXNzOiA0LjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuMCBtYXJrDQogIC8vIEVsZWdhbmNlOiAxLjUgbWFya3MNCiAgLy8gVG90YWw6IDcNCiAgZGVmIG1hcFtBLCBCXSh4OiBMaXN0W0FdLCBmOiBBID0+IEIpOiBMaXN0W0JdID0geCBtYXRjaCB7DQogIAljYXNlIE5pbCA9PiBOaWwNCiAgCWNhc2UgaGVhZCA6OiBOaWwgPT4gTGlzdChmKGhlYWQpKQ0KICAJY2FzZSBoZWFkIDo6IHRhaWwgPT4gZihoZWFkKTo6bWFwW0EsIEJdKHRhaWwsIGYpDQogIH0NCiAgDQogIC8vIEV4ZXJjaXNlIDUNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogNQ0KICAvLyBDb3JyZWN0bmVzczogNC41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAxLjUgbWFya3MNCiAgLy8gRWxlZ2FuY2U6IDEgbWFyaw0KICAvLyBUb3RhbDogNw0KICBkZWYgZmlsdGVyW0FdKHg6IExpc3RbQV0sIGY6IEEgPT4gQm9vbGVhbik6IExpc3RbQV0gPSB4IG1hdGNoIHsNCiAgCWNhc2UgTmlsID0+IE5pbA0KICAJY2FzZSBoZWFkIDo6IE5pbCA9PiBpZiAoZihoZWFkKSkgTGlzdChoZWFkKSBlbHNlIE5pbA0KICAJY2FzZSBoZWFkIDo6IHRhaWwgPT4gaWYgKGYoaGVhZCkpIGhlYWQ6OmZpbHRlcltBXSh0YWlsLCBmKSBlbHNlIGZpbHRlcltBXSh0YWlsLCBmKQ0KICB9DQogIA0KICAvLyBFeGVyY2lzZSA2DQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDUNCiAgLy8gQ29ycmVjdG5lc3M6IDQuNSBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMS41IG1hcmtzDQogIC8vIEVsZWdhbmNlOiAxIG1hcmsNCiAgLy8gVG90YWw6IDcNCiAgZGVmIGFwcGVuZFtBXSh4OiBMaXN0W0FdLCB5OiBMaXN0W0FdKTogTGlzdFtBXSA9IHsNCiAgCWlmICh5LmlzRW1wdHkpIHggZWxzZSB7DQoJICAJeCBtYXRjaCB7DQoJCSAgCWNhc2UgTmlsID0+IHkNCgkJICAJY2FzZSBoZWFkIDo6IE5pbCA9PiBoZWFkOjp5DQoJCSAgCWNhc2UgaGVhZCA6OiB0YWlsID0+IGhlYWQ6OmFwcGVuZFtBXSh0YWlsLCB5KQ0KCSAgfQ0KICAJfQ0KICB9DQoNCiAgLy8gSXMgdGhpcyBmYXN0ZXIvc2xvd2VyL3NhbWUgYXMgZmlyc3QgdmVyc2lvbj8NCiAgZGVmIGFwcGVuZDJbQV0oeDogTGlzdFtBXSwgeTogTGlzdFtBXSk6IExpc3RbQV0gPSAoeCA6XFwgeSkoXzo6XykNCg0KDQogIC8vIEV4ZXJjaXNlIDcNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogNQ0KICAvLyBDb3JyZWN0bmVzczogNC41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAxLjUgbWFya3MNCiAgLy8gRWxlZ2FuY2U6IDEgbWFyaw0KICAvLyBUb3RhbDogNw0KICBkZWYgY29uY2F0W0FdKHg6IExpc3RbTGlzdFtBXV0pOiBMaXN0W0FdID0gKHggOlxcIExpc3RbQV0oKSkoYXBwZW5kMihfLF8pKQ0KDQogIC8vIEV4ZXJjaXNlIDgNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogNw0KICAvLyBDb3JyZWN0bmVzczogNS4wIG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAxLjUgbWFya3MNCiAgLy8gRWxlZ2FuY2U6IDEuNSBtYXJrDQogIC8vIFRvdGFsOiA4DQogIGRlZiBjb25jYXRNYXBbQSwgQl0oeDogTGlzdFtBXSwgZjogQSA9PiBMaXN0W0JdKTogTGlzdFtCXSA9IHsNCiAgCWRlZiBtYXBbQSwgQl0oeDogTGlzdFtBXSwgZjogQSA9PiBMaXN0W0JdKTogTGlzdFtMaXN0W0JdXSA9ICh4IDpcXCBMaXN0W0xpc3RbQl1dKCkpKCAoYTpBLCBiOkxpc3RbTGlzdFtCXV0pPT4oZihhKTo6YikgKQ0KICAJY29uY2F0W0JdKG1hcFtBLCBCXSh4LCBmKSkNCiAgfQ0KICANCiAgLy8gT2theSwgd2h5IGlzIG15IHByZXZpb3VzIHZlcnNpb24gc28gY29tcGxpY2F0ZWQ/DQogIC8vIEFoLCBiZWNhdXNlIEkgd2FzIHRoaW5raW5nIHRvIHVzZSBtYXAgYXMgbWFwW0EsQl0gaW5zdGVhZCBvZiBtYXBbQSwgTGlzdFtCXV0uDQogIGRlZiBjb25jYXRNYXAyW0EsIEJdKHg6IExpc3RbQV0sIGY6IEEgPT4gTGlzdFtCXSk6IExpc3RbQl0gPSBjb25jYXRbQl0obWFwW0EsIExpc3RbQl1dKHgsIGYpKQ0KICANCiAgLy8gRXhlcmNpc2UgOQ0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA4DQogIC8vIENvcnJlY3RuZXNzOiAzLjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDMuMCBtYXJrcw0KICAvLyBFbGVnYW5jZTogMi41IG1hcmtzDQogIC8vIFRvdGFsOiA5DQogIGRlZiBtYXhpbXVtKHg6IExpc3RbSW50XSk6IEludCA9ICh4LmhlYWQgLzogeC50YWlsKSgoYTpJbnQsIGI6SW50KT0+KGlmIChhPmIpIGEgZWxzZSBiKSkNCg0KICAvLyBFeGVyY2lzZSAxMA0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiAxMA0KICAvLyBDb3JyZWN0bmVzczogNS4wIG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAyLjUgbWFya3MNCiAgLy8gRWxlZ2FuY2U6IDIuNSBtYXJrcw0KICAvLyBUb3RhbDogMTANCiAgZGVmIHJldmVyc2VbQV0oeDogTGlzdFtBXSk6IExpc3RbQV0gPSAoTGlzdFtBXSgpIC86IHgpKChhOkxpc3RbQV0sIGI6QSk9PihiOjphKSkNCn0=

  19. Gabriel C Says:

    Thanks!
    I have a lot of fun solving the exercises :) I tried to stick with the minimal set of operations and used pattern matching/recursion everywhere.
    I’ll try again with folds

  20. Binil Thomas Says:

    Had great fun doing this!

    cGFja2FnZSBhbGdvcy5leGVyY2lzZXMNCg0KLy8gQmluaWwgVGhvbWFzDQpvYmplY3QgRXhlcmNpc2VzIHsNCiAgZGVmIHN1Y2MobjogSW50KSA9IG4gKyAxDQogIGRlZiBwcmVkKG46IEludCkgPSBuIC0gMQ0KDQogIC8vIEV4ZXJjaXNlIDENCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMQ0KICAvLyBDb3JyZWN0bmVzczogMi4wIG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAwLjUgbWFyaw0KICAvLyBFbGVnYW5jZTogMC41IG1hcmtzDQogIC8vIFRvdGFsOiAzDQogIGRlZiBhZGQoeDogSW50LCB5OiBJbnQpOiBJbnQgPSAoeCwgeSkgbWF0Y2ggew0KICAgIGNhc2UgKDAsIF8pID0+IHkNCiAgICBjYXNlIChfLCAwKSA9PiB4DQogICAgY2FzZSAoXywgXykgPT4gYWRkKHN1Y2MoeCksIHByZWQoeSkpDQogIH0NCiAgDQoNCiAgLy8gRXhlcmNpc2UgMg0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiAyDQogIC8vIENvcnJlY3RuZXNzOiAyLjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEgbWFyaw0KICAvLyBFbGVnYW5jZTogMC41IG1hcmtzDQogIC8vIFRvdGFsOiA0DQogIGRlZiBzdW0oeDogTGlzdFtJbnRdKTogSW50ID0geCBtYXRjaCB7DQogICAgY2FzZSBOaWwgPT4gMA0KICAgIGNhc2UgeCA6OiB4cyA9PiBhZGQoeCwgc3VtKHhzKSkNCiAgfQ0KDQogIC8vIEV4ZXJjaXNlIDMNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMg0KICAvLyBDb3JyZWN0bmVzczogMi41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAxIG1hcmsNCiAgLy8gRWxlZ2FuY2U6IDAuNSBtYXJrcw0KICAvLyBUb3RhbDogNA0KICBkZWYgbGVuZ3RoW0FdKHg6IExpc3RbQV0pOiBJbnQgPSB4IG1hdGNoIHsNCiAgICBjYXNlIE5pbCA9PiAwDQogICAgY2FzZSB4IDo6IHhzID0+IGFkZChsZW5ndGgoeHMpLCAxKQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgNA0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA1DQogIC8vIENvcnJlY3RuZXNzOiA0LjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuMCBtYXJrDQogIC8vIEVsZWdhbmNlOiAxLjUgbWFya3MNCiAgLy8gVG90YWw6IDcNCiAgZGVmIG1hcFtBLCBCXSh4OiBMaXN0W0FdLCBmOiBBID0+IEIpOiBMaXN0W0JdID0geCBtYXRjaCB7DQogICAgY2FzZSBOaWwgPT4gTGlzdCgpDQogICAgY2FzZSB4IDo6IHhzID0+IGYoeCkgOjogbWFwKHhzLCBmKQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgNQ0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA1DQogIC8vIENvcnJlY3RuZXNzOiA0LjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuNSBtYXJrcw0KICAvLyBFbGVnYW5jZTogMSBtYXJrDQogIC8vIFRvdGFsOiA3DQogIGRlZiBmaWx0ZXJbQV0oeDogTGlzdFtBXSwgZjogQSA9PiBCb29sZWFuKTogTGlzdFtBXSA9IHggbWF0Y2ggew0KICAgIGNhc2UgTmlsID0+IExpc3QoKQ0KICAgIGNhc2UgeCA6OiB4cyA9PiBpZiAoZih4KSkgeCA6OiBmaWx0ZXIoeHMsIGYpIGVsc2UgZmlsdGVyKHhzLCBmKQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgNg0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA1DQogIC8vIENvcnJlY3RuZXNzOiA0LjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuNSBtYXJrcw0KICAvLyBFbGVnYW5jZTogMSBtYXJrDQogIC8vIFRvdGFsOiA3DQogIGRlZiBhcHBlbmRbQV0oeDogTGlzdFtBXSwgeTogTGlzdFtBXSk6IExpc3RbQV0gPSAoeCA6XFwgeSkgeyhlLCBsKSA9PiBlIDo6IGx9DQoNCiAgLy8gRXhlcmNpc2UgNw0KICAvLyBDb3JyZWN0bmVzczogNC41IG1hcmtzDQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDUNCiAgLy8gUGVyZm9ybWFuY2U6IDEuNSBtYXJrcw0KICAvLyBFbGVnYW5jZTogMSBtYXJrDQogIC8vIFRvdGFsOiA3DQogIGRlZiBjb25jYXRbQV0oeDogTGlzdFtMaXN0W0FdXSk6IExpc3RbQV0gPSB4IG1hdGNoIHsNCiAgICBjYXNlIE5pbCA9PiBOaWwNCiAgICBjYXNlIHggOjogeHMgPT4gYXBwZW5kKHgsIGNvbmNhdCh4cykpDQogIH0NCg0KICAvLyBFeGVyY2lzZSA4DQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDcNCiAgLy8gQ29ycmVjdG5lc3M6IDUuMCBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMS41IG1hcmtzDQogIC8vIEVsZWdhbmNlOiAxLjUgbWFyaw0KICAvLyBUb3RhbDogOA0KICBkZWYgY29uY2F0TWFwW0EsIEJdKHg6IExpc3RbQV0sIGY6IEEgPT4gTGlzdFtCXSk6IExpc3RbQl0gPSBjb25jYXQobWFwKHgsIGYpKQ0KDQogIC8vIEV4ZXJjaXNlIDkNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogOA0KICAvLyBDb3JyZWN0bmVzczogMy41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAzLjAgbWFya3MNCiAgLy8gRWxlZ2FuY2U6IDIuNSBtYXJrcw0KICAvLyBUb3RhbDogOQ0KICBkZWYgbWF4aW11bSh4OiBMaXN0W0ludF0pOiBJbnQgPSB4IG1hdGNoIHsNCiAgICBjYXNlIE5pbCA9PiBlcnJvcihcImNhblwndCBmaW5kIG1heGltdW0gb2YgZW1wdHkgbGlzdFwiKQ0KICAgIGNhc2UgXyA9PiAoeCgwKSAvOiB4KSB7KG1heCwgZSkgPT4gaWYgKGUgPiBtYXgpIGUgZWxzZSBtYXh9DQogIH0NCg0KICAvLyBFeGVyY2lzZSAxMA0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiAxMA0KICAvLyBDb3JyZWN0bmVzczogNS4wIG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAyLjUgbWFya3MNCiAgLy8gRWxlZ2FuY2U6IDIuNSBtYXJrcw0KICAvLyBUb3RhbDogMTANCiAgZGVmIHJldmVyc2VbQV0oeDogTGlzdFtBXSk6IExpc3RbQV0gPSAoTGlzdFtBXSgpIC86IHgpIHsobCwgZSkgPT4gZSA6OiBsfQ0KICANCn0NCg==

  21. Stefan Zeiger Says:

    Since I already commented about it on the scala-user list, I might as well post my solution (type-checked but untested):

    b2JqZWN0IEV4ZXJjaXNlcyB7CiAgZGVmIHN1Y2MobjogSW50KSA9IG4gKyAxCiAgZGVmIHByZWQo
    bjogSW50KSA9IG4gLSAxCiAgZGVmIGFkZCh4OiBJbnQsIHk6IEludCk6IEludCA9IHggbWF0Y2gg
    ewogICAgY2FzZSAwID0+IHkKICAgIGNhc2UgXyA9PiBhZGQocHJlZCh4KSwgc3VjYyh5KSkKICB9
    CiAgZGVmIHN1bSh4OiBMaXN0W0ludF0pOiBJbnQgPSB4LmZvbGRMZWZ0KDApKGFkZCkKICBkZWYg
    bGVuZ3RoW0FdKHg6IExpc3RbQV0pOiBJbnQgPSB4LmZvbGRMZWZ0KDApIHsgKHosXykgPT4gc3Vj
    Yyh6KSB9CiAgZGVmIG1hcFtBLCBCXSh4OiBMaXN0W0FdLCBmOiBBID0+IEIpOiBMaXN0W0JdID0g
    eC5mb2xkUmlnaHQoTmlsOkxpc3RbQl0pIHsgKG4seikgPT4gZihuKSA6OiB6IH0KICBkZWYgZmls
    dGVyW0FdKHg6IExpc3RbQV0sIGY6IEEgPT4gQm9vbGVhbik6IExpc3RbQV0gPSB4LmZvbGRSaWdo
    dChOaWw6TGlzdFtBXSkgeyAobix6KSA9PiBpZihmKG4pKSAobiA6OiB6KSBlbHNlIHogfQogIGRl
    ZiBhcHBlbmRbQV0oeDogTGlzdFtBXSwgeTogTGlzdFtBXSk6IExpc3RbQV0gPSB4LmZvbGRSaWdo
    dCh5KSg6Oi5hcHBseSkKICBkZWYgY29uY2F0W0FdKHg6IExpc3RbTGlzdFtBXV0pOiBMaXN0W0Fd
    ID0geC5mb2xkUmlnaHQoTmlsOkxpc3RbQV0pKGFwcGVuZCkKICBkZWYgY29uY2F0TWFwW0EsIEJd
    KHg6IExpc3RbQV0sIGY6IEEgPT4gTGlzdFtCXSk6IExpc3RbQl0gPSBjb25jYXQobWFwKHgsZikp
    CiAgLyogTW9yZSBtZW1vcnktZWZmaWNpZW50IHdpdGggc3RyaWN0IGV2YWx1YXRpb246IHguZm9s
    ZFJpZ2h0KE5pbDpMaXN0W0JdKSB7IChuLHopID0+IGFwcGVuZChmKG4pLHopIH0gKi8KICBkZWYg
    bWF4aW11bSh4OiBMaXN0W0ludF0pOiBJbnQgPSB4LmZvbGRMZWZ0KDApIHsgKHosbikgPT4gaWYo
    bj56KSBuIGVsc2UgeiB9CiAgZGVmIHJldmVyc2VbQV0oeDogTGlzdFtBXSk6IExpc3RbQV0gPSB4
    LmZvbGRMZWZ0KE5pbDpMaXN0W0FdKSB7ICh6LG4pID0+IG4gOjogeiB9Cn0K

  22. vlad Says:

    http://gist.github.com/1929 (haskell)

    I’d love to know if I’m doing any of these “the ugly way.”

  23. Germán B. Says:

    Hey… I didn’t get a reply from my email, I want to know how I did!

  24. Tony Morris Says:

    Replies are coming. I’m quite busy at the moment.

  25. Jeff Says:

    Hi Tony

    These exercises were a great help to me in trying to learn scala. Any comments you have would be greatly appreciated.

    Ly8gWW91IGFyZSBub3QgcGVybWl0dGVkIHRvIHVzZSB0aGVzZSBMaXN0IG1ldGhvZHM6DQovLyAqIGxlbmd0aA0KLy8gKiBtYXANCi8vICogZmlsdGVyDQovLyAqIDo6OiAoYW5kIHZhcmlhdGlvbnMgc3VjaCBhcyArKykNCi8vICogZmxhdHRlbg0KLy8gKiBmbGF0TWFwDQovLyAqIHJldmVyc2UgKGFuZCB2YXJpYXRpb25zIGkuZS4gcmV2ZXJzZU1hcCwgcmV2ZXJzZV86OjopDQovLyBUaGlzIGFsc28gbWVhbnMgeW91IGFyZSBub3QgcGVybWl0dGVkIHRvIHVzZSBmb3ItY29tcHJlaGVuc2lvbnMgb24gTGlzdHMuDQovLyBZb3UgYXJlIHBlcm1pdHRlZCB0byB1c2UgdGhlIGZ1bmN0aW9ucyB5b3Ugd3JpdGUgeW91cnNlbGYuIEZvciBleGFtcGxlLCBFeGVyY2lzZSAyIG1heSB1c2UgRXhlcmNpc2UgMSBvciBFeGVyY2lzZSAzLg0KLy8gVXNpbmcgcGVybWl0dGVkIGV4aXN0aW5nIG1ldGhvZHMgd2hlcmUgYXBwcm9wcmlhdGUgd2lsbCBhdHRyYWN0IG1hcmtzIGZvciBlbGVnYW5jZS4NCg0KLy8gVE9UQUwgbWFya3M6ICAgIC82Ng0KDQpvYmplY3QgRXhlcmNpc2VzIHsNCiAgZGVmIHN1Y2MobjogSW50KSA9IG4gKyAxDQogIGRlZiBwcmVkKG46IEludCkgPSBuIC0gMQ0KDQogIC8vIEV4ZXJjaXNlIDENCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMQ0KICAvLyBDb3JyZWN0bmVzczogMi4wIG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAwLjUgbWFyaw0KICAvLyBFbGVnYW5jZTogMC41IG1hcmtzDQogIC8vIFRvdGFsOiAzDQogIGRlZiBhZGQoeDogSW50LCB5OiBJbnQpOiBJbnQgPSB7DQoNCiAgICBkZWYgYWRkSW1wbChhOkludCwgYjpJbnQpOkludCA9IHsNCiAgICAgIGlmIChiID09IDApIGENCiAgICAgIGVsc2UgYWRkKHN1Y2MoYSksIHByZWQoYikpDQogICAgfQ0KDQogICAgaWYgKHkgPiB4KSBhZGRJbXBsKHksIHgpDQogICAgZWxzZSBhZGRJbXBsKHgsIHkpDQogIH0NCg0KICAvLyBFeGVyY2lzZSAyDQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDINCiAgLy8gQ29ycmVjdG5lc3M6IDIuNSBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMSBtYXJrDQogIC8vIEVsZWdhbmNlOiAwLjUgbWFya3MNCiAgLy8gVG90YWw6IDQNCiAgZGVmIHN1bSh4OiBMaXN0W0ludF0pOiBJbnQgPSB4LmZvbGRMZWZ0KDApKGFkZCkNCg0KICAvLyBFeGVyY2lzZSAzDQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDINCiAgLy8gQ29ycmVjdG5lc3M6IDIuNSBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMSBtYXJrDQogIC8vIEVsZWdhbmNlOiAwLjUgbWFya3MNCiAgLy8gVG90YWw6IDQNCiAgZGVmIGxlbmd0aFtBXSh4OiBMaXN0W0FdKTogSW50ID0geC5mb2xkTGVmdCgwKXsgKGE6SW50LGI6QSkgPT4gc3VjYyhhKSB9DQoNCiAgLy8gRXhlcmNpc2UgNA0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA1DQogIC8vIENvcnJlY3RuZXNzOiA0LjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuMCBtYXJrDQogIC8vIEVsZWdhbmNlOiAxLjUgbWFya3MNCiAgLy8gVG90YWw6IDcNCiAgZGVmIG1hcFtBLCBCXSh4OiBMaXN0W0FdLCBmOiBBID0+IEIpOiBMaXN0W0JdID0gew0KDQogICAgZGVmIG1hcEltcGwoaW46IExpc3RbQV0sIG91dDogTGlzdFtCXSk6TGlzdFtCXSA9IHsNCiAgICAgIGluIG1hdGNoIHsNCiAgICAgICAgY2FzZSBoZWFkIDo6IHRhaWwgPT4gbWFwSW1wbCh0YWlsLCBmKGhlYWQpIDo6IG91dCkNCiAgICAgICAgY2FzZSBfID0+IG91dA0KICAgICAgfQ0KICAgIH0NCg0KICAgIHJldmVyc2UobWFwSW1wbCh4LCBOaWwpKQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgNQ0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA1DQogIC8vIENvcnJlY3RuZXNzOiA0LjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuNSBtYXJrcw0KICAvLyBFbGVnYW5jZTogMSBtYXJrDQogIC8vIFRvdGFsOiA3DQogIGRlZiBmaWx0ZXJbQV0oeDogTGlzdFtBXSwgZjogQSA9PiBCb29sZWFuKTogTGlzdFtBXSA9IHsNCg0KICAgIGRlZiBmaWx0ZXJJbXBsKGluOkxpc3RbQV0sIG91dDpMaXN0W0FdKTpMaXN0W0FdID0gew0KICAgICAgaW4gbWF0Y2ggew0KICAgICAgICBjYXNlIGhlYWQgOjogdGFpbCA9PiB7DQogICAgICAgICAgaWYgKGYoaGVhZCkpIGZpbHRlckltcGwodGFpbCwgaGVhZCA6OiBvdXQpDQogICAgICAgICAgZWxzZSBmaWx0ZXJJbXBsKHRhaWwsIG91dCkNCiAgICAgICAgfQ0KICAgICAgICBjYXNlIF8gPT4gb3V0DQogICAgICB9DQogICAgfQ0KDQogICAgcmV2ZXJzZShmaWx0ZXJJbXBsKHgsIE5pbCkpDQogIH0NCg0KICAvLyBFeGVyY2lzZSA2DQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDUNCiAgLy8gQ29ycmVjdG5lc3M6IDQuNSBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMS41IG1hcmtzDQogIC8vIEVsZWdhbmNlOiAxIG1hcmsNCiAgLy8gVG90YWw6IDcNCiAgZGVmIGFwcGVuZFtBXSh4OiBMaXN0W0FdLCB5OiBMaXN0W0FdKTogTGlzdFtBXSA9IHsNCg0KICAgIGRlZiBhcHBlbmRJbXBsKHA6TGlzdFtBXSwgcTpMaXN0W0FdKTpMaXN0W0FdID0gew0KICAgICAgcCBtYXRjaCB7DQogICAgICAgIGNhc2UgaGVhZCA6OiB0YWlsID0+IGFwcGVuZEltcGwodGFpbCwgaGVhZCA6OiBxKQ0KICAgICAgICBjYXNlIF8gPT4gcQ0KICAgICAgfQ0KICAgIH0NCg0KICAgIGFwcGVuZEltcGwocmV2ZXJzZSh4KSwgeSkNCiAgfQ0KDQogIC8vIEV4ZXJjaXNlIDcNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogNQ0KICAvLyBDb3JyZWN0bmVzczogNC41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAxLjUgbWFya3MNCiAgLy8gRWxlZ2FuY2U6IDEgbWFyaw0KICAvLyBUb3RhbDogNw0KICBkZWYgY29uY2F0W0FdKHg6IExpc3RbTGlzdFtBXV0pOiBMaXN0W0FdID0gKExpc3RbQV0oKSAvOiB4KShhcHBlbmQpDQoNCiAgLy8gRXhlcmNpc2UgOA0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA3DQogIC8vIENvcnJlY3RuZXNzOiA1LjAgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuNSBtYXJrcw0KICAvLyBFbGVnYW5jZTogMS41IG1hcmsNCiAgLy8gVG90YWw6IDgNCiAgZGVmIGNvbmNhdE1hcFtBLCBCXSh4OiBMaXN0W0FdLCBmOiBBID0+IExpc3RbQl0pOiBMaXN0W0JdID0gY29uY2F0KG1hcCh4LGYpKQ0KDQogIC8vIEV4ZXJjaXNlIDkNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogOA0KICAvLyBDb3JyZWN0bmVzczogMy41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAzLjAgbWFya3MNCiAgLy8gRWxlZ2FuY2U6IDIuNSBtYXJrcw0KICAvLyBUb3RhbDogOQ0KICBkZWYgbWF4aW11bSh4OiBMaXN0W0ludF0pOiBJbnQgPSB7DQogICAgeCBtYXRjaCB7DQogICAgICBjYXNlIE5pbCA9PiB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiQ2FuXCd0IGNhbGN1bGF0ZSBtYXhpbXVtIG9mIGVtcHR5IGxpc3QuXCIpDQogICAgICBjYXNlIF8gPT4geC5yZWR1Y2VMZWZ0IHsgKGE6SW50LCBiOkludCkgPT4gaWYgKGEgPiBiKSBhIGVsc2UgYiB9DQogICAgfQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgMTANCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMTANCiAgLy8gQ29ycmVjdG5lc3M6IDUuMCBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMi41IG1hcmtzDQogIC8vIEVsZWdhbmNlOiAyLjUgbWFya3MNCiAgLy8gVG90YWw6IDEwDQogIGRlZiByZXZlcnNlW0FdKHg6IExpc3RbQV0pOiBMaXN0W0FdID0gew0KDQogICAgZGVmIHJldmVyc2VJbXBsKGluOkxpc3RbQV0sIG91dDpMaXN0W0FdKTpMaXN0W0FdID0gew0KICAgICAgaW4gbWF0Y2ggew0KICAgICAgICBjYXNlIGhlYWQgOjogdGFpbCA9PiByZXZlcnNlSW1wbCh0YWlsLCBoZWFkIDo6IG91dCkNCiAgICAgICAgY2FzZSBfID0+IG91dA0KICAgICAgfQ0KICAgIH0NCg0KICAgIHJldmVyc2VJbXBsKHgsIE5pbCkNCiAgfQ0KfQ0K

  26. Stefan Wagner Says:

    Well - I’m late to this excercises, hoping, not to be too late.
    Will that uuencoding work?

    begin 644 exc-001.uue
    M+R\@”45X8V5R8VES97,@*#$I”B\O”5%U96QL93H*+R\):’1T<#HO+V)L;V<N
    M=&UO<G)I<RYN970O<V-A;&$M97AE<F-I<V5S+69O<BUB96=I;FYE&5R8VES97,@”GL*”61E9B!S=6-C(”AN.B!);G0I(#T@;B`K(#$*”61E9B!P
    M&5R8VES92`Q”@ED968@861D
    M(”AX.B!);G0L(’DZ($EN=”DZ($EN=”`](`H)”6EF(”AY(#X@>”D@(”`@”@D)
    M861D(”AY+”!X*2!E;’-E”@D):68@*’D@/3T@,”D@(&$*”0EX(&5L<V4@”@D)
    M861D(”AS=6-C(”AX*2P@2DI”@H)+R\@17AE<F-I#H@3&ES=%M);G1=*3H@26YT(#T@”@D):68@*’@@/3T@3FEL*0H)
    M”3`@96QS90H)”6%D9″`H>”YH96%D+”!S=6T@*’@N=&%I;”DI”@H)+R\@17AE
    M<F-I<V4@,PH)9&5F(&QE;F=T:”!;05T@*’@Z($QI<W1;05TI.B!);G0@/0H)
    M”6EF(”AX(#T]($YI;”D@”@D),”!E;’-E”@D)&5R8VES92`T”@ED968@;6%P(%M!+”!”72`H>#H@3&ES
    M=%M!72P@9CH@02`]/B!”*3H@3&ES=%M”72`](`H)”6EF(”AX(#T]($YI;”D@
    M”@D)3&ES=”`H*2!E;’-E”@D)9B`H>”YH96%D*2`Z.B!M87`@*’@N=&%I;”P@
    M9BD*”@DO+R!%>&5R8VES92`U”@ED968@9FEL=&5R(%M!72`H>#H@3&ES=%M!
    M72P@9CH@02`]/B!”;V]L96%N*2`Z($QI<W1;05T@/0H)”6EF(”AX(#T]($YI
    M;”D@”@D)3FEL(&5L<V4*”0EI9B`H9BAX+FAE860I*0H)”7@N:&5A9″`Z.B!F
    M:6QT97(@*’@N=&%I;”P@9BD@96QS90H)”69I;’1E“YT86EL+”!F*0H)
    M”0H)+R\@17AE<F-I<V4@-@H)9&5F(&%P<&5N9%M!72AX.B!,:7-T6T%=+”!Y
    M.B!,:7-T6T%=*3H@3&ES=%M!72`](`H)”6EF(”AX(#T]($YI;”D*”0EY(&5L
    M<V4*”0EX+FAE860@.CH@87!P96YD(”AX+G1A:6PL(’DI”@H)+R\@17AE<F-I
    M<V4@-PH)9&5F(&-O;F-A=”!;05T@*’@Z($QI<W0@6TQI<W0@6T%=72D@.B!,
    M:7-T6T%=(#T@”@D):68@*’@@/3T@3FEL*2`*”0E.:6P@96QS92`*”0EA<’!E
    M;F0@*’@N:&5A9″P@8V]N8V%T(”AX+G1A:6PI*0H)”0H)+R\@17AE<F-I<V4@
    M.`H)9&5F(&-O;F-A=$UA<”!;02P@0ET@*’@Z($QI<W1;05TL(&8Z($$@/3X@
    M3&ES=%M”72DZ($QI<W1;0ET@/0H)”6EF(”AX(#T]($YI;”D@”@D)3FEL(&5L
    M<V4*”0EA<’!E;F0@*&8@*’@N:&5A9″DL(&-O;F-A=$UA”YT86EL+”!F
    M*2D*”@DO+R!%>&5R8VES92`Y”@ED968@;6%X:6UU;2`H>#H@3&ES=%M);G1=
    M*2`Z($EN=”`](`H)”6EF(”AX(#T]($YI;”D@”@D)97)R;W(@*”)M87AI;75M
    M(&]F(&5M<’1Y($QI<W0@&EM=6T@
    M*’@N=&%I;”DI”@D)>”YH96%D(&5L<V4*”0EM87AI;75M(”AX+G1A:6PI”@D*
    M”2\O($5X97)C:7-E(#$P”@ED968@<F5V97)S95M!72AX.B!,:7-T6T%=*3H@
    M3&ES=%M!72`](`H)”6EF(”AX(#T]($YI;”D*”0E.:6P@96QS90H)”6EF(”AX
    M+G1A:6P@/3T@3FEL*2`*”0E,:7-T(”AX+FAE860I(&5L<V4@”@D)87!P96YD
    G(”AR979E<G-E(”AX+G1A:6PI+”!,:7-T(”AX+FAE860I*2`*?0H*
    `
    end

  27. Tony Morris Says:

    You’re not late mate. I’ve still got to write up some answers! I hope everyone isn’t hanging out for those (let me know if it’s important to you and I’ll raise the priority). I’m off to Vanuatu for a week, bye!

  28. Stefan Wagner Says:

    Don’t hasten! I believe my answers are correct, and I compared them to the other ones (if I could uudecode them).
    Others where much more compact due to usage of foldRight, which I looked up now.

Leave a Reply