Hatena::Grouphaskell

Haskell卒業!

  Haskellの勉強 -> 演習 -> 卒業
  Haskell&プログラミング卒業しました。その他サイコなことは「route150の日記」に書いています。

2011年02月20日 日曜日

[]std::wstring... 02:38

つ、スゴイWindowsと相性が悪くて頭にくる...


頼れるべきはWideCharToMultiByte()...


つか、Windows(R)ではWin32APIとかM$提供のライブラリが正義であり、仕様だからなぁ。どんなに異様な動作でも...

[][]堅牢化... 09:45

予想通りというか、ある程度プログラムが大きくなるとほとんどエラーと例外処理しかないや...orz


でも、ほとんど処理を間違わない程度にまでバグを潰した。現状ではバグらせる方が難しいくらい...かな...


同じく、SRM144 DIV2 200 pointerにて検証...


import Control.Monad
import TC.Types
import TC.QuickTest
import TC.QuickTest.Gen
import TC.Monitor
import Text.Printf
import MyLibrary.GHCi.Encoding.CP932

main :: IO ()
main = do
  _ <- useCP932 ""
  let -- SRM144 DIV2
      arg_0 = TCArg (choose (0, 86399) :: Gen TCInt)
      testCase = TCNormalCase {
          className   = "Time",                   -- クラス名
          methodName  = "whatTime",               -- メソッド名
          ret         = (undefined :: TCString),  -- 返り値の型
          args        = [arg_0]                   -- 引数リスト
        }
  let testParameters = defaultParameters{maxSize = 10}
  Just database <- monitor testParameters testCase
  -- printfとstd::coutと相性が悪いのでputStrLn系で...
  forM_ (zip [0 ..] database) $ \(caseNo :: Int, (args, candidates)) -> do
    putStrLn $ printf "TestCase %d" caseNo
    forM_ (zip [0 ..] args) $ \(i :: Int, arg) -> do
      putStrLn $ printf "  arg_%d: %s " i arg
    forM_ candidates $ \(userName, result) -> do
      let m = case result of
                OK _ (TCString s) -> Just s
                _                 -> Nothing
      putStrLn $ printf "    %-20s -> %s" userName (show m)

実行結果(SRM144 DIV2 200 pointerのランキング上位5人と自分を比較)...


//////////////////////////////////////////////////
// tc37564 (DLL Version: 0.49)
//////////////////////////////////////////////////

NPL Parserを初期化しています...
パケットキャプチャエンジンを初期化しています...
バッファフラッシュ用のイベントタイマを作成しています...
初期化が完了しました。

ネットワークを監視します...
アダプタ(0: MS TCP Loopback interface)は監視下に入りました。
アダプタ(1: WAN Miniport)は監視下に入りました。
アダプタ(2: ローカル エリア接続)は監視下に入りました。
(注) 監視を止めるにはCtrl+Cを押して下さい。

<tc37564> touristのテストコード(TC0.cpp)を生成しています...
<tc37564> touristのテストコードの検証に成功しました。
<tc37564> rng_58のテストコード(TC1.cpp)を生成しています...
<tc37564> rng_58のテストコードの検証に成功しました。
<tc37564> ktuanのテストコード(TC2.cpp)を生成しています...
<tc37564> ktuanのテストコードの検証に成功しました。
<tc37564> JongManのテストコード(TC3.cpp)を生成しています...
<tc37564> JongManのテストコードの検証に成功しました。
<tc37564> wd.hのテストコード(TC5.cpp)を生成しています...
<tc37564> wd.hのテストコードの検証に成功しました。
<tc37564> route150のテストコード(TC6.cpp)を生成しています...
<tc37564> route150のテストコードの検証に成功しました。

アダプタ(0: MS TCP Loopback interface)の監視を止めました。
アダプタ(1: WAN Miniport)の監視を止めました。
アダプタ(2: ローカル エリア接続)の監視を止めました。
ネットワークの監視を止めました。
ワーカースレッドの終了待ちです...
全ての処理が正常終了しました。

TestCase 0
  arg_0: 22445
    tourist              -> Just "6:14:5"
    rng_58               -> Just "6:14:5"
    ktuan                -> Just "6:14:5"
    JongMan              -> Just "6:14:5"
    wd.h                 -> Just "6:14:5"
    route150             -> Just "6:14:5"
TestCase 1
  arg_0: 50897
    tourist              -> Just "14:8:17"
    rng_58               -> Just "14:8:17"
    ktuan                -> Just "14:8:17"
    JongMan              -> Just "14:8:17"
    wd.h                 -> Just "14:8:17"
    route150             -> Just "14:8:17"
TestCase 2
  arg_0: 4511
    tourist              -> Just "1:15:11"
    rng_58               -> Just "1:15:11"
    ktuan                -> Just "1:15:11"
    JongMan              -> Just "1:15:11"
    wd.h                 -> Just "1:15:11"
    route150             -> Just "1:15:11"
TestCase 3
  arg_0: 44525
    tourist              -> Just "12:22:5"
    rng_58               -> Just "12:22:5"
    ktuan                -> Just "12:22:5"
    JongMan              -> Just "12:22:5"
    wd.h                 -> Just "12:22:5"
    route150             -> Just "12:22:5"
TestCase 4
  arg_0: 84539
    tourist              -> Just "23:28:59"
    rng_58               -> Just "23:28:59"
    ktuan                -> Just "23:28:59"
    JongMan              -> Just "23:28:59"
    wd.h                 -> Just "23:28:59"
    route150             -> Just "23:28:59"
TestCase 5
  arg_0: 38153
    tourist              -> Just "10:35:53"
    rng_58               -> Just "10:35:53"
    ktuan                -> Just "10:35:53"
    JongMan              -> Just "10:35:53"
    wd.h                 -> Just "10:35:53"
    route150             -> Just "10:35:53"
TestCase 6
  arg_0: 78167
    tourist              -> Just "21:42:47"
    rng_58               -> Just "21:42:47"
    ktuan                -> Just "21:42:47"
    JongMan              -> Just "21:42:47"
    wd.h                 -> Just "21:42:47"
    route150             -> Just "21:42:47"
TestCase 7
  arg_0: 31781
    tourist              -> Just "8:49:41"
    rng_58               -> Just "8:49:41"
    ktuan                -> Just "8:49:41"
    JongMan              -> Just "8:49:41"
    wd.h                 -> Just "8:49:41"
    route150             -> Just "8:49:41"
TestCase 8
  arg_0: 71795
    tourist              -> Just "19:56:35"
    rng_58               -> Just "19:56:35"
    ktuan                -> Just "19:56:35"
    JongMan              -> Just "19:56:35"
    wd.h                 -> Just "19:56:35"
    route150             -> Just "19:56:35"
TestCase 9
  arg_0: 25409
    tourist              -> Just "7:3:29"
    rng_58               -> Just "7:3:29"
    ktuan                -> Just "7:3:29"
    JongMan              -> Just "7:3:29"
    wd.h                 -> Just "7:3:29"
    route150             -> Just "7:3:29"
TestCase 10
  arg_0: 65423
    tourist              -> Just "18:10:23"
    rng_58               -> Just "18:10:23"
    ktuan                -> Just "18:10:23"
    JongMan              -> Just "18:10:23"
    wd.h                 -> Just "18:10:23"
    route150             -> Just "18:10:23"
(3.42 secs, 12817056 bytes)

今度はこれをリアルタイムで解析するようにすれば完成...だけど、もう飽きてきた...orz


因みに自動生成されるC++のソースコードはこんな感じ。種明かしすると、結構単純ですよん...


#include "QuickTest.h"

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

class Time
{
public:
    string whatTime(int seconds)
    {
        ostringstream is;
        
        is << seconds / 3600 << ":" << seconds % 3600 / 60 << ":" << seconds % 60; 
                
        return is.str();
    }
};

static VOID TestCase_0()
{
INT32 arg_0 = 22445;

QUICK_TEST(Time().whatTime(arg_0));
}

static VOID TestCase_1()
{
INT32 arg_0 = 50897;

QUICK_TEST(Time().whatTime(arg_0));
}

static VOID TestCase_2()
{
INT32 arg_0 = 4511;

QUICK_TEST(Time().whatTime(arg_0));
}

static VOID TestCase_3()
{
INT32 arg_0 = 44525;

QUICK_TEST(Time().whatTime(arg_0));
}

static VOID TestCase_4()
{
INT32 arg_0 = 84539;

QUICK_TEST(Time().whatTime(arg_0));
}

static VOID TestCase_5()
{
INT32 arg_0 = 38153;

QUICK_TEST(Time().whatTime(arg_0));
}

static VOID TestCase_6()
{
INT32 arg_0 = 78167;

QUICK_TEST(Time().whatTime(arg_0));
}

static VOID TestCase_7()
{
INT32 arg_0 = 31781;

QUICK_TEST(Time().whatTime(arg_0));
}

static VOID TestCase_8()
{
INT32 arg_0 = 71795;

QUICK_TEST(Time().whatTime(arg_0));
}

static VOID TestCase_9()
{
INT32 arg_0 = 25409;

QUICK_TEST(Time().whatTime(arg_0));
}

static VOID TestCase_10()
{
INT32 arg_0 = 65423;

QUICK_TEST(Time().whatTime(arg_0));
}


INT main(INT argc, LPSTR argv[])
{
TC::HsBegin(&argc, &argv);

TestCase_0();
TestCase_1();
TestCase_2();
TestCase_3();
TestCase_4();
TestCase_5();
TestCase_6();
TestCase_7();
TestCase_8();
TestCase_9();
TestCase_10();


TC::HsEnd();
fflush(stdout);
return 0;
}

[][]9割9分完成... 19:07

あと、適当に直すだけ...


チャレンジフェーズ(逐次解析)モードを実装した...


いやぁ、これは洗練しすぎだろ。Haskellの戦闘能力はハンパないわ...


import TC.All

main :: IO ()
main = do
  -- 問題詳細を記述...
  let sRM144Div2Easy = TCNormalCase {
          {- クラス名   -}  className   = "Time",
          {- メソッド名 -}  methodName  = "whatTime",
          {- 返り値の型 -}  ret         = (undefined :: TCString),
          {- 引数リスト -}  args        = [arg_0]
        } where
            arg_0 = TCArg (choose (0, 86399) :: Gen TCInt)
  -- チャレンジフェーズ(逐次解析)モードで実行...
  challengePhase defaultParameters{maxSize = 10} sRM144Div2Easy

実行結果(GHCiでリアルタイムに動くぉ)...


$> main
Loading package time-1.2.0.3 ... linking ... done.
Loading package random-1.0.0.3 ... linking ... done.
Loading package extensible-exceptions-0.1.1.2 ... linking ... done.
Loading package QuickCheck-2.4.0.1 ... linking ... done.
Loading package parsec-2.1.0.1 ... linking ... done.
Loading package regex-base-0.93.2 ... linking ... done.
Loading package regex-tdfa-1.1.7 ... linking ... done.
Loading package tc37564-0.0.0.1 ... linking ... done.
//////////////////////////////////////////////////
// tc37564 (DLL Version: 0.49)
//////////////////////////////////////////////////

NPL Parserを初期化しています...
パケットキャプチャエンジンを初期化しています...
バッファフラッシュ用のイベントタイマを作成しています...
初期化が完了しました。

ネットワークを監視します...
アダプタ(0: MS TCP Loopback interface)は監視下に入りました。
アダプタ(1: WAN Miniport)は監視下に入りました。
アダプタ(2: ローカル エリア接続)は監視下に入りました。
(注) 監視を止めるにはCtrl+Cを押して下さい。

<tc37564> kamijojeのテストコード(TC0.cpp)を生成しています...
<tc37564> kamijojeのテストコードの実行&解析が終了しました。
<tc37564> touristのテストコード(TC1.cpp)を生成しています...
  [テストケース 0] touristとkamijojeの結果が違います...
    tourist         -> "6:14:5"
    kamijoje        -> "6 : 14 : 5"
      [チャレンジ引数]
        arg_0 -> 22445
<tc37564> touristのテストコードの実行&解析が終了しました。
<tc37564> route150のテストコード(TC3.cpp)を生成しています...
  [テストケース 0] route150とkamijojeの結果が違います...
    route150        -> "6:14:5"
    kamijoje        -> "6 : 14 : 5"
      [チャレンジ引数]
        arg_0 -> 22445
<tc37564> route150のテストコードの実行&解析が終了しました。

アダプタ(0: MS TCP Loopback interface)の監視を止めました。
アダプタ(1: WAN Miniport)の監視を止めました。
アダプタ(2: ローカル エリア接続)の監視を止めました。
ネットワークの監視を止めました。
ワーカースレッドの終了待ちです...
全ての処理が正常終了しました。

(3.27 secs, 6947136 bytes)

touristさん、kamijojeさん、ご協力感謝致します...


一応、思い通りに実装できたし満足。まぁ、送信も自動化すれば1分以内に勝負が着くけど...


落ちてる点数を拾う戦略...orz