31 lines
1.5 KiB
Scala
31 lines
1.5 KiB
Scala
import scala.math.abs
|
|
|
|
object Dinesman3 extends App {
|
|
val tenants = List("Baker", "Cooper2", "Fletcher4", "Miller", "Rollo5", "Smith")
|
|
val (groundFloor, topFloor) = (1, tenants.size)
|
|
|
|
/** Rules with related tenants and restrictions*/
|
|
val exclusions =
|
|
List((suggestedFloor0: Map[String, Int]) => suggestedFloor0("Baker") != topFloor,
|
|
(suggestedFloor1: Map[String, Int]) => suggestedFloor1("Cooper2") != groundFloor,
|
|
(suggestedFloor2: Map[String, Int]) => !List(groundFloor, topFloor).contains(suggestedFloor2("Fletcher4")),
|
|
(suggestedFloor3: Map[String, Int]) => suggestedFloor3("Miller") > suggestedFloor3("Cooper2"),
|
|
(suggestedFloor4: Map[String, Int]) => abs(suggestedFloor4("Smith") - suggestedFloor4("Fletcher4")) != 1,
|
|
(suggestedFloor5: Map[String, Int]) => abs(suggestedFloor5("Fletcher4") - suggestedFloor5("Cooper2")) != 1,
|
|
|
|
(suggestedFloor6: Map[String, Int]) => !List(3, 4, topFloor).contains(suggestedFloor6("Rollo5")),
|
|
(suggestedFloor7: Map[String, Int]) => suggestedFloor7("Rollo5") < suggestedFloor7("Smith"),
|
|
(suggestedFloor8: Map[String, Int]) => suggestedFloor8("Rollo5") > suggestedFloor8("Fletcher4"))
|
|
|
|
tenants.permutations.map(_ zip (groundFloor to topFloor)).
|
|
filter(p => exclusions.forall(_(p.toMap))).toList match {
|
|
case Nil => println("No solution")
|
|
case xss => {
|
|
println(s"Solutions: ${xss.size}")
|
|
xss.foreach { l =>
|
|
println("possible solution:")
|
|
l.foreach(p => println(f"${p._1}%11s lives on floor number ${p._2}"))
|
|
}
|
|
}
|
|
}
|
|
}
|