2011年02月20日 日曜日
■ [メモ]std::wstring...
つ、スゴイWindowsと相性が悪くて頭にくる...
頼れるべきはWideCharToMultiByte()...
つか、Windows(R)ではWin32APIとかM$提供のライブラリが正義であり、仕様だからなぁ。どんなに異様な動作でも...
■ [fromC/C++][SRM]堅牢化...
予想通りというか、ある程度プログラムが大きくなるとほとんどエラーと例外処理しかないや...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; }
■ [fromC/C++][SRM]9割9分完成...
あと、適当に直すだけ...
チャレンジフェーズ(逐次解析)モードを実装した...
いやぁ、これは洗練しすぎだろ。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
コメント