Code Golf イントロダクション
僕が趣味(?)としているコードゴルフについて
お書きしたいと思います。
コードゴルフとは
より少ないバイト数で所与の課題をプログラミングする遊び。
より少ない打(鍵)数を競うところがゴルフに似ているところからの命名。
とりあえず、プログラムのコードを短く書けば良いそれだけのこと。
見づらいとか、非生産的であるとか、役に立たないだとかと言われるけど、
僕はコードゴルフを通して得るものもあると思います。
何より"楽しい"。それで僕はいいと思っています。
とりあえずプログラムのコードを短く書いてみましょう。(唐突
例えば1〜Nまでの合計を出すプログラムを書くとしましょう。
#include <stdio.h>
int main(void)
{
int n;
int i;
int sum;
scanf("%d", &n);
sum = 0;
for (i = 1; i <= n; i++){
sum += i;
}
printf("%d\n", sum);
return (0);
}
これが一般的なソースだと思います。
これをどんどん短くしていこうと思います。
// #include <stdio.h> は省略可
main(){
// 型を指定しないと自動でintになるので省略可
int n, sum;
// まとめて宣言
scanf("%d", &n);
for (sum = 0; n; sum += n--);
// nの値が0になると終了
printf("%d\n", n);
return 0;
// 0を返さなければいけない
}
これで結構短くなりました(やったね!
しかし、まだまだ短く出来ます、この状態ではニワカです。
main(s,n){
// main関数の第1引数に渡すと1で初期化される。argcとして扱われる。
for(scanf("%d",&n);n-1;s+=n--);
// 1式にscanf渡して悪いと誰が言った。
printf("%d\n",s);
return 0;
// 0を返さなければいけない。
}
もうちょっと短くできる。
main(s,n){
for(scanf("%d",&n);n-1;s+=n--);
return !printf("%d\n",s);
// printfの戻り値は表示した文字数。否定して0を返すようにする。
}
とここまで短くすればよいでしょう。(なにが良いのかわからない
main(n){n=scanf("%d",&n)/printf("%d\n",n*-~n/2);}
これが僕が短くできる限界です。
このように最初のコードと比べると、見づらい、意味がわからない、短い。
こういうソースを見て「美しい!!」となる方はぜひCodeGolfをやってみてください。
そして、互いに競いあいましょう。
まだまだ僕もニワカなので努力しなければいけないです。