Problem:
宇宙船 UAZ アドバンス号

恒星歴 2005.11.5。あなたは宇宙船 UAZ アドバンス号の艦長として敵の宇宙船と交戦しようとしています。 幸い敵の宇宙船はまだこちらに気付かずに静止しています。また、すでに敵の宇宙座標は判明しており強力な直線のビームを放つ「フェザー砲」は発射準備を完了しています。あとは、発射命令を出すばかりです。

ところが、宇宙空間には、敵の設置したエネルギーバリアが存在しています。バリアは三角形をしており「フェザー砲」のビームをはね返してしまいます。また、ビームがバリアに当たれば敵に気付かれて逃げられてしまいます。事前に命中すると判定できなければ、発射命令は出せません。

そこで、UAZ アドバンス号、敵、バリアの位置の宇宙座標(3次元座標 x, y, z) を入力して、ビームがバリアをさけて敵に命中する場合は "HIT"、バリアに当たってしまう場合"MISS"と出力するプログラムを作成してください。

ただし、バリアはアドバンス号から 3 角形に見えるものだけが対象であり、線分につぶれて見えるものはないものとします。また、バリアは 3 角形の頂点を含む境界でも有効であり、ビームをはね返すものとします。また、敵がバリア内にいる場合は"MISS"と出力して下さい。

Input

入力データの形式は以下のとおりです：

1 行目は、UAZ アドバンス号の座標 (x, y, z) (整数、半角空白区切り)

2 行目は、敵の座標 (x, y, z) (整数、半角空白区切り)

3 行目は、バリアの頂点 1 の座標 (x, y, z) (整数、半角空白区切り)

4 行目は、バリアの頂点 2 の座標 (x, y, z ) (整数、半角空白区切り)

5 行目は、バリアの頂点 3 の座標 (x, y, z ) (整数、半角空白区切り)

Output

HIT または MISS と１行に出力してください。

Constraints

-100 ≤ x, y, z ≤ 100

UAZ アドバンス号と敵が同じ位置にいることはない。

Sample Input 1

-10 0 0
10 0 0
0 10 0
0 10 10
0 0 10

Output for the Sample Input 1

HIT

Sample Input 2

-10 6 6
10 6 6
0 10 0
0 10 10
0 0 10

Output for the Sample Input 2

MISS

Solution in Ruby (judge verdict: Wrong Answer)


class Point
  attr_reader :x, :y, :z
  def initialize(x, y, z)
    @x, @y, @z = [x, y, z].map(&:to_f)
  end
  def -(p)
    Point.new(@x - p.x, @y - p.y, @z - p.z)
  end
  def dot(p)
    @x * p.x + @y * p.y + @z * p.z
  end
  def cross(p)
    Point.new(@y * p.z - @z * p.y, @z * p.x - @x * p.z, @x * p.y - @y * p.x)
  end
  def ==(p)
    (@x - p.x).abs < EPS && (@y - p.y).abs < EPS && (@z - p.z).abs < EPS
  end
  def +(p)
    Point.new(@x + p.x, @y + p.y, @z + p.z)
  end
  def distance(p)
    (self - p).abs
  end
  def abs
    Math::sqrt(@x * @x + @y * @y + @z * @z)
  end
  def normalize
    Point.new(@x / abs, @y / abs, @z / abs)
  end
end
EPS = 1e-9
def intersect?(a, b, c, d)
  ab = b - a
  cd = d - c
  n1 = ab.normalize
  n2 = cd.normalize
  work1 = n1.dot(n2)
  work2 = 1.0 - work1 * work1
  ac = c - a
  d1 = (ac.dot(n1) - work1 * ac.dot(n2)) / work2
  d2 = (work1 * ac.dot(n1) - ac.dot(n2)) / work2
  p1 = a + Point.new(d1 * n1.x, d1 * n1.y, d1 * n1.z)
  p2 = c + Point.new(d2 * n2.x, d2 * n2.y, d2 * n2.z)
# p a.distance(p1) + b.distance(p1)
# p a.distance(b)
# p c.distance(p2) + d.distance(p2)
# p c.distance(d)
nil.times
  (p1 == p2) && ((a.distance(p1) + b.distance(p1) - a.distance(b)).abs < EPS) && ((c.distance(p2) + d.distance(p2) - c.distance(d)).abs < EPS)
end
def parallel?(a, b, c, d)
  (b - a).normalize == (d - c).normalize
end
def orthogonal?(a, b, c, d)
end
def solve2
  d, e, a, b, c = 5.times.map{Point.new(*gets.split)}
  return intersect?(a, c, d, e) if parallel?(a, b, d, e)
  return intersect?(b, a, d, e) if parallel?(b, c, d, e)
  return intersect?(c, b, d, e) if parallel?(c, a, d, e)
  abde = (e - d).dot((b - a).cross(d - a)).abs
  bcde = (e - d).dot((c - b).cross(d - b)).abs
  cade = (e - d).dot((a - c).cross(d - c)).abs
  abcd = (d - c).dot((b - a).cross(c - a)).abs
  abce = (e - c).dot((b - a).cross(c - a)).abs
  abde + bcde + cade == abcd + abce
end
puts (solve2 ? "MISS" : "HIT")