CivRevが面白い。
Civilization Revolution
http://www.civilizationrevolution.com/iphone/
結局、入手したipodは(今のところ)ゲーム機になっています。っていうか、すげえおもしろい!
当方、civシリーズはアルファケンタウリ(SMAC)をやっていただけなのですが、土地改良とか道路引いたりとかの要素がない分、とっつきやすくていいです。SMACでは面倒なのでAUTOでやってたし。
初めての人はチュートリアルがわかりづらいとか思うかもしれませんが、検索するとDS版の情報が引っかかるので、まあ大丈夫じゃないかと。
ipod/iphoneを持っていて、戦略シミュレーションが好きなら文句なくお勧めです。無料体験版でもかなり遊べますので、とりあえず落としてみてください。
Google C++ スタイルガイド日本語訳
cppllの過去ログを見ていたら発見。
Google C++スタイルガイド日本語訳
http://www.henshi.net/k/hiki.cgi?GoogleCppStyleGuide
Googleの社内コーディング規約らしいです。読んで色々思うところはあるのですが、
しばらく前に、10万行くらいのプロジェクトにboost::shared_ptrを全面採用してしんどかったのを思い出した。
smart_ptr自体のパフォーマンスはそれほど問題なかったのですが、問題はweak_ptrが内部で取得しているmutexとかが思いっきり時間を食っている感じ。最後の追い込みでこの辺がネックになった。
弱参照ポインタなんて使わなきゃいいだろ、っていえば終わる話なのですが、そもそも弱参照しないのであればshared_ptrである必要もあまり無いわけで、それなら割り切りでscoped_ptrというのもアリかなあと。それかintrusive_ptrで頑張るか。
Boost
Boostからは許可されたライブラリのみ使用してください。
(略)
現在は以下のライブラリが許可されています。
- Compressed Pair:boost/compressed_pair.hppに収録
- Pointer Contariner:boost/ptr_containerに収録(ただしserializationを除く)
- Array:boost/array.hppに収録
- The Boost Graph Library (BGL):boost/graphに収録(ただしserializationを除く)
- Property Map:boost/property_map.hppに収録
- イテレータの定義に関するIteratorの一部:boost/iterator/iterator_adaptor.hpp, boost/iterator/iterator_facade.hpp, and boost/function_output_iterator.hpp に収録
選択肢がおもしろい。Graphは使っていいんだ。あんまり詳しくないのですが、グラフなら専用のライブラリよりもboostの方がいいのかしら?
行の長さ
コード中のテキストの各行は80字以内であるべきです。
垂直方向の空白
垂直方向の空白の使用は最小限に留めてください。
詳細
これは規則というより原則です。使わなくてすむなら空行を使わないでください。特に、関数と関数の間に1〜2行を超える数の空行を入れないでください。関数を空行で開始したり終了したりしないでください。関数の内側での空行の利用に注意してください。
これはいいな。以前の職場で、「空行がないと見づらいだろ」と言われて、大量の空行でスカスカのスタイルを強制されていたので、ディスプレイの中の情報量が足らんかったです。ある意味で富豪プログラミング。
おわりに
常識を働かせて、一貫性を守ってください。
あなたがコードを編集しているなら、数分間を使って周りのコードを見てそのスタイルを見定めてください。そこでifのカッコの周りにスペースが使われていたら、あなたもそうするべきです。そこでコメントが星でできた小さな箱に囲まれていたら、あなたもコメントを星でできた小さな箱で囲うべきです。
(略)
しかしその場その場でのスタイルというのもまた重要です。あなたがファイルに追加しようとしているコードが周囲の既存のコードとまったく違って見えたら、その不連続は読む人のリズムを完全に乱してしまうでしょう。これは避けてください。
やっぱり最後はこれが正しいということで。
でも、このルールは参考になるな。それに、オープンソースのコードとかを読んでいるとこれに似た感じのスタイルが多い気がします。
近況
- 丸二ヶ月くらい練習していないのに、勢いで谷川真理ハーフマラソンに出場しましたところ、自己ワーストを大幅に更新する快挙を達成し軽く死にたくなりました。というか、ハーフなのに足がボロボロで、フルじゃなくて本当によかった。
- ipod touchを入手。おもちゃとしておもしろいのですが、ネットにつながっていない状況だと実用性が微妙。家の中では便利。でも、入力はCLIEの方がよくね? そんなことはないか。とりあえず無料で便利なアプリを探します。
SRM457 div1
と言うわけで、次回です。結果から言うと、0点。全然ダメだー。
250 TheTriangleBothDivs
http://www.topcoder.com/stat?c=problem_statement&pm=10696&rd=14144
問題文の読み込みが甘くて、とりあえずサンプルは通したのですが、開始1分くらいでChallengeされて終了。分とか秒もちゃんと計算しなきゃだめなのね?
次からは、見栄をはらずにYahoo! 翻訳で問題文を機械翻訳します。しょんぼり。
500 TheHexagonsDivOne
http://www.topcoder.com/stat?c=problem_statement&pm=10702&rd=14144
7マスのHEXに、1~N*2の数字を置くときの置き方を数える。
ただし、
- 同じ数値は二回使えない。
- 隣り合う数値同士をNで割ったときの剰余が同じだとだめ。
問題文を見た印象で、色分け問題かなあと思ったんですが、解けず。
よく考えれば、高校レベルの組み合わせの問題まで落ちそうなので、ある程度紙の上で計算してやれば、すんなり方針が立って解けたかも。でも、時間切れ寸前でそんなことを考えてもどうしようもありません。
あとで時間をかけてときます。
結果
0点なので、レーティングは当然ダウン。1338->1270。
問題文をちゃんと読めるようにするのと、もっと冷静に分析するようにすればよくなるのかなあ。いろいろ頑張らないと難しいですね。
とりあえず、楽しかったのでしばらく参戦します。
SRM456 div2
初参戦。結構練習してきたけど、時間制限があるとなかなか難しい。
250 AppleWord
指定した文字列をAppp .... pppleという形式の文字列に変換するときに、変更しなければならない文字数を調べる。
これは簡単。文字列を頭から調べて、変換してみて回数を数えるだけ。でも、実践では15分くらいかかった。慣れないと難しい。
500 SilverDistance
将棋の銀を動かして、任意の升目に移動するための移動回数の計算。
他の人の回答は、
- まず、斜め移動のみで移動させてみて、移動回数を計算。
- 次に、一回前に移動させた状態から、斜め移動のみで計算。
- 1.と2.の比較で短い方を採用。
というのが多かったです。前移動2回は斜めで置き換えられるので、これで問題なし。
しかし、思いつかなかったので、銀を実際に動かして計算しました。デバッグが辛かったです。
自戒の意味も込めて、自分の解答を貼っておきます。
int minSteps(int sx, int sy, int gx, int gy) { int result=0; // 現在位置との差分を見る。 int dx = gx - sx; int dy = gy - sy; // int count=0; bool flip = false; while(dx!=0 || dy!=0) { if (dx < 0) { if (dy < 0) { dx++; dy++; result++; } else if (dy > 0) { dx++; dy--; result++; } else { dx++; dy++; result++; } } else if (dx == 0) { if (dy > 0) { dy--; result++; } else { dx--; dy++; result++; } } else { if (dy < 0) { dx--; dy++; result++; } else if (dy > 0) { dx--; dy--; result++; } else { dx--; dy++;; result++; } } } return result; }
ダサいなあ。しょんぼり。
1000 CutSticks
時間がなかったので、問題文を読んだだけ。ネットで見たら、2分探索らしいです。全然思いつける気がしない。
このレベルの問題をコンスタントに解けるようになるのが目標かな。頑張ります。
結果
レーティング1338で、次からdiv1です。やった! 次も頑張ります。