ショートコーディングに挑戦してみた
どーもこんにちは。calcsです。
さて、今回のお題はショートコーディング(Short coding)。
以前からたまに触れている、私の通う学校でのC言語の授業の話です。
今日はその授業があったんですが、今日提出だった課題をネタにします。
課題は以下のようなものでした。
1.コンソールに九九の表を出力せよ。
2.数字は二桁で桁揃えされ、数字の間はタブ区切りである
それで、とりあえず提出用のコードを3分かからず書いたのが以下。
#include <stdio.h>至極真っ当です。int main() {
int x,y;for (y=1;y<=9;y++){
for (x=1;x<=9;x++){
printf("%2d¥t",x*y);
}
printf("¥n");
}
return 0;}
んで、まぁ、昼休みも暇だったんで、ちょっくらgolf(コードを短くする遊びのこと)に勤しんでみたわけです。
それで出来た、今のところ最短コードは以下です。
main(i){for(i=0;i<81;i%9||puts())printf("%2d ",(i/9+1)*(i++%9+1));}
67バイトになりました。なんかまだ冗長な気もするんですが、考えてもアイデア出ませんでした。
まだもとのコードに近いのは、ネストしたループの構造を圧縮した
main(i,j){for(i=j=1;i<10;)j<10?printf("%2d ",i*j++):(puts(),j=1,i++);}
の70バイトコードかと。こっちはこっちでまだまだ削れそうな気がする・・。
一応67バイトの方が処理系依存(授業で使ってるのがbccなので、それに合わせた)なのに対し、70バイトのほうは大体の環境で動くはず。
ポイントはCでは計算式の評価順序が未定義ということ。
誰かもっといいアイデア思い浮かんだら教えてください。