プログラミング初級者から上級者まで一緒に楽しめるコードゴルフ大会開催のコツ

こんにちは。基盤戦略グループでエンジニアの育成をしている藤田です。
コードを書くのって、エンジニアにとっては最高に楽しい時間ですよね!
これからプログラミングを楽しみながら学びたい方、在宅勤務のストレスを吹き飛ばしたい方にオススメのイベント「コードゴルフ大会」について紹介します!

ビッグローブでは社内でIT技術の勉強会やLT大会などのイベントが頻繁に開催されています。そういったイベントをフォローして盛り上げるのも私の仕事です。
今日は、先日行われた社内コードゴルフ大会について紹介します。
コードゴルフ大会とはプログラミングをして、そのコードの短さを競う大会です。 大会といってもチャット上での「息抜きにコードゴルフすっぞ」という書き込みから始まったゆるい大会です。
この大会がプログラミング初級者から上級者まで参加できる楽しいイベントだったので、その内容と開催のコツを公開します。

コードゴルフとは

コードゴルフはコンピュータプログラミング・コンテストの一種。参加者は与えられたアルゴリズムを、可能な限りもっとも短いソースコードで記述することを競う。バイナリサイズではなく、ソースコードの文字数がスコアとなる。 https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B4%E3%83%AB%E3%83%95

とにかくソースコードを短くした方が勝ちです。

大会のコンセプト

とにかく誰もが「やってみよう」と思える敷居の低さにしたかったので、コンセプトは以下の2点にしました。

- 誰でも参加できること
- それぞれのレベルにあった楽しみ方ができること

このコンセプトに則して大会のルール、お題、進め方を決めました。

大会のルール

まず大会のルールを説明します。私たちはこんなルールで競いました。

- お題を2問解き、その合計スコアで競う
- 言語は自由
- 標準ライブラリ以外の利用は禁止
- スコアはソースコードに対してwcコマンドを実行して算出する

$ wc -c ./a_*
     272 ./a_1.py
     280 ./a_2.rb
     552 total


- 大会期間は1週間
- 参加者はお題を解いたらチャットにスコアを貼る
- スコアは何度貼ってもok。スコアが伸びるたびに貼ると良い

お題のコツ:とにかく簡単に

誰でも参加できるように、できるだけ簡単なお題にします。たとえば私たちが使ったお題はこんな感じです。

引数の 'A' の数と 'B' の数を比べて、'A' のほうが多ければ 'A' を、 'B' のほうが多ければ 'B' を、同じ数なら '=' を返す。
f("Aa") => "A"
f("aabbB") => "B"
f("Abbac") => "="

簡単ですね。ifやforなどの基礎を学んだ人なら解けると思います。
お題を簡単にすると初級者は良いが、上級者はつまらないのでは?と思われるかもしれませんが、そこがコードゴルフの良いところ。コードゴルフはスコア(コードの短さ)が勝負なので、簡単なお題でも楽しめるんです。上級者はお題を一瞬で解いた後、「もっと短くするにはどうするか?」という自分との戦いが始まります。そして言語仕様の細かいところまで調べて最短のコードを目指します。また使用する言語を自由にしているので、スコアを上げるために新しい言語に挑戦する人もいます。つまり、お題を簡単にすることで、上級者は最短のコードへの探究心をより刺激されるんです。これぞエンジニア魂。

進め方のコツ1:あえて作ったコードを公開せず、スコアと向き合ってもらう

競技プログラミングは参加者が多いほど、初心者はコードを公開するのが億劫になります。ただコードゴルフはスコアさえ分かれば成立するので、無理にコードを公開する必要はありません。コーディングをみんなで楽しみたいなら、むしろコードを公開して他人と比べるよりも自身のコードと向き合ってもらった方がいい。なので公開するのはスコアのみにします。

進め方のコツ2:途中経過のスコアを公開して盛り上げる

大会の目的が優勝者を決めることなら、大会の最後にみんなのスコアを公開して優勝者を決めれば良いですが、我々の目的はみんなで楽しむことなので、大会途中でもスコアを公開します。 途中のスコアを知ることでお互いに探究心を刺激しあい、盛り上がっていきます。実際やってみると「え?このお題、スコアを100以下にできるの?もう少し考えてみよう」とか思います。

f:id:biglobe-editor1:20200817115410p:plain
朝からゴルフを始める人々

進め方のコツ3:初心者フォローチャットを作る

上級者のスコアがチャットに投稿され始めると初心者のモチベーションが低下してきます。 「上級者はスコアが100切ってるのに私は500か。。やる意味ないなぁ。。」 大会の目的はみんなで楽しむことなので、そうなったらマズいですね。そのためにチャット上で初心者用の部屋を作ってフォローします。この部屋にスコアの経過を投稿してもらい、スコアが上がるごとにみんなで"いいねボタン"を押して喜びます。ある程度できるようになったら、「次は3項演算子を使ってみよう!」とか普段苦手意識のある書き方に挑戦してもらうのも良いと思います。

最後は、優勝者と笑う

上記のコツをふまえた結果、大会には多くの方がいろんな言語で参加してもらえました。 ちなみに今回優勝した方のコードはこちらです。

sub f{$_=@_[0];qw(= A B)[y/aA//<=>y/bB//]}

何これ。。プログラムというか...呪文ですねw
作者曰く「読みにくいのはオレのせいじゃない。Perlのせい」だそうですw

大会の最後が「勝って嬉しい、負けて悔しい」ではなく、みんなそれぞれに工夫して、その過程を楽しみ、共感して終われるのがコードゴルフの最大の魅力です。
みなさんもぜひ、周りのメンバーを巻き込んで開催してみてください。