nekoTheShadow’s diary

技術ブログとして始めたはずが、読書&愚痴ブログになりました(´・ω・`)

CodeIQ「『セカンド・イクエイション』問題」に参加しました。

 タイトルのとおり、CodeIQの「『セカンド・イクエイション』問題」の掲載期間が終了したということで、わたしの提出コードをさらしておきたいと思います。使用言語はRuby。1回の提出で通った記憶があります(自動採点なので忘れがち)。

 アルゴリズムについてはコードの下側に書いたとおり。もっとスマートなやりかたがあるようにも思いますが、わたしにはわかりませんでした。きっとすごくすごくできる人が解説してくれるに違いない!

 ところでRubyで回答したのち、最近取り組んでいるSchemeでもやっておきたいと思い立ったのですが……だめでした。理由は単純。タイムアウトしてしまうから。なお実物は以下にはりつけておきます。

 順を追って書いていくと、まずRubyで書くところからはじまります。そのコードを手元のRuby2.2.1で実行してみるとn=3000のとき、およそ0.3秒で実行結果が帰ってきました。次にCodeIQの自動採点環境を試すことができる「実行くん」で同じRubyコードを実行してみると、実行時間はやはりおよそ0.3秒。この結果をみて「自分の開発環境とCodeIQのそれはほぼ同じ」という感想をわたしは抱き、そして上述のSchemeコードを書き始めます。そして実行すると――およそ0.3秒で結果が返ってきました。当然Rubyで0.3秒→0.3秒なら、Schemeも0.3秒→0.3秒になるはず」と思いますよね? しかしだめ。n=3000では1.0秒の時間制限を超えてしまい、なくなく「ぼつ」にせざるを得ませんでした。

 はたして何がわるかったのでしょう……? 理由はさっぱりわかりません――というか時間制限に引っかかった瞬間、あらゆる考える気力をなくしてしまい、いまのいままで放りっぱなしになっています(´・ω・`)。処理系の違いが悪かったのかしら? わたしの手元にある処理系はGauche0.9.4ですが、CodeIQのそれはGuile1.8.5です。つまりGaucheが優秀すぎる、ないしGuileがふがいなさすぎる仮説。しかし「前者では0.3秒で終わるものが後者では1.0秒以上かかる」のはさすがに極端すぎる。処理系が違うだけでこれほどの差がでるとは考えづらい。もしかしたら処理系を動かすマシンの違いが処理系自体の違いと絡んで、これだけの差を生み出しているのかも。ただそうだとすると、わたしが調査できる範囲を飛び越してしまう……。

 まあもっともありうるのが単純に「わたしが書いたソースコード自体がまずい」というやつですね。これについては――ごめんなさい(´・ω・`)