2012年2月19日日曜日

Code Golfは役立つか


ずいぶんサボっていますが、3月になったらちゃんと復活させようと思います。
・中古PCの有効利用
・ICS導入
・新しく買った万年筆のReview
・新しく買った紅茶のReview
・中島みゆきのインストゥルメンタルCD関連
等、ネタは大いにありますが、バタバタしていて書くことができていません。

今日は、この本
を買ったので、CodeGolfが役に立つ点について、初心者にもわかる点を示したいと思います。

CodeGolfは、競技プログラミング以上に役に立つかどうかわかりにくい分野だと思います。教育的効果もどうか?となる可能性があるからです。しかし、私は、CodeGolfにも効果があると思います。書く必要があるかどうかはわかりませんが、CodeGolfの答案を読むことは学習になります。

どういうことか、一例を挙げてみます。

if(a==b) b++;
という文があったとします。これは空白を含めて13Byteです。では、CodeGolf式に考えると・・・
1. a==b?b++:;
という方法があります。これなら、10Byteです。別解として
2. b+=a==b;
もあります。これなら、8byteです。公式というか、汎用性がある方法なら
3. a==b&&b++;
もありますが、10Byteであることには変わりありません。

重要なのはここからです。元の文と、他の例示したものが、なぜ同値なのかを考えてみることが重要です。これには、文法の知識が必要です。

1.はそのままで良いでしょう。単なる三項演算子。しかし、三項演算子を知らない人もいるかも知れません。実際、入門書などには書かれていないこともまま見受けられます。

2.についてですが、これは、「代入演算子の評価は通常最後である」と「論理式は真であれば通常1を返し、偽であれば0を返す」ということがわかれば、簡単にわかります。処理系にもよりますが、GCCなら大丈夫ですね。

3.については、複号論理式の評価に関する話です。「&&演算子は、その前にとった式の値が非0である場合のみ後ろ側を評価する」という知識があれば、これも同値であることは簡単にわかります。

このような書き換えはCodeGolfではしばしばあります。
そして、ここで見たとおり、読むためには文法的な知識が必要になります。

文法を一度学んだ人が、その文法を更に強固にするため、リファレンス片手に楽しみながら読んでいく。その効果は、独りよがりのソースを書くより、余程高いものだと思います。上手な人のソースを読むのは勉強になるものですが、CodeGolfにもやはりその側面はあり、以下に短く書くか、その至芸を理解することは文法を理解することなのです。

上手のCodeGolf答案を手に入れて、「なぜこのソースが解答になるのか?」自分で説明してみると、ずいぶんと文法が身につく。そういう、文法の総合的学習に、CodeGolfは大いに活用できるのではないでしょうか。

実際のCoeGolfはhttp://golf.shinh.org/ がオススメです。この機会に是非!

2 件のコメント:

tanutarou さんのコメント...

なるほど。。そんな短縮の仕方があったとは驚きです。
信じられないようなバイト数で、問題が解かれていますが、その工夫をみるのは純粋に楽しそうですね。
文法の深い理解にも、確かにつながりそうです。

達哉ん/Tatuyan さんのコメント...

>tanutarouさん
ありがとうございます。
ここでは3例出したのですが、他にも
a-b||b++;
とか(9Byte)
a-b?b++;
なんか(GCC限定、8Byte)もあります。
コードゴルフも楽しいですよね!