00001
00002
00003 #include <cppscript>
00004
00005 var test(var description, var fn);
00006
00007 var int_sum(var max)
00008 {
00009 var total=0;
00010 foreach( i, range(1,max) ) total += i;
00011 return total;
00012 }
00013
00014 var dbl_sum(var max)
00015 {
00016 var total=0.0;
00017 foreach( i, range(1,max) ) total += i;
00018 return total;
00019 }
00020
00021 var tree(var item, var depth)
00022 {
00023 if(depth)
00024 {
00025 --depth;
00026 var item2 = item * 2;
00027 return array( item, tree(item2-1, depth), tree(item2, depth) );
00028 }
00029 else
00030 return item;
00031 }
00032
00033 var check_tree_object(var node)
00034 {
00035 return node["item"] + node["left"]["check"]() - node["right"]["check"]();
00036 }
00037
00038 var check_leaf(var node)
00039 {
00040 return node["item"];
00041 }
00042
00043 var tree_object(var item, var depth)
00044 {
00045 return depth
00046 ?
00047 object("tree").extend
00048 ("item",item)
00049 ("left",tree_object(item*2-1,depth-1))
00050 ("right",tree_object(item*2,depth-1))
00051 ("check",check_tree_object)
00052 :
00053 object("leaf").extend
00054 ("item",item)
00055 ("check",check_leaf);
00056 }
00057
00058 var check_tree(var tree)
00059 {
00060 return tree.size() ? tree[0] + check_tree(tree[1]) - check_tree(tree[2]) : tree;
00061 }
00062
00063 void binary_trees(var max_depth)
00064 {
00065 var min_depth=4;
00066
00067 var stretch_depth = max_depth+1;
00068 writeln("stretch tree of depth " + stretch_depth + "\tcheck: " + check_tree(tree(0, stretch_depth)) );
00069
00070 var long_lived_tree = tree(0, max_depth.as_int());
00071
00072 foreach( d, range(min_depth, max_depth, 2))
00073 {
00074 var iterations=1<<(max_depth-d+min_depth).as_int(), c=0;
00075 foreach( i, range(1,iterations) )
00076 {
00077 var a = tree(i, d), b = tree(-i, d);
00078 c += check_tree(a) + check_tree(b);
00079 }
00080
00081 writeln( "" + iterations*2 + "\ttrees of depth " + d + "\tcheck: " + c );
00082 }
00083
00084 writeln("long lived tree of depth " + max_depth + "\tcheck: " + check_tree(long_lived_tree) );
00085 }
00086
00087 void binary_trees_using_object(var max_depth)
00088 {
00089 var min_depth=4;
00090 var stretch_depth = max_depth+1;
00091 writeln("stretch tree of depth " + stretch_depth + "\tcheck: " + tree_object(0,stretch_depth)["check"]() );
00092
00093 var long_lived_tree = tree_object(0, max_depth.as_int());
00094
00095 foreach( d, range(min_depth, max_depth, 2))
00096 {
00097 var iterations=1<<(max_depth-d+min_depth).as_int(), c=0;
00098 foreach( i, range(1,iterations) )
00099 {
00100 var a = tree_object(i, d), b = tree_object(-i, d);
00101 c += check_tree_object(a) + check_tree_object(b);
00102 }
00103
00104 writeln( "" + iterations*2 + "\ttrees of depth " + d + "\tcheck: " + c );
00105 }
00106
00107 writeln("long lived tree of depth " + max_depth + "\tcheck: " + check_tree_object(long_lived_tree) );
00108 }
00109
00110 var tests()
00111 {
00112 return map
00113 ("intsum", test("Sums the numbers 1 to 1000000 using ints", bind(int_sum,1000000)))
00114 ("dblsum", test("Sums the numbers 1 to 1000000 using doubles", bind(dbl_sum,1000000)))
00115 ("tree10", test("Build binary trees of depth 10", bind(binary_trees, 10)))
00116 ("tree14", test("Build binary trees of depth 14", bind(binary_trees, 14)))
00117 ("treeobject", test("Build binarytrees using objects", bind(binary_trees_using_object, 10)))
00118 ;
00119 }