#!/usr/bin/ruby
#
## https://rosettacode.org/wiki/Longest_common_prefix
#
# Finds the first point where the tree bifurcates
func find_common_prefix(hash, acc) {
if ((var keys = hash.keys).len == 1) {
return __FUNC__(hash{keys[0]}, acc+keys[0])
}
return acc;
}
# Creates a tree like: {a => {b => {c => {}}}}
func lcp(*strings) {
var hash = Hash()
strings.sort_by{.len}.each { |str|
var ref = hash
str.is_empty && return ''
str.each { |char|
if (ref.has_key(char)) {
ref = ref{char}
ref.keys.len == 0 && break
} else {
ref = (ref{char} = Hash())
}
};
};
return find_common_prefix(hash, '')
}
var data = [
["interspecies","interstellar","interstate"],
["throne","throne"],
["throne","dungeon"],
["throne","","throne"],
["cheese"],
[""],
[],
["prefix","suffix"],
["foo","foobar"]
]
data.each { |set|
say "lcp(#{set.dump.substr(1,-1)}) = #{lcp(set...).dump}"
}