『ワンライナーでクールに解く!』所感(ネガティブ注意)

はじめに

CodeIQ で『ワンライナーでクールに解く!』と題した2問の出題に解答してみました。どちらも、与えられた問題の答えを解くためのワンライナーを書けという問題です。「解答評価のポイント」は「冗長さをそぎ落とし、どれだけ簡潔に問題を解決できているかが評価のポイントとなります。」とのことです。(この「解答評価のポイント」は、次のリンクから読むことができます。)

挑戦者求む!【プログラミング】ワンライナーでクールに解く!その1 by 無形ソフトウェアLLC 代表社員:村山 男也│CodeIQ

挑戦者求む!【プログラミング】ワンライナーでクールに解く!その2 by 無形ソフトウェアLLC 代表社員:村山 男也│CodeIQ

その1

問題

「一番大きいマトリョーシカの中に、6つの少しずつ小さなマトリョーシカが入って10500円で売っています。(マトリョーシカは全部で7つです。) マトリョーシカはひとつ大きくなるにつれて、150円ずつ値上がりします。一番小さなマトリョーシカの値段はいくらですか?」

要するに、等差数列の総和が与えられたときの初項を求める問題です。

私の解法

真ん中の大きさ(小さいほうから4番目)のマトリョーシカが 10500 / 7 円なので、それより3つ小さい一番小さなマトリョーシカは 10500 / 7 - 150 * 3 円です。これを Perl ワンライナーで素直に書くと、

perl -e 'print 10500/7-150*3'

となります。これが私の解答です。これ以上、複雑になりようがありませんね。逆に、これ以上簡単にしようとすると単に答えを表示するだけになってしまうので、まあこんなもんでしょう。

評価結果

評価は「4」でした。

今回はプログラム言語のワンライナーというカテゴリーですので、 ループ処理や組み込みのリスト演算などをクールに使用している 回答者様に高得点を差し上げております。ご了承いただければ幸いです。

とのことで、「高評価を獲得した解答例」として示されていたのが、次のコードです。

perl -e 'for($n=10500,$i=0;$i<7;$n-=150*$i++){}print $n/7'

…へ?

まあ確かにワンライナーですが、なんというか、普通のスクリプトから改行を機械的に取り除いただけですよね。

ていうか、「冗長さをそぎ落とし、どれだけ簡潔に問題を解決できているかが評価のポイント」じゃないんですか? 上記の「高評価を獲得した解答例」は、むしろ可能な限り複雑に書いてあるようにしか見えないんですが。

まあ、どのようなコードを「クール」と感じるかは人それぞれなのでそれはいいのですが、評価基準を示した以上、それに従って評価してもらわないと困ります。これではただの価値観の押し付けです。ともあれ、この問題や評価からは、出題意図がさっぱり見えてきません。

その2

問題

「1個の値段が40円、50円、77円の品物を合わせて11個買ったところ、代金が601円になりました。それぞれ何個ずつ買いましたか?」

私の解法

これは非常に困りました。ワンライナーで書くのに適したような簡単な解法を思いつかなかったからです。

ところで、「解答評価のポイント」には、「変数名などにキラリと光るネーミングセンスを感じるものなどは、高評価につながります。」とも書いてあります。そこで、変数名(の扱い)に趣向を凝らして、こんなコードにしてみました。

perl -e '@a=(50,40,77);$n50=11;do{$total=0;$total+=$_*${n.$_}for@a;++${n.$a[$cond=$total<=>601]};--$n50}while$cond;print"$_=>${n.$_}\n"for@a'

到底ワンライナーと呼べるような代物ではありませんが(それこそ改行を機械的に取り除いただけ)、簡単な解法を思いつかないので、仕方ありません。しかも、趣向を凝らしたせいで、可読性もさっぱりです。

評価結果

Perlの特徴を思う存分に発揮されており、文句なしの「5」評価です。

なんと、気に入られてしまいました。どうも、こういうコードが「クール」なようです。どうも私とは価値観が正反対です。

まとめ

結局、この出題者は、どのような意図でこれらの問題を出し、解答者に何を求めたかったのか、さっぱりわかりません。

CodeIQ では、以前にもひどい問題が出されたことがありますが(ボゴソートの計算量のやつとか)、 CodeIQ の中の人は、もっと問題や評価の質に気を配るべきだと思います。出題の質が低下したときに、最初に離れていくのは、スキルの高いユーザです。自分よりレベルが低い(と感じる)出題者から評価を受けようなどと思う人はいませんから。つまり、 CodeIQ の存在価値を維持し高めていくためには、出題の質は非常に重要だということです。