Problem:
投石おみくじ

「自分の道は自分で切り開く」をモットーに、ある神社が自分自身の手で運勢を決めるおみくじを作りました。そのおみくじを引く人にはまず6つの石を投げてもらい、その投げた石の一つ目と二つ目を結ぶ 線分、三つ目と四つ目を結ぶ 線分、五つ目と六つ目を結ぶ 線分の3本の線分の交点を頂点とする 三角形の面積から運勢を決めるというものです。各運勢と三角形の面積との関係は以下のとおりです。

線分の交点を頂点とする三角形の面積

運勢

1,900,000以上

大吉 (dai-kichi)

1,000,000以上1,900,000未満

中吉 (chu-kichi)

100,000以上1,000,000未満

吉 (kichi)

0より大きく 100,000未満

小吉 (syo-kichi)

三角形なし

凶 (kyo)

しかし、三角形の面積の大きさの判定は神主さんが手計算でやっているので正確とはいえず、時間もかかってしまいます。そこで近所に住む優秀なプログラマであるあなたは、一刻でも早くプログラムを書いて神主さんを助けてあげることにしました。

3 本の線分の情報を入力とし、線分の交点を頂点とする 三角形の面積から運勢を出力するプログラムを作成してください。線分の情報は始点の座標 (x1, y1) と、終点の座標 (x2, y2) が与えられ、始点と終点の座標は必ず異なることとします。また、2 つ以上の線分が同一直線上にある場合、交点を持たない 2 つの線分がある場合、3 つの線分が 1 点で交わる場合は、「三角形なし」となります。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロ4つの行で示されます。
各データセットは以下の形式で与えられます。

line1
line2
line3

i 行目に i 番目の線分の情報が与えられます。各線分の情報は以下の形式で与えられます。

x1 y1 x2 y2

線分の端点の座標を表す整数 (x1, y1), (x2, y2) (-1000 ≤ x1, y1, x2, y2 ≤ 1000 ) が空白区切りで与えられます。

Output

データセット毎に、おみくじの結果を１行に出力します。

Sample Input

-3 -2 9 6
3 -2 7 6
-1 0 5 0
2 2 -1 -1
0 1 2 1
-3 -1 3 1
0 0 0 0

Output for the Sample Input

syo-kichi
kyo

Solution in Ruby (judge verdict: Wrong Answer)

class Point
  include Comparable
  attr_accessor :x, :y
  def initialize(x=0.0, y=0.0)
    @x = x; @y = y
  end

  def <=>(p)
    return 1 if @x > p.x
    return 1 if (@x == p.x) && (@y > p.y)
    return -1 if @x < p.x
    return -1 if (@x == p.x) && (@y < p.y)
    0
  end
  def +(p)
    Point.new(@x+p.x, @y+p.y)
  end
  def -(p)
    Point.new(@x-p.x, @y-p.y)
  end
  def -@
    Point.new(-@x, -@y)
  end

  def dot(p)
    @x*p.x + @y*p.y
  end
  def cross(p)
    @x*p.y - @y*p.x
  end
  def abs
    Math::hypot(@x, @y)
  end
  def norm
    @x**2 + @y**2
  end
  CounterClockwise = 1  # self-p1-p2の順で反時計回り
  Clockwise = -1        # self-p1-p2の順で時計回り
  # 3点の位置関係を調べる
  def ccw(p1, p2)
    p = p1-self; q = p2-self
    return 1 if p.cross(q) > 0
    return -1 if p.cross(q) < 0
    0
  end
end

class Segment
  attr_accessor :a, :b
  def initialize(p1=Point.new, p2=Point.new)
    @a = p1; @b = p2
  end

  def include?(p)
    (@a-p).abs + (@b-p).abs == (b-a).abs
  end
  def intersect?(s)
    s.a.ccw(s.b, self.a) * s.a.ccw(s.b, self.b) < 0 && self.a.ccw(self.b, s.a) * self.a.ccw(self.b, s.b) < 0
  end
  def crossingPoint(s)
    dev = (self.b.y-self.a.y)*(s.b.x-s.a.x) - (self.b.x-self.a.x)*(s.b.y-s.a.y)
    p "ERROR" if dev==0
    d1 = s.a.y*s.b.x - s.a.x*s.b.y
    d2 = self.a.y*self.b.x - self.a.x*self.b.y
    x = d1*(self.b.x - self.a.x) - d2*(s.b.x - s.a.x)
    x /= dev
    y = d1*(self.b.y - self.a.y) - d2*(s.b.y - s.a.y)
    y /= dev
    Point.new(x, y)
  end
end

while (x1, y1, x2, y2 = gets.split.map(&:to_i)).find{|v| v != 0} do
  segment = Array.new
  crossingPoint = Array.new
  s = 0
  segment.push(Segment.new(Point.new(x1, y1), Point.new(x2, y2)))
  2.times do
    x1, y1, x2, y2 = gets.split.map(&:to_i)
    segment.push(Segment.new(Point.new(x1, y1), Point.new(x2, y2)))
  end
  3.times do |i|
    break if !segment[i].intersect?(segment[(i+1)%3])
    crossingPoint.push(segment[i].crossingPoint(segment[(i+1)%3]))
  end
  if crossingPoint.size == 3
    a = crossingPoint[2] - crossingPoint[0]
    b = crossingPoint[1] - crossingPoint[0]
    s = (a.x*b.y - b.x*a.y).abs / 2.0
  end
  if s > 1900000
    puts "dai-kichi"
  elsif s > 1000000
    puts "chu-kichi"
  elsif s > 100000
    puts "kichi"
  elsif s > 0
    puts "syo-kichi"
  else
    puts "kyo"
  end
end