カメヲラボ

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

Short Coderの心得1

コードを極限まで縮めるためには知識・経験は勿論のこと強靭な精神力が必要だ。すべてのShort Coderは最短コード達成のため、何らかのポリシーを持っており、そのポリシーこそが我々をShort Coderたらしめるのだ。

Cheatコードの定義

これは結構難しい問題で悩みどころなのだが、私はこう考える。


INPUTが不定の問題で、特定のINPUTに対してのみ出力を行うコード
例えば「INPUTが1〜10000の整数値」とされた問題で、switch文を使い
switch(input){
case 1:printf("...");
case 2:printf("...");
.
.
.
case 10000:printf("...");
}
のように1から10000まですべての場合について記述されたコードであるならば、ギリギリcheatコードとは呼ばない。しかし、インプットを解析することで
switch(input){
case 1:printf("...");
case 523:printf("...");
case 9999:printf("...");
}
のように書くことで通るコードを書いてしまえば、これは立派なcheatコードだ。


「INPUTが不定」とわざわざ書いたのは、問題によってINPUTが存在しない場合やINPUTの範囲が極端に狭い場合があるからだ。例えば2196番(http://acm.pku.edu.cn/JudgeOnline/showproblem?problem_id=2196)の問題を事前に計算してコードに埋め込んだところで最短コードは達成されない。どう考えてもそれを計算したコードの方が短い。そうかと思えばRiSKさんがチャレンジした1012番の問題では事前に計算した場合としない場合でどちらの方が短くなるのか微妙な場合もある。(http://d.hatena.ne.jp/RiSK/20060218#1140241397)


この手の問題は意外にたくさんあって、事前に計算したものまでcheatとみなしてしまうのであれば、階乗の計算を扱う問題・素数の問題等でテーブルを使うのはどうか等、線引きが難しくなってしまう。少なくとも、事前に解のリストを作っておくことは自分が正しいコードを書けなければできないことなのだから、cheatとまでいかないのではないか。


1775番http://acm.pku.edu.cn/JudgeOnline/problemstatus?problem_id=1775&orderby=clen&language=-1の問題は、大きな素数を初期値として与えるかその都度計算するかというラインで色々と調べながら短縮されたものであり、数値埋め込み型のコードを基準に短縮していく手法も悪くはない。