某TKB大

のプロなんとかにゅなんとかっていう授業は、C言語で出来るだけ短いコードを書いて、プリンタに楽をさせてあげよう、という提出媒体は紙だからあんましエコじゃないよなーという感じの授業です。


例題としては

main(){puts("How are you?\nI am fine,thank you.");}

という何の変哲も無いコードですが、これだとA4用紙立て向きで横書きにした時、ある程度見えるフォントサイズで1行に収まらないかもしれません。


そもそもputsとか長過ぎて話にならないんじゃないかなーと思ったので、pre-preprocessorを授業中に書いてみたり。
20分ぐらいであわあわと書いたのでまだ全然使い物に成りませんが、上のコードは単純に次の様に成ります。

M(){$("How are you?\nI am fine,thank you.");}

mainとputs置き換えたりとか、取りあえず課題で使う範囲のコードを縮められる様にはしています・・・。というより、今の所replaceとか勝手に変数宣言したりとかしかしていないので、削りまくったあげく、1行にこれは納めるのがキツいなーという時はad-hocにガンガン短く出来る様に手を入れています。


もう一例

mi='~~~~',ma,a[10],i;main(){i>9?:(scanf("%d",a+i),ma=fmax(ma,a[i]),mi=fmin(mi,a[i++]),main(),--i);printf("max=%d,min=%d\n",ma,mi);}

mi='~~~~',ma,a[10];M(){i>9?:(#("%d",a+i),ma=MX(ma,a[i]),mi=MN(mi,a[i++]),M(),--i);@("max=%d,min=%d\n",ma,mi);}

これは見て分かる様に、入力が適当に小さい正の整数10個来た時に、それらのうち最大値と最小値を既習範囲で実装せよ、という至って簡単な問題を非常にシンプルに解いてみたものです。


上のコードでは、fmaxとかfminとか、そもそも

<?=
と
>?=

使わせてくださいっていう根本的な問題と、scanfとprintfが長過ぎて一行で収まりそうに無いのでヤバい、という時に取りあえず短くする時に使えそうです。
これならなんとか一行で印刷出来そうです。



と今の所実に簡単な機能しか入れていませんが、取りあえず課題を全て1行に納める様にするという適当な感じでad-hocに開発しようと思ってたり。

もっとイカしたのが欲しいかもしれない(2〜1000の素数求める)

a[C];M(){F(i=2;i<C;++i){F(j=2;i*j<C;)a[i*j++]=1;a[i]?:@("%d\n",i);}}

コンパイルオプションでC指定。ループ変数i,jはグローバルで取ってるのでこれで69byteなんだけど、なんか嫌な感じがする。
TAはこんなのでは満足しない筈。

{}はもういい
a[C];M()F(i=2;i<C;a[i]||@("%d\n",i),++i)F(j=2;i*j<C;a[i*j++]=1);

65byte出来たふいー。もうちょっと行けるのかしら?

aC()Fi(=2;<C;a[]||@("%d\n",),+)Fj(=2;i*<C;a[i*+]=1);

これとかもう何語かすら分かりませんけど、まぁなんとか読めるんじゃないですかねレベルに削れる例として。
50byteぐらいになる。

目的としては

取りあえず頑張って縮めてみて、それでも1行に収まりそうに無い時にこいつを使って更に意味不明なコードにして提出してあげられないかなとかは思います。


後気付いた利点としては、やけに小さくなるので140文字以内に収まりtwitterとかに投げ飛ばす事が出来ると。