C言語によるショートコーディング(パスカルの三角形)第5回

| コメントをどうぞ

C言語によるショートコーディング(パスカルの三角形)第4回からの続きです。
前回のソース(その8修正後)は以下のとおりです。

v[20],i;
main(j){
    for(;i++<20;)
        for(j=i;j--;)
            printf(j?"%d ":"%d\n",v[j]=!j?1:v[j]+v[j-1]);
}

その11.範囲外のメモリを参照しても動くのならそれでいい

邪道編です。実際にはその9とその10の前にこちらを試した。
考えたのが!j?1:の部分。つまり最初に1を代入すれば良いのなら、for(*v=1;i++<20;)と出来るんじゃないかと。v[j]=v[j]+v[j-1]はv[j]+=v[j-1]とコンパクトになります。

v[20],i;
main(j){
    for(*v=1;i++<20;)
        for(j=i;j--;)
            printf(j?"%d ":"%d\n",v[j]+=v[j-1]);
}

気をつけないといけないのが、j=0のときにv[0]+=v[-1];となるのですが、ideoneでなくちゃんとlinux上のgccでやっていたときでも動いたんです。
不要なブランクと改行を取り除くと83B(前回88B)となる。

v[20],i;main(j){for(*v=1;i++<20;)for(j=i;j--;)printf(j?"%d ":"%d\n",v[j]+=v[j-1]);}

その12.for文一重化など

機械的にfor文一重化する。人間オプティマイザみたいな気分になってくる。

v[20],j;main(i){for(*v=1;j--?printf(j?"%d ":"%d\n",v[j]+=v[j-1]):(j=i++)-21;);}

うごいた!ついに79B(前回83B)となる。

その13.改行コードに置き換え

サイズは79Bと変わらないけど、改行コードに置き換えたバージョン。

v[20],j;main(i){for(*v=1;j--?printf("%d%c",v[j]+=v[j-1],j?32:10):(j=i++)-21;);}

おしまい

実際に提出したソースは以下の79B。

t[99],j;main(i){for(*t=1;j--?printf("%d%c",t[j]+=t[j-1],j?32:10):(j=i++)-21;);}

結果は9位でございました。
「ショートコーディング:パスカルの△」最終ランキング発表?5名の神が誕生しました。1位は70バイト #shortcoding #codegolf – CodeIQ Blog

えっ。1位は70B。でも初めてのわりには我ながら健闘しました。疲れるから2度とやらなくなったけど。

番外編

上位にはいったソースを見てちょっとしたことで、さらに詰められたこと。
gccでやっていたので、t[99],j;とj,t[99];で動作に違いがあったりとかいろいろと検討していたのだけど、ideoneだとt[],j;でも動いてしまう。つまり、簡単に79B->77Bになる。

v[],j;main(i){for(*v=1;j--?printf(j?"%d ":"%d\n",v[j]+=v[j-1]):(j=i++)-21;);}

次に自分は早いうちから改行コードに書き換えてしまったが、ブランクと改行の3項演算子を使っていたのなら、最後は必ず1となることに気がつけば、printf(“1\n”,1);となってもよい。つまり、77B->76Bになる。

v[],j;main(i){for(*v=1;j--?printf(j?"%d ":"1\n",v[j]+=v[j-1]):(j=i++)-21;);}

ということで、次はさらに優秀な他人様のコードレビューです。
つづく

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>