血ヘドが出るほど面白い!競技プログラミングとは!!
みなさんこんにちは。
haruki_ueharaです。
私最近プレステ3を購入しました。
※4ではありません。
友達とオンラインゲームを満喫しているわけですが、
そんな中、ゲームよりも面白いものにどっぷり浸かっております。
それは
略して競プロと呼ばれるものです。
エンジニアの方やプログラマーの方ならお耳にしたことが
あるのではないでしょうか。
実際にどんなものなのか、
Wikiさんの解説によると・・・
概要[編集]
競技プログラミングでは、参加者全員に同一の課題が出題され、より早く、与えられた要求を満足するプログラムを正確に記述することを競う。コンピュータサイエンスや数学の知識を必要とする問題が多い。新卒学生の採用活動などに使われることもある[7][8]。多くのコンテストでオンラインジャッジが採用されている。
また、競技プログラミングに参加する人を「競技プログラマ」または「競プロer」と呼ぶことがある。
だそうです。
実際には定番の
・100以下の素数を全て表示するプログラムをつくってください。
の素数を求める問題や
・1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
などのネット上で度々議論されている(この問題が解けないプロのプラグラマーがいると話題の)FizzBuzz問題。
のようなアルゴリズム系統の問題が標準入力有りで渡されるのです。
例えば下記の
問題文
整数が与えられます。整数を出力してください。 ただし、入力は進数表記で与えられますが、出力は進数表記としてください。
入力
N
入力はを満たす。
出力
N
最後に改行してください。
問題文
5 000 000 005は、の倍数かつ回文である。
整数Nが与えられる。1以上N以下の整数で、の倍数かつ回文の数の個数を求めなさい。
ただし、回文数とは、"969"、"3223"、"1"のように右から読んでも左から読んでも同じになる数である。
入力
N
1行目に整数が与えられる。
出力
1以上N以下の整数の中で、の倍数かつ回文の数の個数を1行に出力してください。 最後に改行してください。
のような問題です。
プログラミングコンテストでは主に解答までのスピード、
メモリ使用量、バグの無い正確なコーディング力で点数が決まります。
私は
解くのが面白すぎてご飯を食べるのも寝るのも忘れてしまっているのです!!
昔レイトン教授という謎解きゲームが流行りましたが、
そんな感じなのでしょうか。
同じ問題、同じ答えでも人によりコードは全く違いますので、
自分の考えたロジックで思い通りの出力結果が得られたときの快感がものすごく中毒になります。
私は競技プログラミングではライブラリの豊富さと情報量の多さからJava言語を扱っているのですが、
メモリの使用量を極力抑えるためにコレクションではなく配列をつかったり、
出来るだけ処理を簡素化したりなどの工夫も考慮しながら実践しています。
しかし実際の業務では、アルゴリズムの理解がなくとも
コードが組めることがほとんどなので、
競技プログラミングの存在も賛否両論あります。
しかし私の思う競技プログラミングのメリットは
・正確なアルゴリズム、データ構造を理解できるため地力がつく。
・仕様を読み解きコーディングするまでのスピードが向上する。
・問題に対してどのように実現するか。考える力が身につく。
・バグの少ないメモリにも優しいプログラムが組める。
・プログラムとアルゴリズムは切っても切れない関係。そもそも基本。
など、数え切れないほどのメリットを感じています。
無駄の無い美しいコードが完成したときの酔いしれ感。
みなさんも是非ご一緒にいかがでしょうか。