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") }
July 15th, 2008 at 11:36 am
Well, this is pretty bad ass. I’m going to attempt these in scala and haskell when I get a chance. Great idea! Thanks.
July 15th, 2008 at 12:50 pm
I finished them. If I submit this to you, can I get credit for the course you teach?
July 15th, 2008 at 1:07 pm
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"July 16th, 2008 at 12:37 am
I like oatmeal raisin!
Ly8gVE9UQUwgbWFya3M6ICAgIC82Ng0KDQpvYmplY3QgRXhlcmNpc2VzIHsNCiAgZGVmIHN1Y2MobjogSW50KSA9IG4gKyAxDQogIGRlZiBwcmVkKG46IEludCkgPSBuIC0gMQ0KDQogIC8vIEV4ZXJjaXNlIDENCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMQ0KICAvLyBDb3JyZWN0bmVzczogMi4wIG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAwLjUgbWFyaw0KICAvLyBFbGVnYW5jZTogMC41IG1hcmtzDQogIC8vIFRvdGFsOiAzDQogIGRlZiBhZGQoeDogSW50LCB5OiBJbnQpOiBJbnQgPSB7DQogICAgIGRlZiBhKG46IEludCwgcmVzOiBJbnQpOiBJbnQgPSB7DQogICAgICAgIGlmIChuID09IDApIHsNCiAgICAgICAgICAgcmVzDQogICAgICAgIH0gZWxzZSBpZiAobiA+IDApIHsNCiAgICAgICAgICAgYShwcmVkKG4pLCBzdWNjKHJlcykpDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgIGEoc3VjYyhuKSwgcHJlZChyZXMpKQ0KICAgICAgICB9DQogICAgIH0NCiAgICAgYSh4LCB5KQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgMg0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiAyDQogIC8vIENvcnJlY3RuZXNzOiAyLjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEgbWFyaw0KICAvLyBFbGVnYW5jZTogMC41IG1hcmtzDQogIC8vIFRvdGFsOiA0DQogIGRlZiBzdW0oeDogTGlzdFtJbnRdKTogSW50ID0gew0KICAgICB4LmZvbGRSaWdodCAoMCkgKGFkZChfLCBfKSkNCiAgfQ0KDQogIC8vIEV4ZXJjaXNlIDMNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMg0KICAvLyBDb3JyZWN0bmVzczogMi41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAxIG1hcmsNCiAgLy8gRWxlZ2FuY2U6IDAuNSBtYXJrcw0KICAvLyBUb3RhbDogNA0KICBkZWYgbGVuZ3RoW0FdKHg6IExpc3RbQV0pOiBJbnQgPSB7DQogICAgIHguZm9sZFJpZ2h0ICgwKSAoKHksIG4pID0+IHN1Y2MobikpDQogIH0NCg0KICAvLyBFeGVyY2lzZSA0DQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDUNCiAgLy8gQ29ycmVjdG5lc3M6IDQuNSBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMS4wIG1hcmsNCiAgLy8gRWxlZ2FuY2U6IDEuNSBtYXJrcw0KICAvLyBUb3RhbDogNw0KICBkZWYgbWFwW0EsIEJdKHg6IExpc3RbQV0sIGY6IEEgPT4gQik6IExpc3RbQl0gPSB7DQogICAgIHguZm9sZFJpZ2h0IChMaXN0W0JdKCkpICgoYSwgbCkgPT4gZihhKTo6bCkNCiAgfQ0KDQogIC8vIEV4ZXJjaXNlIDUNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogNQ0KICAvLyBDb3JyZWN0bmVzczogNC41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAxLjUgbWFya3MNCiAgLy8gRWxlZ2FuY2U6IDEgbWFyaw0KICAvLyBUb3RhbDogNw0KICBkZWYgZmlsdGVyW0FdKHg6IExpc3RbQV0sIGY6IEEgPT4gQm9vbGVhbik6IExpc3RbQV0gPSB7DQogICAgIHguZm9sZFJpZ2h0IChMaXN0W0FdKCkpICgoYSwgbCkgPT4gaWYgKGYoYSkpIGE6OmwgZWxzZSBsKQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgNg0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA1DQogIC8vIENvcnJlY3RuZXNzOiA0LjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuNSBtYXJrcw0KICAvLyBFbGVnYW5jZTogMSBtYXJrDQogIC8vIFRvdGFsOiA3DQogIGRlZiBhcHBlbmRbQV0oeDogTGlzdFtBXSwgeTogTGlzdFtBXSk6IExpc3RbQV0gPSB7DQogICAgIHguZm9sZFJpZ2h0ICh5KSAoKGEsIGwpID0+IGE6OmwpDQogIH0NCg0KICAvLyBFeGVyY2lzZSA3DQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDUNCiAgLy8gQ29ycmVjdG5lc3M6IDQuNSBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMS41IG1hcmtzDQogIC8vIEVsZWdhbmNlOiAxIG1hcmsNCiAgLy8gVG90YWw6IDcNCiAgZGVmIGNvbmNhdFtBXSh4OiBMaXN0W0xpc3RbQV1dKTogTGlzdFtBXSA9IHsNCiAgICAgeC5mb2xkUmlnaHQgKExpc3RbQV0oKSkgKChhLCBsKSA9PiBhcHBlbmQoYSwgbCkpDQogIH0NCg0KICAvLyBFeGVyY2lzZSA4DQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDcNCiAgLy8gQ29ycmVjdG5lc3M6IDUuMCBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMS41IG1hcmtzDQogIC8vIEVsZWdhbmNlOiAxLjUgbWFyaw0KICAvLyBUb3RhbDogOA0KICBkZWYgY29uY2F0TWFwW0EsIEJdKHg6IExpc3RbQV0sIGY6IEEgPT4gTGlzdFtCXSk6IExpc3RbQl0gPSB7DQogICAgIGNvbmNhdChtYXAoeCwgZikpDQogIH0NCiAgDQogIC8vIEV4ZXJjaXNlIDkNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogOA0KICAvLyBDb3JyZWN0bmVzczogMy41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAzLjAgbWFya3MNCiAgLy8gRWxlZ2FuY2U6IDIuNSBtYXJrcw0KICAvLyBUb3RhbDogOQ0KICBkZWYgbWF4aW11bSh4OiBMaXN0W0ludF0pOiBJbnQgPSB4IG1hdGNoIHsNCiAgICAgY2FzZSBOaWwgICAgID0+IGVycm9yKFxcXCJtYXhpbXVtIG9mIGVtcHR5IGxpc3QgaXMgdW5kZWZpbmVkIVxcXCIpDQogICAgIGNhc2UgKGU6OmVzKSA9PiBlcy5mb2xkUmlnaHQgKGUpICgoeSwgbikgPT4gaWYgKHkgPiBuKSB5IGVsc2UgbikNCiAgfQ0KICAgICANCg0KICAvLyBFeGVyY2lzZSAxMA0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiAxMA0KICAvLyBDb3JyZWN0bmVzczogNS4wIG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAyLjUgbWFya3MNCiAgLy8gRWxlZ2FuY2U6IDIuNSBtYXJrcw0KICAvLyBUb3RhbDogMTANCiAgZGVmIHJldmVyc2VbQV0oeDogTGlzdFtBXSk6IExpc3RbQV0gPSB7DQogICAgIHguZm9sZExlZnQgKExpc3RbQV0oKSkgKChsLCB4KSA9PiB4OjpsKQ0KICB9DQp9
July 16th, 2008 at 7:06 am
w00t!
Ly8gWW91IGFyZSBub3QgcGVybWl0dGVkIHRvIHVzZSB0aGVzZSBMaXN0IG1ldGhvZHM6DQovLyAqIGxlbmd0aA0KLy8gKiBtYXANCi8vICogZmlsdGVyDQovLyAqIDo6OiAoYW5kIHZhcmlhdGlvbnMgc3VjaCBhcyArKykNCi8vICogZmxhdHRlbg0KLy8gKiBmbGF0TWFwDQovLyAqIHJldmVyc2UgKGFuZCB2YXJpYXRpb25zIGkuZS4gcmV2ZXJzZU1hcCwgcmV2ZXJzZV86OjopDQovLyBUaGlzIGFsc28gbWVhbnMgeW91IGFyZSBub3QgcGVybWl0dGVkIHRvIHVzZSBmb3ItY29tcHJlaGVuc2lvbnMgb24gTGlzdHMuDQovLyBZb3UgYXJlIHBlcm1pdHRlZCB0byB1c2UgdGhlIGZ1bmN0aW9ucyB5b3Ugd3JpdGUgeW91cnNlbGYuIEZvciBleGFtcGxlLCBFeGVyY2lzZSAyIG1heSB1c2UgRXhlcmNpc2UgMSBvciBFeGVyY2lzZSAzLg0KLy8gVXNpbmcgcGVybWl0dGVkIGV4aXN0aW5nIG1ldGhvZHMgd2hlcmUgYXBwcm9wcmlhdGUgd2lsbCBhdHRyYWN0IG1hcmtzIGZvciBlbGVnYW5jZS4NCg0KLy8gVE9UQUwgbWFya3M6ICAgIC82Ng0KDQpvYmplY3QgRXhlcmNpc2VzIHsNCiAgZGVmIHN1Y2MobjogSW50KSA9IG4gKyAxDQogIGRlZiBwcmVkKG46IEludCkgPSBuIC0gMQ0KDQogIC8vIEV4ZXJjaXNlIDENCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMQ0KICAvLyBDb3JyZWN0bmVzczogMi4wIG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAwLjUgbWFyaw0KICAvLyBFbGVnYW5jZTogMC41IG1hcmtzDQogIC8vIFRvdGFsOiAzDQogIGRlZiBhZGQoeDogSW50LCB5OiBJbnQpOiBJbnQgPSB4IG1hdGNoIHsNCiAgICBjYXNlIDAgPT4gaWYoeSA9PSAwKSAwIGVsc2UgYWRkKHksIHgpDQogICAgY2FzZSBfID0+IGlmKHggPiAwKSBzdWNjKGFkZChwcmVkKHgpLCB5KSkNCiAgICAgICAgICAgICAgZWxzZSAgICAgIHByZWQoYWRkKHN1Y2MoeCksIHkpKQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgMg0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiAyDQogIC8vIENvcnJlY3RuZXNzOiAyLjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEgbWFyaw0KICAvLyBFbGVnYW5jZTogMC41IG1hcmtzDQogIC8vIFRvdGFsOiA0DQogIGRlZiBzdW0oeDogTGlzdFtJbnRdKTogSW50ID0geCBtYXRjaCB7DQogICAgY2FzZSBoZWFkIDo6IE5pbCAgPT4gYWRkKGhlYWQsIDApDQogICAgY2FzZSBoZWFkIDo6IHRhaWwgPT4gYWRkKGhlYWQsIHN1bSh0YWlsKSkNCiAgfQ0KDQogIC8vIEV4ZXJjaXNlIDMNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMg0KICAvLyBDb3JyZWN0bmVzczogMi41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAxIG1hcmsNCiAgLy8gRWxlZ2FuY2U6IDAuNSBtYXJrcw0KICAvLyBUb3RhbDogNA0KICBkZWYgbGVuZ3RoW0FdKHg6IExpc3RbQV0pOiBJbnQgPSB4IG1hdGNoIHsNCiAgICBjYXNlIE5pbCA9PiAwDQogICAgY2FzZSBoZWFkIDo6IHRhaWwgPT4gc3VjYyhsZW5ndGgodGFpbCkpDQogIH0NCg0KICAvLyBFeGVyY2lzZSA0DQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDUNCiAgLy8gQ29ycmVjdG5lc3M6IDQuNSBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMS4wIG1hcmsNCiAgLy8gRWxlZ2FuY2U6IDEuNSBtYXJrcw0KICAvLyBUb3RhbDogNw0KICBkZWYgbWFwW0EsIEJdKHg6IExpc3RbQV0sIGY6IEEgPT4gQik6IExpc3RbQl0gPSB4IG1hdGNoIHsNCiAgICBjYXNlIE5pbCA9PiBOaWwNCiAgICBjYXNlIGhlYWQgOjogdGFpbCA9PiBmKGhlYWQpIDo6IG1hcCh0YWlsLCBmKQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgNQ0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA1DQogIC8vIENvcnJlY3RuZXNzOiA0LjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuNSBtYXJrcw0KICAvLyBFbGVnYW5jZTogMSBtYXJrDQogIC8vIFRvdGFsOiA3DQogIGRlZiBmaWx0ZXJbQV0oeDogTGlzdFtBXSwgZjogQSA9PiBCb29sZWFuKTogTGlzdFtBXSA9IHggbWF0Y2ggew0KICAgIGNhc2UgTmlsID0+IE5pbA0KICAgIGNhc2UgaGVhZCA6OiB0YWlsID0+IGlmKGYoaGVhZCkpIGhlYWQgOjogZmlsdGVyKHRhaWwsIGYpDQogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgZmlsdGVyKHRhaWwsIGYpDQogIH0NCg0KICAvLyBFeGVyY2lzZSA2DQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDUNCiAgLy8gQ29ycmVjdG5lc3M6IDQuNSBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMS41IG1hcmtzDQogIC8vIEVsZWdhbmNlOiAxIG1hcmsNCiAgLy8gVG90YWw6IDcNCiAgZGVmIGFwcGVuZFtBXSh4OiBMaXN0W0FdLCB5OiBMaXN0W0FdKTogTGlzdFtBXSA9IHggbWF0Y2ggew0KICAgIGNhc2UgTmlsID0+IHkNCiAgICBjYXNlIGhlYWQgOjogTmlsICA9PiBoZWFkIDo6IHkNCiAgICBjYXNlIGhlYWQgOjogdGFpbCA9PiBoZWFkIDo6IGFwcGVuZCh0YWlsLCB5KQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgNw0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA1DQogIC8vIENvcnJlY3RuZXNzOiA0LjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuNSBtYXJrcw0KICAvLyBFbGVnYW5jZTogMSBtYXJrDQogIC8vIFRvdGFsOiA3DQogIGRlZiBjb25jYXRbQV0oeDogTGlzdFtMaXN0W0FdXSk6IExpc3RbQV0gPSB4IG1hdGNoIHsNCiAgICBjYXNlIGhlYWQgOjogTmlsID0+IGhlYWQNCiAgICBjYXNlIGhlYWQgOjogdGFpbCA9PiBhcHBlbmQoaGVhZCwgY29uY2F0KHRhaWwpKQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgOA0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA3DQogIC8vIENvcnJlY3RuZXNzOiA1LjAgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuNSBtYXJrcw0KICAvLyBFbGVnYW5jZTogMS41IG1hcmsNCiAgLy8gVG90YWw6IDgNCiAgZGVmIGNvbmNhdE1hcFtBLCBCXSh4OiBMaXN0W0FdLCBmOiBBID0+IExpc3RbQl0pOiBMaXN0W0JdID0geCBtYXRjaCB7DQogICAgY2FzZSBoZWFkIDo6IE5pbCA9PiBmKGhlYWQpDQogICAgY2FzZSBoZWFkIDo6IHRhaWwgPT4gYXBwZW5kKGYoaGVhZCksIGNvbmNhdE1hcCh0YWlsLCBmKSkNCiAgfQ0KICANCiAgLy8gRXhlcmNpc2UgOQ0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA4DQogIC8vIENvcnJlY3RuZXNzOiAzLjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDMuMCBtYXJrcw0KICAvLyBFbGVnYW5jZTogMi41IG1hcmtzDQogIC8vIFRvdGFsOiA5DQogIGRlZiBtYXhpbXVtKHg6IExpc3RbSW50XSk6IEludCA9IHggbWF0Y2ggew0KICAgIGNhc2UgaGVhZCA6OiBOaWwgPT4gaGVhZA0KICAgIGNhc2UgaGVhZCA6OiB0YWlsID0+IHsNCiAgICAgIHZhbCBtYXhfdGFpbCA9IG1heGltdW0odGFpbCkNCiAgICAgIGlmKGhlYWQgPiBtYXhfdGFpbCkgaGVhZCBlbHNlIG1heF90YWlsDQogICAgfQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgMTANCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMTANCiAgLy8gQ29ycmVjdG5lc3M6IDUuMCBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMi41IG1hcmtzDQogIC8vIEVsZWdhbmNlOiAyLjUgbWFya3MNCiAgLy8gVG90YWw6IDEwDQogIGRlZiByZXZlcnNlW0FdKHg6IExpc3RbQV0pOiBMaXN0W0FdID0geCBtYXRjaCB7DQogICAgY2FzZSBoZWFkIDo6IHRhaWwgPT4gYXBwZW5kKHJldmVyc2UodGFpbCksIExpc3QoaGVhZCkpDQogICAgY2FzZSBOaWwgPT4gTmlsDQogIH0NCn0NCg0Kb2JqZWN0IE1haW4gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7DQogIHByaW50bG4oRXhlcmNpc2VzLmFkZCgxMCwyKSkNCiAgcHJpbnRsbihFeGVyY2lzZXMuc3VtKExpc3QoMTAsMiwzLDUsNikpKQ0KICBwcmludGxuKEV4ZXJjaXNlcy5sZW5ndGgoTGlzdCgxMCwyLDMsNSw2KSkpDQogIHByaW50bG4oRXhlcmNpc2VzLm1hcChMaXN0KDEsMiwzLDQsNSksICh4OkludCkgPT4geCAqIHgpKQ0KICBwcmludGxuKEV4ZXJjaXNlcy5maWx0ZXIoTGlzdCgxLDIsMyw0LDUpLCAoeDpJbnQpID0+IHggPiAzKSkNCiAgcHJpbnRsbihFeGVyY2lzZXMuYXBwZW5kKExpc3QoMSwyLDMpLCBMaXN0KDQsNSw2KSkpDQogIHByaW50bG4oRXhlcmNpc2VzLmNvbmNhdChMaXN0KExpc3QoMSwyLDMpLCBMaXN0KDQsNSw2KSwgTGlzdCg3LDgsOSkpKSkNCiAgcHJpbnRsbihFeGVyY2lzZXMuY29uY2F0TWFwKExpc3QoMSwyLDMsNCw1LDYpLCAoeDpJbnQpID0+IExpc3QoeCwgeCAqIDIsIHggKiAzKSkpDQogIHByaW50bG4oRXhlcmNpc2VzLm1heGltdW0oMSA6OiA1IDo6IDMgOjogTmlsKSkNCiAgcHJpbnRsbihFeGVyY2lzZXMucmV2ZXJzZSgxIDo6IDIgOjogMyA6OiBOaWwpKQ0KfQ0KDQo=
July 16th, 2008 at 11:08 am
You wrote: “Haskell is another such language and I will convert these exercises to Haskell if prompted.”
I hereby prompt you.
July 16th, 2008 at 8:57 pm
Wait, list concatenation is not allowed? How do I construct/deconstruct a list then (thinking x:xs in Haskell)?
July 17th, 2008 at 4:30 am
@Tobias: the : operator is cons, not concatenation.
July 17th, 2008 at 4:48 am
(the list concatenation operator in Haskell is ++)
July 17th, 2008 at 4:50 am
I take it the fold operations are forbidden too?
July 17th, 2008 at 5:44 am
No, folds are not forbidden.
July 17th, 2008 at 6:06 am
vlad thanks, guess I was confused by the ::: operator.
without checking the others:
LS0gdGhpcyBjb3VsZCBkZS1ib2lsZXJwbGF0ZSB0aGUgY29kZSBhIGJpdCA7KQ0KLS0oPykgOjogQm9vbCAtPiAodCwgdCkgLT4gdA0KYSA/IChiLCBjKSA9IGlmIGEgdGhlbiBiIGVsc2UgYw0KDQpteXN1Y2MgbiA9IG4gKyAxDQpteXByZWQgbiA9IG4gLSAxDQoNCm15YWRkIHggeSA9IGlmIHkgPiAwDQogICAgICAgICAgICB0aGVuIG15YWRkIChteXN1Y2MgeCkgKG15cHJlZCB5KQ0KICAgICAgICAgICAgZWxzZSB4DQoNCm15c3VtICh4OnhzKSA9IGlmIG51bGwgeHMNCiAgICAgICAgICAgICAgIHRoZW4geA0KICAgICAgICAgICAgICAgZWxzZSBteWFkZCB4IChteXN1bSB4cykNCg0KbXlsZW5ndGggKHg6eHMpID0gaWYgbnVsbCB4cw0KICAgICAgICAgICAgICAgICAgdGhlbiAxDQogICAgICAgICAgICAgICAgICBlbHNlIHN1Y2MgJCBteWxlbmd0aCB4cw0KDQpteW1hcCAoeDp4cykgZiA9IGlmIG51bGwgeHMNCiAgICAgICAgICAgICAgICAgdGhlbiAoZiB4KSA6IFtdDQogICAgICAgICAgICAgICAgIGVsc2UgKGYgeCkgOiBteW1hcCB4cyBmDQoNCm15ZmlsdGVyIGxpc3QgZiA9IG15ZmlsdGVyXCcgbGlzdCBmIFtdDQogICAgICAgICAgICAgICAgICB3aGVyZSBteWZpbHRlclwnICh4OnhzKSBmIHJzbHQgPSBpZiBmIHgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiB4IDogKG15ZmlsdGVyXCcgeHMgZiByc2×0KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIChteWZpbHRlclwnIHhzIGYgcnNsdCkNCiAgICAgICAgICAgICAgICAgICAgICAgIG15ZmlsdGVyXCcgXyAgICAgIF8gcnNsdCA9IHJzbHQNCg0KbXlhcHBlbmQgeHMgeXMgPSAodHJhdmVyc2UgeHMgLiB0cmF2ZXJzZSB5cykgW10NCiAgICAgICAgICAgICAgICAgd2hlcmUgdHJhdmVyc2UgKHg6eHMpIHJzbHQgPSBpZiBudWxsIHhzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiB4IDogcnNsdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeCA6ICh0cmF2ZXJzZSB4cyByc2×0KQ0KICAgICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZSBfICAgICAgcnNsdCA9IHJzbHQNCg0KbXljb25jYXQgKHg6eHMpID0gaWYgbnVsbCB4cw0KICAgICAgICAgICAgICAgICAgdGhlbiB4DQogICAgICAgICAgICAgICAgICBlbHNlIG15YXBwZW5kIHggKG15Y29uY2F0IHhzKQ0KDQotLSBub3Qgc3VyZSB3aGljaCB2ZXJzaW9uIGlzIGNvcnJlY3QgYWNjb3JkaW5nIHRvIHRoZSBkZWZpbml0aW9uDQpteWNvbmNhdE1hcCAoeDp4cykgZiA9IGlmIG51bGwgeHMNCiAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBmIHgNCiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBteWFwcGVuZCAoZiB4KSAobXljb25jYXRNYXAgeHMgZikNCi0tbXljb25jYXRNYXAgKHg6eHMpIGYgPSBpZiBudWxsIHhzDQotLSAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBteW1hcCB4IGYNCi0tICAgICAgICAgICAgICAgICAgICAgICBlbHNlIG15YXBwZW5kIChteW1hcCB4IGYpIChteWNvbmNhdE1hcCB4cyBmKQ0KDQpteW1heGltdW0gKHg6eTp0YWlsKSA9IGlmIG51bGwgdGFpbA0KICAgICAgICAgICAgICAgICAgICAgICB0aGVuICh5ID4geCkgPyAoeSwgeCkNCiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiB5ID4geA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gbXltYXhpbXVtICh5OnRhaWwpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBteW1heGltdW0gKHg6dGFpbCkNCm15bWF4aW11bSBfICAgICAgICAgID0gZXJyb3IgXCJMaXN0IGlzIHRvIHNob3J0LlwiDQoNCm15cmV2ZXJzZSAoeDp4cykgPSBpZiBudWxsIHhzDQogICAgICAgICAgICAgICAgICAgdGhlbiBbeF0NCiAgICAgICAgICAgICAgICAgICBlbHNlIG15YXBwZW5kIChteXJldmVyc2UgeHMpIFt4XQ0K
(hey wait, folds are ok? arghh..)
July 17th, 2008 at 6:15 am
mh seems like base64 didn’t work out.
here is a paste: http://haskell.pastebin.com/m68231f5f
July 17th, 2008 at 8:25 am
After all, some people would lead you to believe that understanding fold* is half (or maybe a quarter) of the battle.
July 17th, 2008 at 8:45 am
Using fold is more elegant.
I should have perhaps defined a custom algebraic type that is isomorphic to
scala.Listand predefined the folds. Sorry for this confusion. The Haskell version will do this.July 17th, 2008 at 8:56 am
Are we intended to use pattern matching?
July 17th, 2008 at 11:18 am
“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.
July 18th, 2008 at 2:22 am
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=
July 18th, 2008 at 6:48 am
Thanks!
I tried to stick with the minimal set of operations and used pattern matching/recursion everywhere.
I have a lot of fun solving the exercises
I’ll try again with folds
July 18th, 2008 at 10:57 am
Had great fun doing this!
cGFja2FnZSBhbGdvcy5leGVyY2lzZXMNCg0KLy8gQmluaWwgVGhvbWFzDQpvYmplY3QgRXhlcmNpc2VzIHsNCiAgZGVmIHN1Y2MobjogSW50KSA9IG4gKyAxDQogIGRlZiBwcmVkKG46IEludCkgPSBuIC0gMQ0KDQogIC8vIEV4ZXJjaXNlIDENCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMQ0KICAvLyBDb3JyZWN0bmVzczogMi4wIG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAwLjUgbWFyaw0KICAvLyBFbGVnYW5jZTogMC41IG1hcmtzDQogIC8vIFRvdGFsOiAzDQogIGRlZiBhZGQoeDogSW50LCB5OiBJbnQpOiBJbnQgPSAoeCwgeSkgbWF0Y2ggew0KICAgIGNhc2UgKDAsIF8pID0+IHkNCiAgICBjYXNlIChfLCAwKSA9PiB4DQogICAgY2FzZSAoXywgXykgPT4gYWRkKHN1Y2MoeCksIHByZWQoeSkpDQogIH0NCiAgDQoNCiAgLy8gRXhlcmNpc2UgMg0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiAyDQogIC8vIENvcnJlY3RuZXNzOiAyLjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEgbWFyaw0KICAvLyBFbGVnYW5jZTogMC41IG1hcmtzDQogIC8vIFRvdGFsOiA0DQogIGRlZiBzdW0oeDogTGlzdFtJbnRdKTogSW50ID0geCBtYXRjaCB7DQogICAgY2FzZSBOaWwgPT4gMA0KICAgIGNhc2UgeCA6OiB4cyA9PiBhZGQoeCwgc3VtKHhzKSkNCiAgfQ0KDQogIC8vIEV4ZXJjaXNlIDMNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogMg0KICAvLyBDb3JyZWN0bmVzczogMi41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAxIG1hcmsNCiAgLy8gRWxlZ2FuY2U6IDAuNSBtYXJrcw0KICAvLyBUb3RhbDogNA0KICBkZWYgbGVuZ3RoW0FdKHg6IExpc3RbQV0pOiBJbnQgPSB4IG1hdGNoIHsNCiAgICBjYXNlIE5pbCA9PiAwDQogICAgY2FzZSB4IDo6IHhzID0+IGFkZChsZW5ndGgoeHMpLCAxKQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgNA0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA1DQogIC8vIENvcnJlY3RuZXNzOiA0LjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuMCBtYXJrDQogIC8vIEVsZWdhbmNlOiAxLjUgbWFya3MNCiAgLy8gVG90YWw6IDcNCiAgZGVmIG1hcFtBLCBCXSh4OiBMaXN0W0FdLCBmOiBBID0+IEIpOiBMaXN0W0JdID0geCBtYXRjaCB7DQogICAgY2FzZSBOaWwgPT4gTGlzdCgpDQogICAgY2FzZSB4IDo6IHhzID0+IGYoeCkgOjogbWFwKHhzLCBmKQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgNQ0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA1DQogIC8vIENvcnJlY3RuZXNzOiA0LjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuNSBtYXJrcw0KICAvLyBFbGVnYW5jZTogMSBtYXJrDQogIC8vIFRvdGFsOiA3DQogIGRlZiBmaWx0ZXJbQV0oeDogTGlzdFtBXSwgZjogQSA9PiBCb29sZWFuKTogTGlzdFtBXSA9IHggbWF0Y2ggew0KICAgIGNhc2UgTmlsID0+IExpc3QoKQ0KICAgIGNhc2UgeCA6OiB4cyA9PiBpZiAoZih4KSkgeCA6OiBmaWx0ZXIoeHMsIGYpIGVsc2UgZmlsdGVyKHhzLCBmKQ0KICB9DQoNCiAgLy8gRXhlcmNpc2UgNg0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiA1DQogIC8vIENvcnJlY3RuZXNzOiA0LjUgbWFya3MNCiAgLy8gUGVyZm9ybWFuY2U6IDEuNSBtYXJrcw0KICAvLyBFbGVnYW5jZTogMSBtYXJrDQogIC8vIFRvdGFsOiA3DQogIGRlZiBhcHBlbmRbQV0oeDogTGlzdFtBXSwgeTogTGlzdFtBXSk6IExpc3RbQV0gPSAoeCA6XFwgeSkgeyhlLCBsKSA9PiBlIDo6IGx9DQoNCiAgLy8gRXhlcmNpc2UgNw0KICAvLyBDb3JyZWN0bmVzczogNC41IG1hcmtzDQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDUNCiAgLy8gUGVyZm9ybWFuY2U6IDEuNSBtYXJrcw0KICAvLyBFbGVnYW5jZTogMSBtYXJrDQogIC8vIFRvdGFsOiA3DQogIGRlZiBjb25jYXRbQV0oeDogTGlzdFtMaXN0W0FdXSk6IExpc3RbQV0gPSB4IG1hdGNoIHsNCiAgICBjYXNlIE5pbCA9PiBOaWwNCiAgICBjYXNlIHggOjogeHMgPT4gYXBwZW5kKHgsIGNvbmNhdCh4cykpDQogIH0NCg0KICAvLyBFeGVyY2lzZSA4DQogIC8vIFJlbGF0aXZlIERpZmZpY3VsdHk6IDcNCiAgLy8gQ29ycmVjdG5lc3M6IDUuMCBtYXJrcw0KICAvLyBQZXJmb3JtYW5jZTogMS41IG1hcmtzDQogIC8vIEVsZWdhbmNlOiAxLjUgbWFyaw0KICAvLyBUb3RhbDogOA0KICBkZWYgY29uY2F0TWFwW0EsIEJdKHg6IExpc3RbQV0sIGY6IEEgPT4gTGlzdFtCXSk6IExpc3RbQl0gPSBjb25jYXQobWFwKHgsIGYpKQ0KDQogIC8vIEV4ZXJjaXNlIDkNCiAgLy8gUmVsYXRpdmUgRGlmZmljdWx0eTogOA0KICAvLyBDb3JyZWN0bmVzczogMy41IG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAzLjAgbWFya3MNCiAgLy8gRWxlZ2FuY2U6IDIuNSBtYXJrcw0KICAvLyBUb3RhbDogOQ0KICBkZWYgbWF4aW11bSh4OiBMaXN0W0ludF0pOiBJbnQgPSB4IG1hdGNoIHsNCiAgICBjYXNlIE5pbCA9PiBlcnJvcihcImNhblwndCBmaW5kIG1heGltdW0gb2YgZW1wdHkgbGlzdFwiKQ0KICAgIGNhc2UgXyA9PiAoeCgwKSAvOiB4KSB7KG1heCwgZSkgPT4gaWYgKGUgPiBtYXgpIGUgZWxzZSBtYXh9DQogIH0NCg0KICAvLyBFeGVyY2lzZSAxMA0KICAvLyBSZWxhdGl2ZSBEaWZmaWN1bHR5OiAxMA0KICAvLyBDb3JyZWN0bmVzczogNS4wIG1hcmtzDQogIC8vIFBlcmZvcm1hbmNlOiAyLjUgbWFya3MNCiAgLy8gRWxlZ2FuY2U6IDIuNSBtYXJrcw0KICAvLyBUb3RhbDogMTANCiAgZGVmIHJldmVyc2VbQV0oeDogTGlzdFtBXSk6IExpc3RbQV0gPSAoTGlzdFtBXSgpIC86IHgpIHsobCwgZSkgPT4gZSA6OiBsfQ0KICANCn0NCg==
July 19th, 2008 at 10:52 pm
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
July 24th, 2008 at 8:56 am
http://gist.github.com/1929 (haskell)
I’d love to know if I’m doing any of these “the ugly way.”
July 25th, 2008 at 9:59 pm
Hey… I didn’t get a reply from my email, I want to know how I did!
July 26th, 2008 at 5:34 am
Replies are coming. I’m quite busy at the moment.
July 28th, 2008 at 8:17 pm
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
October 3rd, 2008 at 1:18 pm
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
October 3rd, 2008 at 3:11 pm
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!
October 4th, 2008 at 1:37 pm
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.