薄いブログ

技術の雑多なことを書く場所

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をやってみてください。
そして、互いに競いあいましょう。

まだまだ僕もニワカなので努力しなければいけないです。