プログラミングの世界で、できる限り短くプログラムを書くことをGolfと言うらしい。
実際のGolfで少ない手数を目指すのと同様に、プログラムではコードを短くする。
そして、その短さを競うサイトが存在した。
ま、「サイト見つける→Golfって言うんだ」の順番が正しいのだけども。
anarchy golfというサイト。
今、C言語をかじっているので、自分でも解けそうな問題をやってみることに。
ASCII from 0x01 to 0x7f という問題に目をつけ、さっそくやってみた。
問題は、文字コードが0x01から0x7Fまでの文字をすべて表示するというもの。
きちんと表示できない文字も多数含まれているが、無理やり動かす。
今までの知識では、どうあがいてもソースが長くなってしまう。
なので、他の問題の他人のソースを参考にする。
deadline(期限)が指定されている問題では、deadlineを過ぎると、ソースが公開される。
それらのソースを見てみると、main関数すら大きく異なる。
int main(void){
}
と書いていたものは、
main(){}
まで短くできるようだ。ま、場合によるけども。
そこで書いてみたのが、以下のコード。
main(i){for(;i<128;)putchar(i++);}
main(i){for(;i<128;putchar(i++));}
main(i){while(i<128)putchar(i++);}
どれでもよし。これで34バイト。
でも、こうしても1位の33バイトには届かない。
いったい、どうやっているんだろう。
記事書きながらいろいろいじってみてたらできた。
putcharの戻り値は文字コードになるみたい。
main(i){while(putchar(i++)<127);}
main(i){for(;putchar(i++)<127;);}
どちらでもよし。これで33バイト。
けど、whileのほうがきれいかな?