Same fringe: Difference between revisions

m
Added the Sidef language
m (Added the Sidef language)
Line 2,172:
<pre>> (same-fringe? (list 1 '() (list 2 '() (list 3 '() '()))) (list 3 (list 2 (list 1 '() '()) '()) '()))
#t</pre>
 
=={{header|Sidef}}==
{{trans|Perl}}
<lang ruby>var trees = [
# 0..2 are same
[ 'd', [ 'c', [ 'a', 'b', ], ], ],
[ [ 'd', 'c' ], [ 'a', 'b' ] ],
[ [ [ 'd', 'c', ], 'a', ], 'b', ],
# and this one's different!
[ [ [ [ [ [ 'a' ], 'b' ], 'c', ], 'd', ], 'e', ], 'f' ],
];
 
func get_tree_iterator(*rtrees) {
var tree;
closure {
tree = rtrees.pop;
while (tree.is_an(Array)) {
rtrees.append(tree[1]);
tree = tree[0];
};
return tree;
}
}
 
func cmp_fringe(a, b) {
var ti1 = get_tree_iterator(a);
var ti2 = get_tree_iterator(b);
loop {
var (L, R) = (ti1(), ti2());
all { L != nil; R != nil; L == R } && next;
all { L == nil; R == nil } && return "Same";
return "Different";
}
}
 
range(1, trees.end).each { |tree_idx|
say ("tree[#{tree_idx-1}] vs tree[#{tree_idx}]: ",
cmp_fringe(trees[tree_idx-1], trees[tree_idx]));
};</lang>
 
{{out}}
<pre>
tree[0] vs tree[1]: Same
tree[1] vs tree[2]: Same
tree[2] vs tree[3]: Different
</pre>
 
=={{header|Tcl}}==
2,747

edits