Sha256: ca3b1aa2fc0e325edb4349d26ebd3ca5ec43828fed697f3629bae525137e7d77

Contents?: true

Size: 1.27 KB

Versions: 377

Compression:

Stored size: 1.27 KB

Contents

object Dominoes {
  type Domino = (Int, Int)
  type Dominoes = List[Domino]

  def chain(dominoes: Dominoes): Option[Dominoes] = {
    val solutions = dominoes.permutations map createChain
    solutions find (_.isDefined) flatten
  }

  private def createChain(dominoes: Dominoes): Option[Dominoes] = {
    val matchingDomino: (Domino, Domino) => Option[Domino] = {
      case ((_, y1), (x2, y2)) =>
        if (y1 == x2) Some((x2, y2))
        else if (y1 == y2) Some((y2, x2))
        else None
    }
    def matchingDominoes(x: Domino, y: Domino): Option[(Domino, Domino)] = {
      matchingDomino(x, y) map ((x, _)) orElse {
        val sx = x.swap
        matchingDomino(sx, y) map ((sx, _))
      }
    }
    def appendDomino(mxs: Option[Dominoes], candidate: Domino): Option[Dominoes] =
      for {
        chainSoFar <- mxs
        lastDomino = chainSoFar.last
        nextDomino <- matchingDomino(lastDomino, candidate)
      } yield chainSoFar :+ nextDomino

    dominoes match {
      case Nil => Some(Nil)
      case ys@(x::xs) =>
        for {
          (rightDomino, leftDomino) <- matchingDominoes(ys.last, x)
          startChain = Option(List(leftDomino))
          result <- xs.foldLeft(startChain)(appendDomino) if result.last == rightDomino
        } yield result
      }
  }
}

Version data entries

377 entries across 377 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.179 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.178 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.177 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.176 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.175 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.174 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.173 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.172 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.171 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.170 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.169 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.167 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.166 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.165 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.164 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.163 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.162 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.161 tracks/scala/exercises/dominoes/Example.scala
trackler-2.2.1.160 tracks/scala/exercises/dominoes/Example.scala