Problem:
Problem C: カードゲーム

ねこのゲイツとジャッキーは、2人で遊ぶカードゲームのルールを考えた。そのルールとは次のようなものである。

まず、1から18の数字が書かれたカードをシャッフルし、それぞれのプレーヤーに9枚ずつ配る。両者は同時に1枚のカードを同時に出し、その値によってスコアを得る。値の大きいカードを出したプレーヤーは、大きい方の値と小さい方の値の和を自分のスコアに加える。その際、値の小さいカードを出したプレーヤーはスコアを得られない。また、一度場に出されたカードは二度と使うことはできない。カードをすべて使い終わった後にスコアが大きかったプレーヤーの勝ちとする。

ゲイツとジャッキーは互いに無作為にカードを選んで出してみることにした。最初に配られたカードが与えられたとき、ゲイツとジャッキーが勝つ確率をそれぞれ求めよ。

Input

ゲイツ、ジャッキーそれぞれの手札は、9個の整数からなる。両プレーヤーの手札は1から18までの互いに異なる整数である。入力の1行目にはゲイツの手札を表す9個の整数が与えられ、2行目にはジャッキーの手札を表す9個の整数が与えられる。整数と整数の間は空白1個で区切られる。

Output

ゲイツ、ジャッキーが勝つ確率をそれぞれ、スペースで区切って小数点以下5桁まで出力せよ。 10-5 以内の誤差は許容されるが、0未満あるいは1を越える値を出力してはならない。

Notes on Submission

上記形式で複数のデータセットが与えられます。入力データの 1 行目にデータセットの数が与えられます。各データセットに対する出力を上記形式で順番に出力するプログラムを作成して下さい。

Sample Input

2
1 3 5 7 9 11 13 15 17
2 4 6 8 10 12 14 16 18
1 5 7 9 11 13 15 17 18
2 3 4 6 8 10 12 14 16

Output for the Sample Input

0.30891 0.69109
0.92747 0.07253

Solution in Haskell (judge verdict: Accepted)

import Control.Applicative
import Control.Monad
import Data.List
import Text.Printf

main :: IO ()
main = do
  n <- readLn
  replicateM_ n $ do
    solve <$> f <*> f >>= (\p -> printf "%.7f %.7f\n" p (1.0 - p))
  where
    f = map read <$> words <$> getLine

solve :: [Int] -> [Int] -> Double
solve xs ys = let gw = length $ filter (game xs) $ permutations ys
              in fromIntegral gw / tng
  where
    tng = fromIntegral . product $ [1 .. 9]

game :: [Int] -> [Int] -> Bool
game xs ys = (> 0) . sum $ zipWith f xs ys
  where
    f x y
      | x > y = x + y
      | otherwise = -(x + y)