プログラミングカテゴリの新設について

Share

僕のtwitterをご覧になっている人はご存知かもしれないが、最近ときどき、いわゆる競技プログラミング方面で遊んでいる。

そこで、これを読んでいるみなさんにも、競技プログラミングで遊んでもらおう(=仲間を増やそう)というわけで、この記事を書きつつ、プログラミングのカテゴリを新設することにした。

この記事では、具体的なことには触れず、現在の環境だとか、どうしてこうなった、みたいなところを語ろうかと思う。

使用言語は、メインがPython3、ときどきC++。
エディタはVSCodeにほぼ必要最低限の拡張機能(c/c++, Python, Code Runner)を入れただけのものを使っている(ちなみに、普段の文章も大体VSCodeで書いている)。

まずPython3を使いだしたのが2019年の9月。Humble Bundleで販売されていたPythonプログラミング教材集が安かったのがきっかけで、その時は競技プログラミングとかは全く考えていなかった。巷で流行っているらしい言語を、仕事や遊びでちらほら使えるようになれればいいな、という感じであった。

そして、流行っているだけのことはあり、確かにPythonは使いやすい言語だった。とにかく思いついたことが簡単に書けるだけの仕組みが揃っている。もちろん、実行速度が犠牲になってはいるのだが、簡単なはずのことを書けないよりは余程いい。

その後、ちょこちょこと遊んではいたものの、転機が訪れたのは2020年6月。ここで、paizaスキルチェックと、AtCoderなどの競技プログラミングサイトの存在を初めて知ったのだ。

つまり、プログラミング歴はほぼ1年、競技プログラミング歴は半年にも満たない、ヒヨッコもヒヨッコである。

以下、僕が利用しているサイトへのリンクをいくつか。TopCoderとか入ってないじゃん、と思われるかもしれないが、さすがにそこまでは時間が……。

AtCoder
競技プログラミングのコンテストを定期的に行っている。難易度別に、主にABC, ARC, AGCの3つのコンテストがある。特に一番易しいABCでは、プログラミングを始めたばかりの初心者でも解ける問題も出るのでオススメ。
AtCoder上での僕のプロフィールはこちら。よわよわ。

paiza
エンジニア向けの学習・就職支援サイト。ここのプログラミング学習にある問題集・スキルチェックが使いやすく、面白い。AtCoderは数学パズル的な問題が多めだが、paizaは実践的な問題が多い印象。

Aizu Online Judge
通称AOJ。プログラミングを学んでいる学生向けのオンライン問題&回答判定システム。典型的な問題を多く用意してくれているので、書いたコードの動作確認などにも使いやすい。

CodinGame
英語。プログラミングで遊ぼう、といった感じのサイト。投稿した回答が、ゲーム画面のように視覚的に表現されるのが特徴的。ただし、回答の書き方についてはちょっとクセがある。実はミニコンテスト(マッチング~決着まで大体10分くらい)のCode Clashが結構楽しい。

もっとも、全くプログラミングの初心者というわけでもなかった。一応ベーマガ世代でもあるし、大学の頃はなんやかんやでCとLISP、Perlを少しかじってもいた。
ただし、その時分に書いたコードよりも、ここ半年ほどで書いたコードの量のほうが、圧倒的に多いと思う。

で、なんで競技プログラミング?という話だが、実に単純で、「面白い」からである。実用性とか、そういうことはあまり眼中に無い。

どう面白いのか?

少し遠回りをしよう。
僕の一番の趣味はゲームであるが、他の趣味の一つが、パズルを解くことだったりする。
……あるいは、もっと簡単に言うと、僕はニコリストでもある。いや、これじゃ知らない人には全く通じないな。解説しよう。日本で最古のパズル雑誌「パズル通信ニコリ」を買っている人をニコリストと呼ぶのだ。
なにそれ、聞いたことない……という人も多いかもしれないが、新聞や雑誌のパズルを提供していたりもするので、見かけた時はどこかに「提供:ニコリ」と書いてないかどうか確かめてみてもらいたい。慣れてくると、「おっ、このパズルはニコリ提供っぽいな」と気付けるようになる。うちのカミさんにこの特技を披露した時は、気味悪がっていたが……。

閑話休題。

つまり、なにが言いたいのかというと、競技プログラミングと、パズルを解く楽しさは通じるところがあるということだ。

でも、プログラミングって難しいんでしょ?と思う人も多いだろう。

ところが。実は、基本はそんなに難しくはない。
具体的には、

1.ごく基礎的な入出力
2.データ保持・構造(変数、配列など)
3.演算(四則演算、論理演算など)
4.条件分岐(if)、繰り返し(for/while)
5.簡単な文字列の操作
(+α.ごく簡単な関数・オブジェクトの作成(できると便利))

これだけ覚えれば、とりあえずスタートラインに立てる。
そして、このひとつひとつは、大して難しくはない……難しくはないどころか、やってみれば実に簡単だ。

難しいのは、というか面白いのは、その一つ一つは単純なものを、どのように組み合わせれば、複雑なことを、しかも効率よく処理できるのかという点にある。

それは数独やカックロ、スリザーリンクといったニコリのパズルで、極めて単純なルールから、実に多彩な定石・盤面が構築されていくのに近い感覚だと思う。

今後のプログラミングカテゴリについては、できるだけ超初心者~中級者のギャップを埋めていけるような記事を書ければいいな、などと考えているけど、その時々やっていることを書いたりもするので、しばらくは順不同な感じで進行していく予定。

軽い入門編の記事なども作成中なので、そのうち投稿されるかもしれない。その前に、ちゃんと更新しろって?ごもっとも。

……まあ、そんなこんなで少し興味が湧いてきた人は、是非遊んでみて欲しい。
また、そうでない人は、いきなりソースコードとか貼りだしたりしても、生暖かい目で見守っていただければ幸いだ。

Share

コメントを残す

メールアドレスが公開されることはありません。