ド素人が競技プログラミングを始めてみた

タイトルの通り競技プログラミングを始めてみたという話。今後も途中経過をメモ代わりにブログにしていこうと思う。

Contents

はじめに

ド素人がプログラミング学習を継続していくためには何か目的がないとなかなか難しい。現在「ド素人が始めるCommon Lisp」としてブログを書きつつCommon Lispを学んでいるが、やはり書籍を読んで写経しているだけではモチベーションが続かない。ということで無謀にもCommon Lispを使って競技プログラミングに参加してみようと思い立った。
もちろんCommon Lispを始めたばかりのド素人なので結果はあまり期待できないが、その場で与えられた課題を解くという経験を積んでいくのもいいのではないかと思う。
Common Lispを使用できる競技プログラミングとしてAtCoderがあるのでAtCoderで始めてみようと思う。

とりあえず練習問題

初心者がまずはやるべきというものがまとめられているのでそれをやってみました。

コードのできはともかくとして無理やりにでも解くことはできた。
個々の問題の詳細はおいておいて学習を始めたばかりの自分にとって、「あれ?これはCommon Lispでどうやってやるんだ?」と思うものがいくつかあったのでまとめておく。

標準入力からデータを受け取る

この機会に覚えたread
例えば標準入力からA B C Dと与えられる場合

(defun foo (a b c d)
  (something))
(foo (read) (read) (read) (read))

のようにすればfooの引数としてA,B,C,Dを渡すことができる。
また下のような与えられ方をするときは(A1 A2 A3 ... An)というリストを返すようなデータの読み方をしています。

n
A1 A2 A3 ... An
(defun get-input-data ()
  (loop repeat (read)
        collect (read)))

余談だがこのとき初めてloopを使った。調べてみるととてもたくさん使い方があるようで、まだまだ使いこなすにはいたらない。

文字列操作

何が正しいやり方かわかってない。今のところ文字列の一部を取り出したいとき等はいつもsubseqを使っている。
大文字、小文字の変換方法が当初わからなかった。
名前から文字列比較にstring-equalを使ってみたら、大文字小文字を区別してくれなかった。区別したい場合はstring=とかequalを使えばいいようだ。equalはいろいろなことを考慮したうえで判定してくれるらしい。その分遅いのかもしれないが私のような初心者にはありがたい。

標準で組み込まれていないライブラリ

標準で組み込まれていないライブラリの機能を使うにはどうしたらいいのだろうか。今もわかってない。言語標準のもの以外は自分で書くしかないのかな。今のところそれで困るようなレベルに達していない。
正規表現は使いたいなと思ったことがある。

とりあえずコンテスト参加してみた

過去問もすべて見られるし、いきなり参加しても結果はさんざんなものだろうという予想はしていた。ただ独学している身としては決まった時間に課題を与えられ評価されること、競争的要素があることは継続するうえで重要なので参加してみました。
当たって砕けろと言いますが、はい、当たって砕けましたね。

まずは環境。
普通にリビングでやっていたのですが、子供たちがちょっかい出してくるのでなかなか集中できない。この点は初心者とか独学とかCommon Lispだとか何も関係ないですが。

上記のように途中に中断が入ったりでまるまる時間は使えなかったという言い訳はあるものの、ABCのA、B問題しか時間内には正解できなかった。終了後も続けてC,Dを何とか正解できた。

ついでにARCもやってみたが、A問題しか正解できなかった。

感想

  1. 与えられた問題に対して効率的に解けるアルゴリズムの引き出しが必要だと痛感した。
  2. 全然解けなかったけど、コンテストに参加している間はただの独学より楽しい。
  3. 今後の方針、目標
    1. 継続してコンテストに参加する。
    2. ABCはA,B,C問題を継続的に正解できるようにする。
    3. ARCはA,B問題を継続的に正解できるようにする。
    4. 灰色脱出
    5. 過去問も解き続ける。

コメント

タイトルとURLをコピーしました