This assignment is worth 50 points.
You are asked to construct several function definitions in rex and test them. You should submit your functions in a single file clearly commented. The five criteria the graders will be looking for with respect to formatting, comments, etc. are listed here. Be sure to have your name in a comment at the top of the file. The example file factorial.rex in the directory /cs/cs60/as/a1 demonstrates appropriate commenting styles, with comments on the commenting!
This assignment touches on parts of the text through Chapter 3, though the topics actually needed will be considered in class. You should, however, begin reading the book, as there are many more examples and thorough explanations of rex's features and the information structures used here. You may want to try writing some simpler functions on your own as well to get the hang of rex.
You should submit the file you create (named hw1.rex) by running (at the unix prompt)
% cs60submit hw1.rexYou will be asked to input the assignment number, which is 1. Don't forget it's due Thursday at midnight... .
rex > add42(-7); 35 rex > add42(190); 232If the user provides an input which is not a number, that's not your problem!
> cd cs60When you list (ls) the files you should see 15 directories named a01 to a15. I'd encourage you to create your hw1.rex in the a01 directory. You can cd to it and then open up emacs, for example.
Now you can start rex back up (from the same directory ~/cs60/a01 in which your file is located) and, at the rex prompt, type *i hw1.rex. This will load in the file (the "*i" stands for "include") and you can now use the functions that were defined in that file. As it loads, you will see the results from each statement in the file. In particular, if you have test statements, you will see whether the tests are passed or failed. (See below.) Alternatively, you can type rex hw1.rex at the unix prompt and it will start rex up with the functions defined in the file hw1.rex. Example files are available in the directory /cs/cs60/as/a1. Feel free to load these files and try the example functions there. For example, typing at the unix prompt
> rex /cs/cs60/as/a1/factorial.rexwill make the fac function available. (Try it!)
rex > test(add42(-7),35); ok: add42(-7) ==> 35 rex > test(add42(190),231); bad: add42(190) returned 232, should be 231(It shouldn't be 231, but that's the answer we told it to expect in the
test function.)
In general, it is usually much easier to use emacs (or your favorite
text editor) to create and modify files of rex statements and then "include"
them as described above. There are files in the directory
/cs/cs60/as/a1/ named Test#.rex,
which have test statements with
which you can try your functions for each of the assignment's problems. For
example, after typing your add42 function into a file named
hw1.rex, you can try the following (at the unix prompt, not
the rex prompt):
> rex hw1.rex < /cs/cs60/as/a1/Test0.inYou should see that your function succeeded at all of the tests:
hw1.rex loaded 1 rex > ok: add42(-7) ==> 35 2 rex > ok: add42(0) ==> 42 3 rex > ok: add42(101) ==> 143 4 rex > ok: add42(190) ==> 232 5 rex > ok: add42(12345678900) ==> 12345678942 6 rex >One thing that will make typing at the prompt more like editing a file in emacs is the *r command, which toggles emacs-like line input (the arrow keys will work). However, I'd suggest doing all of your editing into a file with emacs and then loading the results into rex either with *i or by typing
> rex (your filename)at the unix prompt. This will load all of your functions in the specified file.
Lots more information on using rex is available at the
rex summary
page.
The graders will test your functions on these and other
examples. When the problem states that a function's argument has
a given form, you may assume that the test cases will not take any
other forms; that is, you do not need to put in error-checking
for erroneous argument types.
rex > add42List([1, -7, -42, 8]);
[43, 35, 0, 50]
(Hint: Use map.)
rex > sum([5, 8, 9]);
22
rex > sum(range(1,10));
55
(Hint: Use reduce.)
rex > average([5, 8, 9]);
7.33333
rex > average(range(1,10));
5.5
You will want to use the float function, along with the
length of the list, in order to obtain floating point
averages. Note that
rex > 22/3;
7
rex > 22/float(3);
7.33333
rex > power(3,4);
81
rex > power(10,3);
1000

rex > superpower(2,3);
16
rex > superpower(3,3);
7625597484987
(You might want to check out superpower(2,5), but
you may have to turn off any built-in memory limits!).)
rex > log2(16);
4
rex > log2(31);
4
rex > log2(32);
5
rex > log2(1);
0
rex > superlog(5,25);
2
rex > superlog(7,343);
3
Note that superlog does not have the same relationship
with log2 that superpower has with power.
rex > superreverse([ [1,2,3], [4,5,6], [7,8,9] ])
[ [3,2,1], [6,5,4], [9,8,7] ]
rex > superreverse([['o','l',['I']],['e','v'],[['e','x'],'r']]);
[[[I], l, o], [v, e], [r, [e, x]]
rex > duperreverse([1, [2, 3], [4, [5, 6, [7, 8], 9] ] ]);
[[[9, [8, 7], 6, 5], 4], [3, 2], 1]
You will want to use the predicate atomic to implement this
function.
letterScores =
[
['a',1,9],
['b',3,2],
['c',3,2],
['d',2,4],
['e',1,12],
['f',4,2],
['g',2,3],
['h',4,2],
['i',1,9],
['j',8,1],
['k',5,1],
['l',1,4],
['m',3,2],
['n',1,6],
['o',1,8],
['p',3,2],
['q',10,1],
['r',1,6],
['s',1,4],
['t',1,6],
['u',1,4],
['v',4,2],
['w',4,2],
['x',8,1],
['y',4,2],
['z',10,1]
]
This list is available in the file /cs/cs60/as/a1/letterScores.rex .
You can include it (and thus use letterScores) by adding the line
sys(in,"/cs/cs60/as/a1/letterScores.rex");
at the rex prompt or (preferably) in your hw1.rex file.
Write a function scrabbleScore, which takes a word (as a string) and the above letterScores list as inputs and outputs the score for that word. Thus,
rex > scrabbleScore("twelve",letterScores);
12
rex > scrabbleScore("quiz",letterScores);
22
The built-in function explode will be useful for this problem: it
takes a string as input and outputs the same string and a list of
characters, e.g.,
rex > explode("rex"); // in case you're thinking regicide by now...
[ r, e, x ]
where those three characters are literal characters and not
variables.
sys(in,"/cs/cs60/as/a1/threeLets.rex");
either typed at the prompt or placed in your hw1.rex file, the
variable ospd3 will be bound to a list of all legal three-letter
words. (The name ospd3 stands for the Official Scrabble Player's Dictionary's
three-letter words.)
rex > bestThree("aaeiijx",ospd3);
[10, axe]
rex > bestThree("abcdabc",ospd3);
[7, cab]
rex > bestThree("eiilrrx",ospd3);
[10, rex]
rex > scrabbleScore("fuzzy",letterScores);
29
rex > scrabbleScore("pizzazz",letterScores);
45
rex > hardScrabble("fuzzy",letterScores);
19
rex > hardScrabble("pizzazz",letterScores);
Impossible word!