Scala
object HackSE {
def main(args: Array[String]): Unit = {
val input = List("Jack and Jill went up the hill to fetch a pail of water.",
"All work and no play makes Jack and Jill a dull couple.",
"The Manchester United Junior Athletic Club (MUJAC) karate team was super good at kicking.",
"The MUJAC playmaker actually kinda sucked at karate."
)
println(intersect(input))
}
def intersect(list:List[String]):List[String] = {
list.foldLeft(List[Set[String]]())((b,a) => {
val x = (for(c <- list if(!a.equals(c)))yield(subStrings(a).intersect(subStrings(c)))).flatten.toSet
bubbles(b,x)
}).head.toList.sortWith(_ < _)
}
def bubbles(y:List[Set[String]], x:Set[String]):List[Set[String]]= {
y match {
case Nil => List(x)
case _ => y.foldLeft(List[Set[String]]())((b,a) => {
val intersects = !x.intersect(a).isEmpty
val isLast = a == y.last
if(x.intersect(a).isEmpty && !isLast) b ++ List(a)
else if(!intersects && isLast && b.isEmpty) List(x++a)
else if(!intersects && isLast && !b.isEmpty) b.dropRight(1) ++ List(b.last ++ x)
else if(intersects && isLast && b.isEmpty )List(a ++x)
else if(intersects && !isLast && b.isEmpty ) List(a)
else b.dropRight(1) ++ List(b.last ++ (x.intersect(a)),x.diff(a))
})
}
}
def subStrings(s:String):Set[String] = {
val s2 = "[a-zA-Z]".r.findAllIn(s).mkString.toLowerCase
(for { x <- 0 to s2.length if(x+5 <= s2.length)} yield innerSubStrings(s2.substring(x))).flatten.toSet
}
def innerSubStrings(s:String):Set[String] = {
(for { x <- 5 to s.length} yield s.substring(0, x)).toSet
}
}