読者です 読者をやめる 読者になる 読者になる

職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

チョードコーディング入賞!

パソコン・インターネット 競技プログラミング

先日、CodeIQさんにおいて「チョードコーディング」が開催されていたので参加しました。
全体で139人の挑戦者が居られたそうですが、なんと7位入賞を果たすことができました!
非常に嬉しい限りです。

どんな競技なのか?

「素数を小さい順に100個表示させる」という簡単なプログラミングの問題を、どれほど「普通に」解くことができるか、という競技です。普通であればあるほど得点が高い、という訳です。
具体的には

の3つの観点で評価される「普通ポイント」の高さを競います。

作戦

これは挑戦する直前に僕自身が立てた作戦です。

言語の選択

僕が資料を何も見ずに(簡単なプログラムを)書ける言語と言えば、Java, C, Objective-C, PHP, JavaScript, Excel VBA, 各種SQL くらいでしょうか。資料などを見ながらであれば、 C++, Perl, bashシェルスクリプト あたりも視野に入ってきます。世の中の名立たるプログラマの皆様からすれば「たったそれだけかよ」という感じかもしれませんが。
これらの手持ちの言語の中でどれが一番「普通」かを推測した訳ですが、こういう競技に参加する人はプログラミング歴の長い人が多いはずだと考えました(もちろん中には天才中高生のような人も居るんでしょうけど)。昔から多くの人に親しまれている言語と言えばC言語系に他ならないと言うことで、C言語を選択しました。

アルゴリズムとコードサイズ

これらの観点では、何も考えずに無意識に書いたコードこそが「普通」である、と考えました。何故なら、僕自身が普通のプログラマであるという自信があったから…(笑)
では、「何も考えずに無意識に」コードを書くにはどうしたら良いのでしょうか?
それを考えた結果は「急いで」コードを書く、というのが最も優れた方法であると判断しました。そう、何も工夫しないのです(無意識に実施可能な工夫はします)。
では、「急いで」コードを書くにはどうしたら良いのでしょうか?
ただ単に頭の中で「急いで書くんだ」と考えても、そうそう変化はありません。そこで僕は朝の出勤前の時間を利用しました。ゆっくりコードを書いてしまうと会社に遅刻するという焦りを利用した訳です。まあ、この日は5分ほど遅刻した訳ですが(泣)

結果的には2から順番に素数判定をして100個表示させる、素数判定は2から(その数-1)まで全ての整数で「試し割り」をするプログラムが出来上がりました。デバッグ用の printf をコメントアウトしたものを含めて 420bytes のコードです。

獲得した「普通ポイント」

  • 言語:29.4
  • アルゴリズム:40.0(満点)
  • コードサイズ:35.6
  • 合計:105.0

統計を拝見しての自己評価

言語の選択は大筋では誤りではなかったのですが、 C++コンパイラでコンパイルできるかどうか、というのは盲点でした。まさか「C/C++」というグループが出来上がるとは…(笑)
確かに、CodeIQの回答で提出するファイルは基本的に .txt ファイルですもんね。出題者はそのファイルの元の拡張子を知り得ない訳ですから、こういうグループができていても仕方が無いです。この点は読みが浅かったことを反省しなければなりません。

アルゴリズムとコードサイズではかなりの点数を頂くことができました。コードサイズに関しては、デバッグ用の printf をコメントアウトした部分を削除していれば 390bytes となり、もう少し高得点を頂くことができていました。処理内容に対するコメントも削除していると 340bytes となり、中央値の 373bytes からは離れてしまいます。

最後に

最後になりましたが、CodeIQさん及び出題者の Ozy さん、面白い企画をどうもありがとうございました。今後も楽しみにしております。