[2016-02-26] Challenge #255 [Hard] Hacking a search engine

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
  }

}
/r/dailyprogrammer Thread