#include<stdio.h>

// 並べ替え結果処理
void kekka_shori(int *d, int len)
{
    int i, j, tmp[2][5], *p[2], *swap, ans[15], *pa = &ans[0];
    unsigned short b = 0x0000;

    for (i = 0; i < 5; i++) {
        *pa++ = tmp[0][i] = d[i];
    }
    p[0] = &tmp[0][0];
    p[1] = &tmp[1][0];
    for (j = 5; j >= 2; j--) {
        for (i = 0; i < j; i++) {
            b |= 1 << (p[0][i] - 1);
        }
        for (i = 0; i < j - 1; i++) {
            p[1][i] = p[0][i] - p[0][i + 1];
            if (p[1][i] < 0) {
                p[1][i] = -p[1][i];
            }
            *pa++ = p[1][i];
        }
        // swap
        swap = p[0];
        p[0] = p[1];
        p[1] = swap;
    }
    b |= 1 << (p[0][0] - 1);

    if (b == 0x7FFF) {
        pa = &ans[0];
        printf("---\n");
        for (j = 5; j >= 1; j--) {
            printf("%*s", (5 - j) * 2, "");
            for (i = 0; i < j; i++) {
                printf("%2d  ", *pa++);
            }
            printf("\n");
        }
    }
}

// 並べ替える
//  (len個の配列の右n個を左にスライドして再帰)
void narabe(int *d, int len, int n)
{
    int i, j;
    int tmp;

    if (n <= 10) {
        kekka_shori(d, len);
        return;
    }
    for (j = 0; j < n; j++) {
        narabe(d, len, n - 1);
        tmp = d[len - n];
        for (i = 0; i < n - 1; i++) {
            d[len - n + i] = d[len - n + i + 1];
        }
        d[len - n + i] = tmp;
    }
}

int main()
{
    int d[15];
    int i;

    for (i = 0; i < 15; i++) {
        d[i] = i + 1;
    }

    narabe(d, 15, 15);
    printf("\n");
    return 0;
}