読者です 読者をやめる 読者になる 読者になる

CodeIQ Blog

自分の実力を知りたいITエンジニア向けの、実務スキル評価サービス「CodeIQ(コードアイキュー)」の公式ブログです。

チョードコーディング集計結果発表!~Top Of チョードコーダーはC/C++で工夫のない素因数分解を使い373バイトで書いた人

CodeIQ中の人、millionsmileです。

ショートコーディングならぬ、チョードコーディングの集計結果発表です。
チョードコーディングとは、解答で最も使われるであろう「言語」、「アルゴリズム」、「コードサイズ」を予測し、その予測が的中しているほど高い"普通ポイント"がもらえる問題です。
139人が挑戦したチョードコードとはどんなものだったのでしょうか?

結果は出題者のOzyさんからの寄稿にてお楽しみください。

===============================
チョードコーディング出題者のOzyです。
この度はたくさんのご参加ありがとうございました。
参加者のみなさまにはフィードバックを送信しましたが、もう少し全体的な情報をまとめておきます。

Topはとってもチョード

まず、最も「チョード良い」コードを書いた方の得点を発表しますと、
合計(言語/アルゴリズム/コードサイズ)
119.4 ( 40.0 / 40.0 / 39.4 )
でした。ちょうど過ぎですね!

一番普通の言語

最も使用された言語は「C/C++」でした。
C/C++というのは、CコンパイラでもC++コンパイラでも通るコードということで、CコンパイラのみやC++コンパイラのみの場合とは区別しています。

f:id:codeiq:20130423150534j:plain

下の方にはよくわからない言語がありますので、少し解説しておきます。
「wake」というのは、shinhさんが作ったマニアックな言語です。
http://d.hatena.ne.jp/shinichiro_h/20100709#1278603483
SAS」とあるのは、クッソ高価な統計ソフトで動くスクリプトです。
Mathematica」はご存知の方も多いかもしれませんが、こちらもクッソ高価な数式処理ソフトで動くスクリプトです。
「Ozy」というのは、私Ozy自身に向けて「素数を100個表示してチョ」のように、単にテキストファイルに書かれたものです。かなり高度なスクリプト言語ですね。


というか、みなさんよくこんなの思いつきますね…。

一番普通のアルゴリズム

今回は、アルゴリズムの評価を、
(1)素因数分解によるもの
(2)エラトステネスの篩
(3)ライブラリのメソッド
(4)生データ
(5)正規表現
の5種類に分類しました。


また(1)の方法について、素因数かどうかを調べるのに、それまでに見つけた素数列を利用する場合とそうでない場合を区別しています。さらに、整数nが素因数分解できるかを調べるのに、sqrt(n)までの値だけを調べるのも、計算量に大きな差がでますので、これも区別しています。つまり、(1)の方法を使った場合でも、微妙にポイントに差がでるようにしています。


もっとも多かったのは、素数列を使わず、試し割もsqrtで止めずに最後まで調べているものでした。ある程度計算量を減らす工夫はすべきだと思いますが、結果としては『何の工夫もしない試し割』というのが一番「普通」だったようです。


f:id:codeiq:20130423150618j:plain
(素因数Dは工夫なし、Cは素数列利用、Bはsqrtまでの試し割、AはB・C併用)


ちなみに、(2回目以降の提出ということで)無効となってしまったもの中に、Fractran(http://en.wikipedia.org/wiki/FRACTRAN)で書かれたものもありました。色々なやり方があって面白いですね。

一番普通のサイズ

提出されたソースファイルをサイズ順に並べたとき、ちょうど真ん中になったもののサイズは、373バイトでした。

ちなみにMathematicaのスクリプトだと、Prime[1..100]と書くだけで良いみたいです。短すぎですねぇ。

言語別の得点

「言語ポイントが低かったから負けたんじゃ!!」と思う方もいるかもしれないので、各言語について言語ポイント以外、つまりアルゴリズムとコードサイズポイントの合計(言語ごとでの最高点)を出してみました。

言語 得点
C/C++ 79.4
Java 77.5
Ruby 76.8
C 75.6
C++ 74.9
PHP 73.0
Python 72.4
JavaScript 69.2
VBA 66.0
Scala 54.0
C# 47.6
SAS 40.6
wake 38.9
Haskell 36.8
Ozy 15.7
Mathematica 14.5
HTML 13.8
awk 9.4
Perl 3.3


使用言語の割合はコードサイズに影響するでしょうから、これでも偏りはあると思いますが、JavaRubyがなかなか高得点になりました。PHPPythonもなかなかですね。

オマケ

最後に、一番普通じゃなかった人の得点を書いておきます。
合計(言語/アルゴリズム/コードサイズ)
4.5 ( 1.2 / 2.7 / 0.6 )


これはひどい(´Д`;)

===============================
いかがでしたか?お楽しみいただけましたか?

チョードコーディングの上位10名の方には、
のちほど名誉ある「チョードコーディングバッジ」を付与します!!!

また上位3名の方には、出題者のOzyさんのサイン付きで、
『世界で闘うプログラミング力を鍛える150問』をプレゼントいたします!!!
該当者にはCodeIQ運営事務局より別途ご連絡いたします。

問題文はこんなでした↓

チョードコーディングとは、ちょうどイイ感じにコードを書く遊びです。「あなたの考える“普通”のコード」を書いてみてください。
使用する言語は自由です。

今回は、『素数を小さいものから順に100個表示するプログラム』を書いてください。
出力は、1つの素数ごとに改行してください。

2
3
5
7
.
.

のような感じで。簡単ですね。しかも“普通”に書くだけ!
あなたの書くコードは本当に普通なのか、確かめてみましょう!!

評価の方法は、ご提出いただいたソースコードの統計をもとに“普通ポイント”を算出します。算出方法は次の通りです。

評価ポイントは次の3点です。この3点をそれぞれ40点満点に換算し、合計120点満点で得点を出します。

(1)使用言語
参加者の使用した言語統計をとって、使用者が多い言語ほどポイントが高くなります。

(2)アルゴリズム
参加者の使用したアルゴリズム統計をとって、使用者が多いアルゴリズムほどポイントが高くなります。アルゴリズムの分類は計算量と消費メモリから大まかにやります。

(3)コードサイズ
コードサイズの中央値を基準に評価します。中央値が基準というのは、参加者のデータサイズ順に並べ替えた場合に順位がちょうど真ん中になる人が最も高得点になるということです。

尚、実行結果が正しい場合は、以降ご提出いただいたソースコードの評価はいたしません。
つまり、正しく実行される最初に提出されたコードのみが評価対象ということです。

今後もいろんな問題を出していくのでお楽しみに☆彡

https://codeiq.jp/ace/ozy4dm/q292
f:id:codeiq:20130423150426j:plain

CodeIQ中の人の一言:最近、突然、冷奴がこの世で一番美味しく感じて毎日食べています。