#!/usr/bin/ruby

#
## http://rosettacode.org/wiki/Longest_common_prefix#Sidef
#

# Finds the first point where the tree bifurcates
func find_common_prefix(hash, acc) {
    if (hash.len == 1) {
        var pair = hash.to_a[0]
        return __FUNC__(pair.value, acc+pair.key)
    }
    return acc
}

# Creates a tree like: {a => {b => {c => {}}}}
func lcp(*strings) {
    var hash = Hash()

    for str in (strings.sort_by{.len}) {
        var ref = hash
        str.is_empty && return ''
        for char in str {
            if (ref.contains(char)) {
                ref = ref{char}
                ref.len == 0 && break
            }
            else {
                ref = (ref{char} = Hash())
            }
        }
    }

    return find_common_prefix(hash, '')
}

func is(a, b) {
    a == b || die "error: #{a} != #{b}";
}

is(lcp("interspecies","interstellar","interstate"), "inters");
is(lcp("throne","throne"),                          "throne");
is(lcp("throne","dungeon"),                         "");
is(lcp("throne","","throne"),                       "");
is(lcp("cheese"),                                   "cheese");
is(lcp(""),                                         "");
is(lcp(),                                           "");
is(lcp("prefix","suffix"),                          "");
is(lcp("foo","foobar"),                             "foo");
is(lcp("foobar","foo"),                             "foo");

say "** Test passed!";
