今日覚えたこと

勉強しないつもりだったけどTopCoderが近づいてくるとついつい勉強してしまう、プログラマの三大美徳の一つ、自尊心の強さ。

  • 多分mapを使いこなせるようになっておく必要があるかと思う。
        • -
template<class T, size_t N>
size_t len(T (&)[N]){
  return N;
};

これがありなのだから

template<typename T1, typename T2, size_t N>
map<T1, T2> mapzip(T1(&)[N] keys, T2(&)[N] values){
  map<T1, T2> m;
  for(size_t i=0; i<N; i++){
    m[keys[i]] = values[i]; 
  }
  return m;
};

これもできることを期待したのだけどそうは問屋がおろさなかった。typenameとか(&)[N]とかをきちんと理解しないといけないようだ。

        • -
template<class T1, class T2>
map<T1, T2> mapzip(T1 keys[], T2 values[], size_t N){
  map<T1, T2> m;
  for(size_t i=0; i<N; i++){
    m[keys[i]] = values[i]; 
  }
  return m;
};

int main() {
  int xs[] = {1, 2, 3}, ys[] = {10, 20, 30};
  map<int, int> m = mapzip(xs, ys, 3); 
  print_map(m.begin(), m.end());
}

妥協した。
print_map(m)って呼べるやつを作ろうと思ったけどうまく動かない。

        • -

print_mapできた。

template<typename K, typename V>
  void print_map2(map<K, V> m){
  cout << "{";
  for(typename map<K, V>::iterator it=m.begin(); it != m.end(); ++it){
    if(it != m.begin()) cout << ", ";
    cout << (*it).first << ":" << (*it).second;
  }
  cout << "}" << endl;
}

「for(typename」が重要。

        • -

mapzipもできた。

template<class T1, class T2, size_t N>
map<T1, T2> mapzip(const T1(&keys)[N], const T2(&values)[N]){
  map<T1, T2> m;
  for(size_t i=0; i<len(keys); i++){
    m[keys[i]] = values[i]; 
  }
  return m;
};

int main() {
  int xs[] = {1, 2, 3}, ys[] = {10, 20, 30};
  map<int, int> m = mapzip(xs, ys); 
  print_map2(m);
}

変数名が入るのは&の後ということだった。

SocketServerでソケットの再利用

SocketServer.ThreadingTCPServer.allow_reuse_address = True

って書くと内部でソケットを作る際にSO_REUSEADDRをつけてくれるので、サーバ終了後即座にまた起動したときに「Addres already used」って怒られなくなる。僕は全部reuseでよかったので上のような書き方をしたけども、特定のインスタンスだけreuseするならそのインスタンスsに対して「s.allow_reuse_address = True」すればいい。


理解するまでの間、再利用になるまで30秒待ちを何回も繰り返したので合計で何分か損した。

明日20:00からSRM400

あんまり勉強してない。250点問題を確実に解くことに集中しようかな。知るべきライブラリを知らなかったらその場で調べる方針で。


あと「TopCoderは海外のイベントだから時間帯が深夜とかでつらい」なんて言ってる人は「TopCoderやる気が全然ないので次のイベントがいつあるのかすらチェックしていない」と自覚すべきだ。自分一人がやる気ないだけならまだ実害ないが、間違った情報を流して他人のやる気までそぐのなら有害だ。


そんなこんなで次回は夜の8時からという「晩ご飯を食べ過ぎて眠くならないように注意しなきゃ」って時間帯の開催。

http://www.topcoder.com/tc?module=MatchDetails&rd=12172

Total Prize Purse of $5,000 !!!
(snip)
The first and second place competitors in each division two room will receive 60% and 40% of the room award, respectively.

おおおっ?!

解説しよう。次回のSRM400にはブリティッシュテレコムから5000ドルの賞金が出る。今まで「どうせ自分には関係のない話だ」と思っていたが実は違ったようだ。今回始める人やまだレーティングが1400に達していない人はDIV 2っていう「二軍」でプレイすることになるのだけど、その二軍に賞金総額の30%が割り当てられるそうな。そしてプレイヤーはランダムに20人ずつ部屋に割り当てられるのだけど、この部屋ごとに1位と2位が賞金をもらえるらしい。ランダムだとしても10%の確率で賞金をもらえるw

もちろん賞金総額がそんなに大きいわけではないので、DIV2の部屋内1位程度では1000~1500円程度になりそうな気がするけど、金額はさておき賞金をもらうのってかっこいいよね(ぉ

献本

とりあえず著者に送られてきた6冊のJython本は1冊がラボの本棚経由で、残り5冊がお金のない学生さんへと郵送された。僕の手元に1冊もない。まぁそのうちラボの本棚に戻ってくるだろうけど。というわけで第3弾の献本はもうしばらく先になりそう。在庫がなくてはどうしようもない。

一応、今のところの考えを整理しておくと、下の2つの条件を両方みたす人には献本が送られるかもしれません。みたさない人にも送られるかもしれません。あくまで「送られるかもしれません」で。

  • 学生もしくは未成年
  • 年収が300万円未満

欲しい人は僕のメールアドレスに住所・氏名・郵便番号などをメールしてください。まぁでも次の在庫がいつ入るのかわからないので、早く手に入れたいならAmazonで買う方がいいかと。主に「読みたいけど3000円は高い…」という学生向けだと思っていただければ。

併行して図書館とかにも寄贈した方がいいのかな?