TopCoder SRM 407
June 28th, 2008 | Published in Uncategorized
レッドカーペットみてビール3缶飲んで、さあて寝るかと歯を磨いてたら、TwitterからTopCoderがどうたらというポストが流れていて、あ、今夜24時からだったんだ! と気づいたのが23:50。あわてて参加しました。
250 問題 : SpiralWalking
Problem Statement
あたえられた矩形を時計まわりにぐるぐる周り、すべてのマス目を歩き尽くすまでに道にあったポイントを合計せよという問題。 ぐるぐる周るのってどうするんだっけや、とか壁を表現するのはどういうテクニックをつかうんだったけな、とか試行錯誤してるうちに40分くらいたって、やっとsubmit。ひどす。
コード:
bool visited[52][52];
class SpiralWalking {
public:
int totalPoints(vector levelMap) {
for (int i(0); i<52; i++) for (int j(0); j<52; j++) visited[i][j] = false;
for (int i(0); i<52; i++) {
visited[i][0] = true; visited[i][51] = true;
visited[0][i] = true; visited[51][i] = true;
}
int W(levelMap[0].size()), H(levelMap.size());
for (int i(0); i 0) {
dx = 0; dy = 1; turned = true;
} else if (dx < 0) {
dx = 0; dy = -1; turned = true;
} else if (dy > 0) {
dx = -1; dy = 0; turned = true;
} else if (dy < 0) {
dx = 1; dy = 0; turned = true;
}
}
if (4 == i) break;
if (not turned) score += levelMap[y-1][x-1]-'0';
visited[y][x] = true;
x += dx; y += dy;
}
score += levelMap[y-1][x-1]-'0';
return score;
}
};
我ながらこれはひどい。でもいちおうSystem Testにパス。
500 問題 : CorporationSalary
Problem Statement
詳しい説明は nishioさんとこを参照。
250より500の方が簡単じゃないか! 再帰でいっぱつやん! と5分くらいで書いてsubmit。
コード:
class CorporationSalary {
public:
long long calcSalary(int x, vector &salaries, vector &relations) {
if (-1 != salaries[x]) return salaries[x];
int count(0);
int total(0);
for (size_t i(0); i
}
long long totalSalary(vector relations) {
int N(relations.size());
vector salaries(N, -1);
for (int i(0); i
long long total(0);
for (int i(0); i
}
};
しかし、System Test でこけました。 原因を調べてみると、ふつうに桁溢れ。アホすぎる… ><
終わってから、calcSalary の中を s/int total/long long total/
にして Practice Room でテストしてみるとちゃーんとパスしました。もったいない。
ひどい内容だったにもかかわらず、Ratingは +6 で 921 になりました。やっぱりもったいない。
やはりアルコール入れると集中力、注意力ともに低下してよくないですね ><
なんとなくよさそうに見えるスライドのつくりかた
June 26th, 2008 | Published in 日常
Ruby会議2008のLTにて、内容はともかくスライドについてちょこちょこと好評をいただけたようなので、かんたんに気をつけたことをメモってみます。
でかい絵を貼る
デブサミ 2008 で、ジョエルが言っていたことを思い出しながら、つくってました。 曰く、キャッチーなビジュアル、音で聴衆を楽しませようよ、と。サービス精神ってたいせつですよ、と。 肝心のしゃべくりの方でサービス精神が足りなかったのは自分–ですが…
写真をどうするかについては、自分のもってる写真コレクションが貧相だったので、flickrを頼りました。flickrには、Creative Commons ライセンスのものだけを検索するオプションがあるので、これをつかいます。
例:
おすすめは、CC-BYのものをつかうこと。プレゼンにも使えて、二次著作物として配布することも可能です。 スライド中の画像のそばに、ちゃんと著作者のクレジットを添え、写真に元画像へのリンクをつけておくとよいですね。
カラフルにする
プログラミングを楽しもう! という趣旨だったので、楽しくなるようなクレヨンカラーを選んでます。でも色をつけるのはほんの少しの文字数にしといたほうがメリハリ効きますね。
まとめ
CC-BYいいよ。
次回は内容についても印象に残ってもらえるようなものをつくらなきゃですね。
Ruby会議2008で話してみて
June 23rd, 2008 | Published in 日常
去年参加したとき (その1、その2) にスピーカーの方々の話を聴きながら、次は自分もあちら側へ行かねば! という焦燥感ばかりがありました。 あれから一年経ち、なんとかLTでしゃべらせていただくことができました。ありがとうございます。 発表内容についてはすでに書いたので、それ以外のことを書く。
話すことのメリット
- イベントに対するモチベーションが極大になる: 追い込まれることもあるけれど、私は元気です。
- 知り合いが増える: 声をかけてもらえやすくなると思います。引っ込み思案の方にこそぜひ。
- 終わったあとのビールがうまい
話すことのデメリット
nil
トリビア
会場があんなにでかいと逆に緊張しないものでした。1000speakersみたいに、聴いてる人が近いときの方が緊張してたと思う。
1年前からこれまでのエントリを振り返ってみると、一般的にはつまらないけれどそのときの自分にとって面白いと思えるものをちまちまつくってきてたなと。そういうのをつなぎ合わせて、今回とうとう話す場をいただけたのかなと。スティーブジョブズの言っている、connecting dots なのかなと。 そういうことをやっていこうよ、というのがぼくのプレゼンで言いたかったことでした。 言いたかったことをプレゼンで言わずにブログで書く「つづきはWebで!」メソッドですね (よくない)
Ruby会議、参加してたけどなんかいまひとつ盛り上がりきれなかったなぁとか感じてる方は、次の何かでスピーカー応募してみると見方が変わるかもしれません。ぼくがそうであったように。 尻込みすることもあるけれど、やってみると案外できるものです。 ここを読んでくださってる、消化不良のあなたがつぎに発表していればいいな。
Ruby会議2008を聴いていて
June 23rd, 2008 | Published in 日常
自分が話したことについてはこちらに書いたので、二日間聴いていて胸に留まったことを。
処理系のはなし
MVMは本格始動しているのですね。1.9.xに入るとかアグレッシブすぎる。興味津々なのでウォッチしとかないと。JRubyはアプリ展開のくだりに説得力があった。
なによりMacRubyがすごかった。Objective-C 2.0をベースにしてるからGCもそっちにおまかせ、Cocoaのフレームワークもつかえるよ、とかいう。 そんなのを1人で片手間でやってるとかすごすぎる。Laurent++。 MacRubyは、JRubyと同じくらいのレイヤに位置するんだと思いました。JRubyがランタイムとしてJVMをつかってるのに対し、MacRubyはAppleのObjective-C実装に基づいてる。 これから先は、LLVMをつかって高速化するとかも考えてるらしい。うは。
ぼくは、「iPhoneでうごくの? (currently, NO)」 とか、「昨夜書いたというHotCocoaは何行くらいのコード? (300行くらい)」 とかいう質問を投げていました。
RubyCocoaに対する立場はどうなるんだろ、と懇親会でhisaさんに聞いたり、kimurawさんが質問したりしていましたが、RubyCocoaがなくなることはないそう。よかった (これまでの資産的な意味で)。
るりま
そうだ、やらなきゃ! 去年も同じようなことを感じてた。 下々にならねば。
LT
情熱的なトークっていいですね。伝えたいことがある、だからしゃべる。シンプルだ。 おもしろネタはもちろん楽しいし華を添えられるけれど、心をゆさぶる話を生で聴けるというのはすばらしい体験です。来てよかったと思った瞬間。
Re^2jectTalks
同じ会場でマイクなしで2つのセッションがあるとか、それなんて魚市場カオスwww
総じて、どのトークもレベルが高かった。面白いとかためになるとかすげえとか、ジャンルはちがうけどどれも質の良さが感じられる。しかも同じ系統ばかりじゃないから飽きない。プログラムの組み方がナイスでした。
ライブコーディングをしてるひとが何人かいて、会場からデバッグ的な声が飛んだりして、とっても双方向ライブ感を楽しめました。せっかくイベントでみんな集まってるんだかし、みんな参加できるなにかが素敵ですね。そういう意味で、PostItをみんなで書いて壁に貼るというのは敷居が低くてナイスだと思いました。
Ruby会議2008でLTしてきた
June 22nd, 2008 | Published in Uncategorized
Ruby会議2008 1日目で、Folk Programming with Ruby という話をしてきました。あとで追記すると思いますが、とりあえず当日記憶がはっきりしているうちに書き留めておくメソッド。
5分前まで動いていたQuartzComposer Gainer Plugin が動かなくなってしまい、たいへん残念でgdgdなプレゼンになってしまいました >< すみません ><
2008.06.23 03:28 追記:
- あとで書く: なんかスライドにいい評価を頂けてるのでスライドのつくりかたを書く
- あとで書く: Ruby会議2008全体について書く
- あとで書く:
しゃべることについて書く → 書いた
言いたかったこと
Webアプリでなにかつくる、なんてみんなやってる。そんなコモディティ化されてることをやっててもおもしろくないんじゃない? もっと変てこりんなユーザインターフェイス (物理的なもの含め) を実験して遊びたくない? ブラウザの外にも、おもしろいことはたくさんあるよ。
続きはWebで!
ここからは続きはWebでメソッド。
今日、話した内容のターゲットは、これからプログラミングを始めるひと、仕事のプログラミングばっかりしてて、個人的なプロジェクトがないひと、です。 Ruby会議に来ているようなひとたちは、そもそもこの範疇にあたらないので、この話をRuby会議でやるというのはいかがなものか、という意見はさておき。
これからプログラミングを始めるひとに: たしかに、Webアプリのプログラミングは楽しいものです。コミュニケーションに基づいてる、迅速なフィードバック、etc etc。 でも、サーバサイドでデータベースをいじったり、ブラウザ内での表現を極めたりするのって仕事でもできそうじゃない? あなたの目の前にあるコンピュータって、もっとなにかすごいことできそうじゃない?
仕事のプログラミングばっかりしてるひとに: 組織の中で生きていると、すごい技術をもってるひとというのは、どこにでもいるものだと思うものです。でも、そのひとたちはプログラミングを仕事としてしかやってない。趣味でなにかつくり、それをたとえば 1000speakers で発表するとか、見ない。 なんかそういうのってもったいなくない? あなたはこんなにすごいのに、埋もれてない?
ぼくが言いたかったのは、そういうことです。 つくった例を4つ出しましたが、そんなのは瑣末なことで、ここで書いたことだけが伝わればいいなとおもってました。
明日も楽しむぞ!
IRCのログはつづきにて。 Read the rest of this entry »
C++でヘッダファイルに定義を書くかどうかで生成されるシンボルが変わる
June 19th, 2008 | Published in Uncategorized
不思議な現象に出くわしたので、エントリにしてみるテスト。
C++でプログラミングしていて、ヘッダにクラスのコンストラクタの定義を含めず、宣言だけを書くというのはよくあることだと思います。 次のようなヘッダファイルを考えてみます。
sym.h:
ifndef SYM_H
define SYM_H
class Sym {
public:
Sym();
}; // Sym
endif // SYM_H
実装は sym.cc に書きます。
include "sym.h"
Sym::Sym() {
}
int main() {
Sym sym;
return 0;
}
これらをg++でコンパイルして、生成されるオブジェクトファイルを覗いてみると、驚きました。
% nm sym | c++filt
0000200c D NXArgc
00002008 D _NXArgv
00001fde T Sym::Sym()
00001fd6 T Sym::Sym()
00002000 D __progname
00001fc8 t __dyld_func_lookup
00001000 A __mh_execute_header
00002004 D environ
U _exit
00001fe6 T _main
00002010 d dyld_mach_header
00001fb4 t dyld_stub_binding_helper
00001f74 T start
なんで Sym::Sym()
が2つ存在するんだ?
そして、ヘッダファイルに定義も含めると、1つになります。
ifndef SYM_H
define SYM_H
class Sym {
public:
Sym() {}
}; // Sym
endif // SYM_H
nm sym | c++filt
0000200c D NXArgc
00002008 D _NXArgv
00001fb6 T Sym::Sym()
U __gxx_personality_v0
00002000 D ___progname
00001f90 t __dyld_func_lookup
00001000 A __mh_execute_header
00002004 D environ
U _exit
00001f9e T _main
00002010 d dyld_mach_header
00001f7c t dyld_stub_binding_helper
00001f3c T start
なぜだー。Mac OS X / Linux で確認しています。
使えるメモリが極めて限られている状況だと、こういう小さなところでも無駄は減らしたい。でもヘッダファイルに実装を書きまくるのは、できれば避けたいものです。
原因が分かるかたいらっしゃれば、ご教授ください ><
再現するためのコード一式を、symbols.zip に固めました。 Makefile中の CXXFLAGS += -DCOMPILE_BY_SPLIT
のところを無効にするとヘッダファイルでコンストラクタの定義を行い、有効にすると.ccの中で定義する、というふうにしています。
Google Code Jam 2008
June 19th, 2008 | Published in Uncategorized
に登録しておきました。 来月ですね!
前回とちがって、TopCoderのアプリを使うわけではなさそうです。 自分はRubyを言語として選んでみました。できるのかな。
2006年に挑戦し、自分のふがいなさを思い知らされ、 そこからTopCoderで練習を積んできました。 2年経ったいま、自分はちゃんと進歩しているのだろうか。
当時のエントリ:
-
Google Code Jam 2006
-
Google Code Jam 2006 Practice 500
-
Google Code Jam Practice
-
Google Code Jam 2006 日程
-
CodeJam Practice : 1000点問題
-
CodeJam Qualification Round開始
-
CodeJam Qualification Round 結果
-
CodeJam Qualification Round 750点問題
-
Google CodeJam 2006 で使ったテンプレート
-
CodeJam Qualification Round : SystemTestとおった
Ruby会議 2008 LTに出ます
June 18th, 2008 | Published in Uncategorized
Ruby会議2008 の LTに申し込んだところ、ありがたいことに採択されたLT駆動開発者です。
最近つくってたいろいろをまとめて発表する形になる予定です。おてやわらかにどうぞ ><
refe2.vim
June 15th, 2008 | Published in Uncategorized
Rubyリファレンスマニュアル刷新計画ですすめられている新リファレンスシステムを、Vimから引けるようにしてみました。
ダウンロード
コード
つかいかた
Rubyのファイルを編集中に、単語の上で K を押すと該当するリファレンスマニュアルのページに飛びます。
必要なもの
- Rubyリファレンスマニュアル → るりまWiki から
-
--enable-rubyinterp
つきでコンパイルされたVim
準備
0: refe2.vimの一式をcheckout。
1: ダウンロードしたRubyリファレンスマニュアルにパッチをあてます。
% cd ruby-refm-1.9.0-dynamic
% patch -p0 < /tmp/refe2-vim/bitclust.patch
2: refe2.vim の中の s:bitclust_path に bitclustのパスを指定します。
3: refe2.vim を ~/.vim/ftplugin/ruby あたりにコピー。
ToDo
- 色付け
- 文脈に沿ったリファレンスの表示。 たとえば、
arr = [1,2,3]
arr.first
というコードがあったときに、 arr.first で検索してもちゃんと
Array#first にひっかかるようにしたい。 Vimスクリプトの中のRubyインタプリタで周辺をevalしたらできたりしないだろうか。
その他
今回はじめてVim (+Ruby) スクリプトを書いてみました。 てんで荒削りな実装なので、コードの添削、書き換え、forkなど、どしどしやってもらえると幸せです。
CodeReposとgithubを併用する
June 15th, 2008 | Published in Uncategorized
CodeReposをありがたく使わせてもらっているけど、githubにも同じコードを置きたい、ということがよくありますよね。あるんです。以下はそのときのためのメモ。
プロジェクトを始めるとき
- CodeReposにファイルやディレクトリ一式 (X) をつくってcommit
- githubにレポジトリをつくる。(自分用のclone URL を Yとする)
- git svn clone で CodeReposにつくった一式 (X) をcheckout
- checkoutしたディレクトリで、git remote add github Y
- git remote push github
この手順でやればOK。 先にCodeReposでcommitしておいてからgit svnでcheckoutというところがミソなのかなと。
例
refe2-vim というプロジェクトをはじめることを考えます。
- mkdir $CODEREPOS/lang/vim/refe2-vim (X)
- create new github repository → http://github.com/mootoh/refe2-vim/ (Y: :mootoh/refe2-vim.git)
- git svn clone http://svn.coderepos.org/share/lang/vim/refe2-vim
- cd refe2-vim
- git remote push github
だいたいこんなかんじ。
日々commitするとき
- ローカルに commit
- CodeReposにcommit (git svn dcommit)
- github にpush (git remote push github)
でOK。
ToDo: Mercurialも混ぜてみる