珠玉のプログラミング 2.3「基本操作の繰り返し・組み合わせ」で解く

p.16に紹介されている「お手玉の方法」を実装.
相変わらず理解するまでに時間かかったけれど,一度理解できると納得

一時変数をひとつしか用意しない.
配列の大きさの剰余を取ることによって,回転サイズの範囲に収まるようにひとつずつずらすのがコツ
(言葉で説明するのは至難)

#include <stdio.h>

int main(void){

  char array[] = "abcdefg";
  int array_size = 7;
  int rotation_size = 3;
  int i, j;
  char tmp;

  i = 0;
  tmp = array[i];
  
  do{

    while(i + rotation_size < array_size){
      array[i] = array[i + rotation_size];
      i += rotation_size;
    }


    j = (i + rotation_size) % array_size;

    if( j == 0){
      array[i] = tmp;
    }else{
      array[i] = array[j];
    }

    i = j;

  }while(i != 0);
  

  for(j = 0; j < array_size; j++){
    printf("%c ", array[j]);
  }
  printf("\n");

  return 0;
}