#!/usr/bin/ruby # ## https://rosettacode.org/wiki/Same_Fringe # 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; func { tree = rtrees.pop; while (defined(tree) && 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()); defined(L) && defined(R) && (L == R) && next; !defined(L) && !defined(R) && return "Same"; return "Different"; } } var a = cmp_fringe(trees[0], trees[1]); var b = cmp_fringe(trees[1], trees[2]); var c = cmp_fringe(trees[2], trees[3]); assert_eq(a, "Same"); assert_eq(b, "Same"); assert_eq(c, "Different"); say "** Test passed!";