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

| コメントをどうぞ

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

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

その5.配列を見直す

2次元配列を使っていますが、内側のループを工夫すると1次元配列に書き直すことができます。for(j=i;j>=0;j–)のように反対にループすると、v[i-1]を参照しなくてもよくなります。

v[20],i;
main(j){
    for(;i<20;i++){
        for(j=i;j>=0;j--){
            if(j==0)
                v[j]=1;
            else
                v[j]+=v[j-1];
            printf("%d ",v[j]);
        }
        printf("\n");
    }
}

不要なブランクと改行を取り除くと117B(前回144B)となる。正しい結果となることを確認しておく。

v[20],i;main(j){for(;i<20;i++){for(j=i;j>=0;j--){if(j==0)v[j]=1;else v[j]+=v[j-1];printf("%d ",v[j]);}printf("\n");}}

その6.if-elseは3項演算子に置き換え、1つの変数を代入と参照する。

その2~その4と同じ修正を行う。

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

不要なブランクと改行を取り除くと93B(前回117B)となる。正しい結果となることを確認しておく。

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

その7.改行コードに書き換え

試しに改行コードで表現する方法も考えたが、残念ながらバイト数は変わらず。

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

不要なブランクと改行を取り除くと93B(前回93B)となる。正しい結果となることを確認しておく。

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

100バイトを切りたいと思っていましたが、配列を見直すことで実現できました。その6とその7にサイズの違いはありませんが、どちらもまだまともなソースです。これ以上縮めることは可能なのでしょうか。
つづく

コメントを残す

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

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