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

| コメントをどうぞ

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

さらに上を行く人たちのコードはこちら↓
「ショートコーディング:パスカルの△」最終ランキング?上位5位のコード公開+Ozyさんの解説付き #shortcoding #codegolf – CodeIQ Blog

リンク先の解説を読んで頂ければよいのですが、ここでは配列を使った場合にさらに短くなっているものを検証します。

ushshさんのコード(72バイト)
j;a[];main(i){while(*a=j<20)printf(j<0?j=i++,"1\n":"%d ",a[j]+=a[--j]);}

残念ながらideoneでは正しい結果となりませんでした。どうやらa[j]+=a[–j]部分が意図した順に評価されていないようです。

UTOさんのコード(73バイト)
j,p[];main(i){for(;*p=i<21;)printf(!j--?j=i++,"1\n":"%d ",p[j]+=p[j-1]);}

正しい結果となりました。今、確認できる環境では73バイトが最少でした。

自分の導き出したものから多少手直ししたものが以下の76バイトです。

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

この3バイトを詰めるのはキビシイ。

比較と代入

p=i<21に気が付きました。自分ではfor(v=1;i<21;のように書いていますね。細かいですが、これで1バイト違います。

for(;*p=i<21;
for(*p=1;i<21;

for文を1重

自分のコードのfor文を2重に戻してみる。

for(a;e?g,f:(c,d,b););
for(a;b;c)for(d;e;f)g;

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

ここでj=0となったときに外側に来るので、j=i++を内側に入れる。

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

!j–となっているのは、反対にするとカッコがないとコンパイルできない。

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

最後に比較と代入を一緒にする。

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

これで73バイトになりましたが、こんなのゴールを見ないと無理ですな。
これでおしまい

コメントを残す

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

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