OMakeでcamlp4を使ってビルドする
USE_OCAMLFIND = true
として、ocamlfind を使うようにした上で
OCAMLFINDFLAGS += -syntax camlp4o -package meta_conv.syntx
というようにするのが、たぶん楽。
なかなか分からなかったので、メモしておく。
HaskellからAOJにサブミットする
http-enumerator使って書いた。
大したコードじゃないので、ここに貼っておくことにする。
twitter-enumeratorのコードを参考にした。
気が向いたら、公開されているAPIのためのコードも書いてまとめるかもしれない
{-# LANGUAGE OverloadedStrings #-} import Prelude hiding (dropWhile) import Network.HTTP.Enumerator import qualified Network.HTTP.Types as HT import Data.Enumerator (Iteratee, throwError, run_) import Data.Enumerator.List (dropWhile) import Data.ByteString (ByteString) import Control.Monad.Trans.Class (lift) import Control.Monad.IO.Class (liftIO) endpoint :: String endpoint = "http://judge.u-aizu.ac.jp/onlinejudge/servlet/Submit" userID :: ByteString userID = "your user id" password :: ByteString password = "your password" api :: ByteString -- method -> String -- url -> HT.Query -- query -> Iteratee ByteString IO a -> Iteratee ByteString IO a api m url query iter = do req <- lift $ makeRequest m url query mgr <- lift newManager http req (handleError iter) mgr where handleError iter' st@(HT.Status sc _) _ = if 200 <= sc && sc < 300 then iter' else throwError $ StatusCodeException sc "Bad Status Code" makeRequest :: ByteString -> String -> HT.Query -> IO (Request IO) makeRequest m url query = do pu <- liftIO $ parseUrl url return $ pu { method = m, queryString = query } submitQuery user pass pid lang src = [("userID" , Just user), ("password" , Just pass), ("language" , Just lang), ("problemNO" , Just pid), ("sourceCode", Just src)] submit :: ByteString -- problem id -> ByteString -- language -> ByteString -- source code -> Iteratee ByteString IO a -- iter -> Iteratee ByteString IO a submit pid lang src = api "POST" endpoint (submitQuery userID password pid lang src) main :: IO () main = do run_ $ submit "0000" "C" "int main(){return 0;}" (dropWhile (const True))
ICPC2011 地区予選福岡大会
結果
5ACで12位でした。
大学順位だと9位タイらしい。
本番
A,B,D,E,Fの順に解きました。
A,B,Dは特に何もなく書けばよい、というだけだったのですけど、3人ともFはよく分からんということになってしまっていて、DP力の不足を感じます。
Eはチームの人がいつのまにかテーブルを作って、通してしまって、ぱないと思いました。
最後の1時間はC or Hができそうな感じがしていて、かつ、どちらもやる時間は明らかになさそうだったので非常に悩ましいところだったのですが、Hを1時間弱で書ききる自信がなく、Cへ行きましたがこっちも探索を書ききれずという感じでした。
Fをもうちょっとするっと解ければ、+1問ぐらいは不可能ではなかったなぁと思います。
反省
5ACというのは、今のチームだとわりとよくできたほうだと思うので、これ以上の順位をとりたかったら、個々人がもっと実力をつけるしかなさそうですね。
下のやつの追記
結局、なんでこれがだめかっていうのを調べたり考えたりした。
2つのテンプレートの定義T1とT2があった時に、もしT1がT2をspecializationしたものならばT1 >= T2っていう順序関係ををテンプレートの定義全体の集合Tについて考える。
テンプレートを使うときは、Tからマッチするテンプレートを全部引っ張ってきたTの部分集合内で、上の順序関係について最大のものを取ってきたいんだけど、上の順序関係は当然半順序なので最大のものが存在しない場合があって、その時エラーになるとかそんなのでは。
こう書くとすごくほんとのことに見えるけど、ほんとか???
追記: T1 <= T2 じゃなくて T1 >= T2 だった
たまにやってしまうあれ
なんかおしゃれにテンプレート使っちゃうぞー、とかする時にたまにあるあれです。
どうなるんだったか、頻繁に忘れるのでメモ。
#include <iostream> using namespace std; template<class T,int n> class Array { T data[n]; public: T get(int idx); void set(T v,int idx); }; // specialization template<int n> class Array<bool,n> { bool data[n]; public: bool get(int idx); void set(bool v,int idx) { cout<<"bool"<<endl; } }; template<class T> class Array<T,0> { T data[0]; public: T get(int idx); void set(T v,int idx) { cout<<"0"<<endl; } }; int main() { // ???? Array<bool,0> ar; ar.set(true,0); }
temp_test.cpp: In function 'int main()': temp_test.cpp:36:19: error: ambiguous class template instantiation for 'class Array<bool, 0>' temp_test.cpp:15:21: error: candidates are: class Array<bool, n> temp_test.cpp:25:18: error: class Array<T, 0> temp_test.cpp:36:19: error: aggregate 'Array<bool, 0> ar' has incomplete type and cannot be defined
気持ちとしてはどっちの特定化された奴でもいいから、とりあえずどっちか使ってくれないかなーとか思うんですけど、コンパイルしてくれません。