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)

# -*- coding: utf-8 -*-
EPS = 1e-9

class Point
  attr_reader :x, :y
  def initialize(x, y=nil)
    @x, @y = x, y if y
    @x, @y = x[0], x[1] unless y
  end
  def abs; (@x**2 + @y**2)**0.5; end
  def +(other); Point.new(@x + other.x, @y + other.y); end
  def -(other); Point.new(@x - other.x, @y - other.y); end
  def *(other); Point.new(@x * other, @y * other); end
  def /(other); Point.new(@x / other, @y / other); end
end

class Line
  attr_reader :s, :t
  def initialize(s, t=nil)
    @s, @t = s, t if t
    @s, @t = Point.new(s[0..1]), Point.new(s[2..3]) unless t
  end
  def abs; (@t - @s).abs; end
end

def dot(a, b); a.x * b.x + a.y * b.y; end
def cross(a, b);  a.x * b.y - b.x * a.y; end

def is_intersected_ls(a, b)
  return false if ((a.t - a.s) / a.abs - (b.t - b.s) / b.abs).abs < EPS

  cross(a.t - a.s, b.s - a.s) * cross(a.t - a.s, b.t - a.s) < EPS and
    cross(b.t - b.s, a.s - b.s) * cross(b.t - b.s, a.t - b.s) < EPS
end

def intersection_ls(a, b)
  tmp = b.t - b.s

  d1 = cross(tmp, a.s - b.s).abs
  d2 = cross(tmp, a.t - b.s).abs

  return nil if d1 + d2 == 0
  t = d1 / (d1 + d2)

  a.s + (a.t - a.s) * t
end

def area(points)
  cross(points[0] - points[2], points[1] - points[2]).abs / 2
end

def fortune(x)
  case x
  when 0; "kyo"
  when 0..100000; "syo-kichi"
  when 0..1000000; "kichi"
  when 0..1900000; "chu-kichi"
  else; "dai-kichi"
  end
end

while input = gets.split.map(&:to_i) and input.count(0) != 4
  l = [ Line.new(input) ]
  2.times{ l << Line.new(gets.split.map(&:to_i)) }

  res = nil
  points = []
  for i in 0..2
    res = "kyo" unless is_intersected_ls(l[i], l[(i + 1) % 3])

    points << intersection_ls(l[i], l[(i + 1) % 3]) unless res
    res = "kyo" unless points[i]
  end

  res = fortune(area(points)) unless res

  puts res
end