某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とかに投げ飛ばす事が出来ると。