カメヲラボ

主にプログラミングとお勉強全般について書いてます

ショートコーディング問題の微妙なルールについて

CodeIQで現在出題中の、ショートコーディング:きのこ危機一髪について、毎度あいまいなルールになってしまって申し訳ないのですが、基本的にシステムテストが通ればOKです。
ただし、これまで(ideone.comを利用した場合)の経験上「さすがにこれをOKにすると良くないかなー」という、以下の場合を禁止としています。

シェルコマンドを使う系

Ideone.comのCではsystem関数が使えてしまうことと、実行マシンにperlが入っていることから、問題によっては

main(){system("perl -e 'Perlのコード'");}

と書いた方が短くなるようなケースが考えられます。これだと完全にPerlゴルフじゃん!ってなってしまうので、さすがにこれはNGでしょう。

通信しちゃう系

今でも可能かはわかりませんが、外部サーバに解答・あるいは解答プログラムを設置し、そこからインターネットを経由して解を得るというコードを書くことができました。これも問題の趣旨とは違いますので、NGとしました。

サーバ乗っ取り系

これについてはいろいろなケースがあると思いますが、要はジャッジシステム自体に何らかの方法で手を加えて、本来とは異なる実行結果を得るような行為全般です。できるだけ短いコードを目指すという趣旨からは外れてしまいますから、これもNGです。

それ以外

こんなご質問をいただきました。

内容というかルールについてなんですが、機械語アセンブリ言語というのは「ほかの言語」には含まれないんですか?

https://twitter.com/akouryy1/status/575221165838356481

先に説明した「シェルコマンドを使う系」の例のように、実質他の言語になっちゃうんじゃないの?ということになりそうですから、かなり微妙な問題になります。たしかにCの場合はインラインアセンブリが書けますし、関数の呼び出し先のアドレスに機械語コードを書きこんでおくことでそのコードを実行できる場合もあります。ただ、コードを丸々機械語で書くなんてことは大変なことで、ましてや短く書くなんて、よほど単純な問題でないと無理なんじゃないかと思います。普通にCで書いたコードよりも機械語埋め込みで短くなるんなら、是非観てみたいですね。というわけで、あえて禁止とはしませんので、チャレンジしたいと思う方はどうぞどうぞという感じです。

バイナリ埋め込み?

もし『バイナリ埋め込み』という技法が魔法のような技術だと思っている方がいれば、おそらく間違いです。実際にやろうとするともんのすごく冗長になりますし、そこそこのサイズでちゃんと動くものというのは本当に難しいので、そういう意味ではshinhさんのqsort hack(http://shinh.hatenablog.com/entry/20070124/1169569752)なんかはホント素晴らしいテクニックですよね。これはバイナリ埋め込みがすごいんじゃなくて、それを見つけて・実際にやった人がスゴイだけです。バイナリにしたからって無敵になるわけではありません。…と、この文章を書きながら、31バイトでつくるアセンブラプログラミング ?アセンブラ短歌の世界?という書籍のことを思い出しました。それなりに意味のある短いバイナリコードを作るのは大変ですが、やっぱり面白いですね。

今回出題の問題について

基本的にヒントになるようなことは書きたくない(挑戦者の思考に影響を与えてしまう)のですが、今回のテスト環境を作成したのは出題者である私自身で、「ちょっと不味かったかなー」と思う部分が無きにしも非ずということで、少しだけ書いておきます。挑戦してくださっている方でフィードバックを受け取っている方にフィードバックメッセージとして書いてありますが、コードサイズのチェックにはご提出いただいたコードに対して

wc -c 提出されたファイル

としているだけで、あとはローカルのサーバやIdeone.com上で実行しています。この辺りの過程でちょっと抜け道がありまして、…と、これ以上は書けませんね。とにかく、コンパイルや実行テストは自動化されますので、コードを提出してシステムが正解と判定すればそのとき提出したソースコードのサイズが記録になる、ということだけです。「こんなんどうかな?」と思ったら、ご遠慮なくコードを送りつけてください。

のんびりいきましょう

まだ出題期間中ですのであれこれと書くことはできませんが、技術的には「おそらく世界で数人しかわからないんではないか」みたいなものはないでしょうし、要は知識・技術・観察力・根性みたいな要素の集まりでしかないんですよね。あまり深刻に考えすぎてもダメなときはダメですし、何かのきっかけで簡単にできてしまったりすることもあります。仕事や勉強の合間にちょっと考えてみて、試してみて、を繰り返し、締め切り後には上位のコードや解説を見て楽しんでいただけたらと思います。

締め切り後にまたきちんとした記事を書きますので、問題に挑戦した方もそうでない方も、ご意見等ご遠慮なくおっしゃってください。

問題になりそうなこと(メモ)

今回はプレゼント付問題ということで、少なからず金品が絡んでいます。ということで、問題になりそうなことをメモしておきます。
書籍の抽選対象に関してはコードサイズが関係ありませんので、特に問題が生じることはなさそうです。バッジ付与については多少の問題が起こる可能性がありますね。その辺は挑戦期間終了後に検討することになると思います。よくよく考えると、出題してまだ5日くらいしか経っておらず、さらに予想もつかないテクニックで記録が更新される可能性があります。それが看過できないような問題であれば何らかの対策が必要でしょう。しかし予測できない以上、現時点ではどうしようもないですね。なんにせよ、最終的には出題者個人の責任で、できるだけ皆が納得できる対処をしたいと思います。