/* part1.rex (for cs60 hw1, S09) Name: Comments to the graders: */ // Note the /* slash-star ... star-slash */ multi-line comments: // Rex also has single line comments, like this one // problem 1 // pow is built in! // pr: #1 // fun: pwr(b,p) // in: b - numeric base, p - nonnegative integer power // out: b**p (floating point!) pwr( 42, 42 ) => "The answer of answers..."; pwr( b, 0 ) => 1.0; pwr( b, p ) => p < 0 && b == 0.0 ? "you can't raise 0 to a negative power"; pwr( b, p ) => p > 0 ? b*pwr( b, p-1 ); pwr( b, p ) => 1.0 / pwr( b, -p ); pwr( 42, 1 ) => "The answer!"; test( pwr(3,5), 243 ); test( pwr(2,-2), 0.25 ); // pr: #2 // fun: lg2( x ) // in: numeric x // out: (integer) ceiling of log-base-2 of x lg2( x ) => x <= 1.0 ? 0; lg2( x ) => 1 + lg2( x / 2.0 ); test( lg2(7), 3 ); test( lg2(8), 3 ); test( lg2(9), 4 ); // pr: // fun: // in: // out: // pr: #3a // fun: superreverse( LoL ) // in: a list of lists, LoL // out: the same, but with the inner lists reversed superreverse( [] ) => []; superreverse( [FL|RLoL] ) => is_list( FL ) ? [ reverse(FL) | superreverse(RLoL) ]; superreverse( [f|R] ) => [ f | superreverse(R) ]; test( superreverse( [ [1,2], 42, "string", [5,4,3] ] ), [ [2,1], 42, "string", [3,4,5] ] ); test( superreverse( [ [1,2], [3,4,[5,6],7], 8, [[9]] ] ), [ [2,1], [7,[5,6],4,3], 8, [[9]] ] ); // MAY USE REVERSE! // pr: #3b // fun: duperreverse( L ) // in: any list, L // out: the same, but with all structure reversed duperreverse( [] ) => []; duperreverse( [f|R] ) => atomic(f) ? append( duperreverse(R), [f] ); duperreverse( [f|R] ) => append( duperreverse(R), [duperreverse(f)] ); test( duperreverse( [ [1,2], 42, "string", [5,4,3] ] ), [ [3,4,5], "string", 42, [2,1] ] ); test( duperreverse( [ [1,2], [3,4,[5,6],7], 8, [[9]] ] ), [ [[9]], 8, [7,[6,5],4,3], [2,1] ] ); // pr: #4 // fun: removeAll( e, L ) // in: any element e, any list L // out: the same L, except with all top-level e's removed removeAll( e, [] ) => []; removeAll( e, [e|R] ) => removeAll( e, R ); removeAll( e, [f|R] ) => [f | removeAll( e, R )]; rmvAll = removeAll; test( rmvAll( 1, [1,1,42,1] ), [42] ); test( rmvAll( 1, [[1,1], 1] ), [[1,1]] ); test( rmvAll( 1, [2,3,5,7] ), [2,3,5,7] ); // pr: #5 // fun: enum( L ) // in: any list, L // out: a list of pairs of increasing indices with elements of L enum( L ) => enumWIndex( L, 0 ); enumWIndex( [], i ) => []; enumWIndex( [f|R], i ) => [ [i,f] | enumWIndex( R, i+1 ) ]; test( enum( ["jan","feb","mar"] ), [ [0,"jan"], [1,"feb"], [2,"mar"] ] ); test( enum( [2008,2009,2010,2011] ), [ [0,2008], [1,2009], [2,2010], [3,2011] ] ); test( enum( [] ), [] );