Mercurial > repos > other > SevenLanguagesInSevenWeeks
changeset 39:c48e6e454991
Add first four self-study answers
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Wed, 13 Sep 2017 20:55:07 +0100 |
parents | e8407d4e72dd |
children | 82627dd71c75 |
files | 2-Io/day2-self-study.io |
diffstat | 1 files changed, 92 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2-Io/day2-self-study.io Wed Sep 13 20:55:07 2017 +0100 @@ -0,0 +1,92 @@ +# 1) Fibanacci by recursion (fibr) and loop (fibl) +fibr := method(num, + if (num < 1, + return 0, + if (num == 1, + return 1, + prev := fibr(num - 1) ; + prev_prev := fibr(num - 2) ; + return prev + prev_prev + ) + ) +) + +"fibr(9) = " print +fibr(9) println +"fibr(4) = " print +fibr(4) println +"fibr(1) = " print +fibr(1) println + + +fibl := method(num, + if (num < 1, return 0) + if (num == 1, return 1) + prev := 1 + prev_prev := 0 + val := 0 + for(i, 2, num, + val = prev + prev_prev + prev_prev = prev + prev = val + ) + return val +) + +"fibl(9) = " print +fibl(9) println +"fibl(4) = " print +fibl(4) println +"fibl(1) = " print +fibl(1) println + + +# 2) Changing "/" operator to return 0 for a zero denominator +# Operators are just messages on objects, so "/" is the message to override +# and it must be on the object type Number +Number defaultDivide := Number getSlot("/") +Number / := method(denom, + if (denom == 0, + return 0, + return self defaultDivide(denom)) +) +(4 / 2) println +(4 / 0) println + + +# 3) Add up numbers in a 2D array +arr := list( + list(1, 2, 3), + list(4, 5, 6), + list(7, 8, 9) +) + +add2D := method(arr, + sum := 0 + # A "reduce()" method would be nice, but KISS for now and foreach all the things + arr foreach(dimension, dimension foreach(val, sum = sum + val)) + return sum +) + +add2D(arr) println + + +# 4) Add myAverage to average numbers in a list +List myAverage := method( + sum := 0 + self foreach(val, if (val proto == Number, + sum = sum + val, + Exception raise("Non-object found in list")) + ) + return sum / self size +) + +list(1, 2, 3) myAverage println +# This will exception - run at the end! +# list(1, 2, 3, "foo") myAverage +# With default behaviour then this could divide by zero (unless we'd been defensive coding) +# But we're in the same file as our custom "/", so we should get zero +list() myAverage println + + +list(1, 2, 3, "foo") myAverage \ No newline at end of file