国内予選の問題の解答

http://ccserv.adm.ehime-u.ac.jp/ICPC/jp/
なんと出力例が公開されているではないか。
問題Eと問題Fについては正解していなかったので、
公開している解答が合ってるかわからんかったんだよなぁ。


ということで、チェックしてみたところ、
サイトにアップしたプログラムはEとFどっちとも4つの入力
すべてに対して正しい答えが出せていた。
これで安心して公開しておくことが出来るのである。


ところで、問題Eは解答が実数値で、誤差が0.001を超えなければOK
な問題なので、チェックにdiffが使えなかった。
Haskellで適当にチェックプログラムを作ったのだが、
PerlでもRubyでもなく、Haskell
もはや私の中でデフォルト言語となりつつある…

import System

main = do
  args@[f1,f2] <- getArgs
  cs           <- mapM readFile args
  let d = map (map read . words) cs
  let diffs = [t | t@(_,[r,s]) <- zip [1..] d, abs (r-s) > 0.001]
  if null diffs then putStrLn "Congratulations!!! correct answer."
    else mapM_ (\(l,[r,s]) -> do
      putStrLn $ "Differnt at line " ++ show l ++ ":"
      putStrLn $ adjast 20 f1 ++ show r
      putStrLn $ adjast 20 f2 ++ show s
      putStrLn "") diffs
  where
    adjast n s = take n $ s ++ replicate n ' '