メモ

yukicoderでゆるふわgolf

yukicoder No.565 回転拡大

問題はこちら
No.565 回転拡大 - yukicoder

90度回転する操作により(i,j)にうつるようなマスは(h-1-j,i)である。(0-based index)
よって
new[i][j]=old[h-1-j][i];
という感じのことをi,jについてループでやればよい。
180度、270度回転はこの操作を繰り返し用いれば良い。

r,k,h,w,i,j,n;
char s[5][11][11];
main(){
	scanf("%d%d%d%d\n",&r,&k,&h,&w);
	for(i=0;i<h;i++)gets(s[0][i]);
	for(n=0;n*90<r;n++){
		for(i=0;i<w;i++)for(j=0;j<h;j++)s[n+1][i][j]=s[n][h-1-j][i];
		h^=w^=h^=w;//縦横のサイズを入れ替えるのを忘れないように
	}
	for(i=0;i<h*k;i++){
		for(j=0;j<w*k;j++)putchar(s[n][i/k][j/k]);
		puts("");
	}
}

これを縮める。入力を読み込む先もs[0]ではなくs[r/90]とし、上のコードとは逆順に使ってs[0]を出力することにする。これにより回転数のカウンタnが不要になる
とりあえずパッと見でこう

i,j;
char s[5][11][11];
main(r,k,h,w){
	for(scanf("%d%d%d%d\n",&r,&k,&h,&w),r/=90;gets(s[r][i++]););
	for(;r--;h^=w^=h^=w)for(i=w;i--;)for(j=h;j--;)s[r][i][j]=s[r+1][h-1-j][i];
	for(i=0;i<h*k;i++,puts(""))for(j=0;j<w*k;)putchar(s[n][i/k][j++/k]);
}

まず2つめのfor文に注目する。
最初にここにきたとき、iの値はh+1。iとjを入れ替えることにより、hとwのswapとiの初期化が噛み合って1B縮む

for(;r--;h^=w^=h^=w)for(i=h;i--;)for(j=w;j--;)s[r][j][i]=s[r+1][h-1-i][j];
for(;r--;i=h^=w^=h^=w)for(;i--;)for(j=w;j--;)s[r][j][i]=s[r+1][h-1-i][j];

次に3つ目のfor文を見る。最初にi=0としているが、これは新しい変数を使えば1B短縮することが出来る
しかし、ここに来た時にはrが-1になっているのでこれが使えるので、そのほうがもっと縮む

for(i=0;i<h*k;i++,puts(""))for(j=0;j<w*k;)putchar(s[n][i/k][j++/k]);
for(;++r<h*k;puts(""))for(j=0;j<w*k;)putchar(s[n][r/k][j++/k]);

これを圧縮してみる

for(;++r<h*k;puts(""))for(j=0;j<w*k;)putchar(s[n][r/k][j++/k]);
//形式的に書き換えただけ↓
for(;j<w*k?putchar(s[n][r/k][j++/k]):(j=!puts(""),++r<h*k););
for(;j/w/k?j=!puts(""),++r<h*k:putchar(s[n][r/k][j++/k]););//-4B
//正しくはこう↓
//for(j=0;j/w/k?j=!puts(""),++r+1<h*k:putchar(s[n][(r+1)/k][j++/k]););

最初に来た時、jは回転0度なら0、そうでなければ-1と、一定の値になっていないので困る。
さらにrもincが後になったので1ずれて困る
新しい変数を用意するとそれぞれ2Bかかるが、2つ目のfor文を調整することで+1Bうまくいくので差し引き3B短縮
ということでこれらをまとめるとこう

i,j;
char s[5][11][11];
main(r,k,h,w){
	for(scanf("%d%d%d%d\n",&r,&k,&h,&w),r/=90;gets(s[r][i++]););
	for(;r;i=h^=w^=h^=w)for(r--;i--;)for(j=w;j;s[r][j][i]=s[r+1][h-1-i][--j]);
	for(;j/w/k?j=!puts(""),++r<h*k:putchar(s[0][r/k][j++/k]););
}

230B