Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

直方体

アイヅ放送協会の教育番組(ＡＨＫ教育)では、子供向けの工作番組「あそんでつくろ」という番組を放送しています。今日は画用紙で箱を作る回ですが、用意した長方形の画用紙で直方体ができるかを確かめたいと思います。ただし、画用紙は切ったり折ったりしてはいけません。

６つの長方形が与えられるので、それらを使って直方体が作れるかどうか判定するプログラムを作成せよ。

Input

入力は以下の形式で与えられる。

h1 w1
h2 w2
h3 w3
h4 w4
h5 w5
h6 w6

入力は６行からなり、それぞれの行に各長方形の縦の長さを表す整数 hi (1 ≤ hi ≤ 1000) と横の長さを表す整数 wi (1 ≤ wi ≤ 1000) が与えられる。

Output

直方体を作成できる場合には「yes」を、作成できない場合には「no」を出力する。ただし、立方体は直方体の一種なので、立方体の場合でも「yes」と出力する。

Sample Input 1

2 2
2 3
2 3
2 3
2 2
3 2

Sample Output 1

yes

Sample Input 2

2 2
2 3
2 3
2 3
2 2
2 2

Sample Output 2

no

Solution in Scala (judge verdict: Accepted)

object Main extends App {
  import scala.io.StdIn._


  val squares = List.tabulate(6){_ ⇒
    val Array(h, w) = readLine.trim.split(' ').map(_.toInt).sorted
    Square(h, w)
  }
  val filtered = takeThreePair(squares)
  filtered match {
    case None ⇒ println("no")
    case Some(l@_::_::_::Nil) ⇒ if (l.map(s ⇒ List(s, s.rotate)).foldLeft(Nil:: Nil: List[List[Square]]){
      (l, r) ⇒ l.flatMap(p ⇒ r.map(_::p))
    }.exists{
      case a::b::c::Nil => canMake(a, b, c)
      case _ ⇒ ???
    }) println("yes")
    else println("no")
    case _ ⇒ ???
  }
  def canMake(a: Square, b: Square, c: Square): Boolean = {
    a.height == b.height && a.width == c.height && b.width == c.width
  }
  def takeThreePair(squares: List[Square]): Option[List[Square]] = {
    def eraseOne(list: List[Square])(predicate: Square ⇒ Boolean): Option[List[Square]] = {
      list match {
        case Nil ⇒ None
        case h::t if predicate(h) ⇒ Some(t)
        case h::t ⇒ eraseOne(t)(predicate).map(h::_)
      }
    }
    squares match {
      case h::t ⇒ eraseOne(t)(_ == h).flatMap(takeThreePair(_).map(h::_))
      case Nil ⇒ Some(Nil)
    }
  }
  case class Square(height: Int, width: Int) {
    def rotate: Square = Square(width, height)
  }
}