#include <iostream>
#include <vector>
#include <cstring>
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;

// C
#define SIZE 300

int high[SIZE][SIZE]; // 高さを記録する
int field[SIZE][SIZE]; // topを記録する
// 一つのマスを見たとき、上方向がtop、front方向がleftとする


void roll_x(int sai[3]){
    int tmp = sai[1];
    sai[1] = sai[2];
    sai[2] = 7 - tmp;
}

void roll_y(int sai[3]){
    int tmp = sai[0];
    sai[0] = sai[1];
    sai[1] = 7 - tmp;
}

void roll_z(int sai[3]){
    int tmp = sai[0];
    sai[0] = sai[2];
    sai[2] = 7 - tmp;
}

int getBack(int t, int f){
    int sai[] = {1, 3, 5};
    int i,j,k;
    
    for(i=0; i<4; i++){ // x
        roll_x(sai);
        for(j=0; j<4; j++){ // y
            roll_y(sai);
            if( t == sai[0] && f == sai[1] ) return sai[2];
        }
    }

    //printf("sai[] = {%d %d %d}\n",sai[0],sai[1],sai[2]);
    for(j=0; j<4; j++){ // y
        roll_y(sai);
        for(k=0; k<4; k++){ // z
            roll_z(sai);
            if( t == sai[0] && f == sai[1] ) return sai[2];
        }
    }

    for(i=0; i<4; i++){ // x
        roll_x(sai);
        for(k=0; k<4; k++){ // z
            roll_z(sai);
            if( t == sai[0] && f == sai[1] ) return sai[2];
        }
    }
    return -1;
}


int main(){
    int i,n,j,k;

    while( cin >> n, n ){
        // init
        memset(high, 0, sizeof(high));
        memset(field, -1, sizeof(field));

        //printf("n = %d\n",n);
        while( n-- ){
            int t,f; cin >> t >> f;
            int b = getBack(t,f);
            int sx = SIZE / 2, sy = SIZE / 2;
            int d[3];
            d[0] = t, d[1] = f, d[2] = b;

            // さいころの形を先に調べておく
            //cout << t << " " << f << " " << b << endl;

            for(;;){ // 転がれるだけ転がる
                int mk = -1, idx = -1;
                //printf("d[] = {%d,%d,%d}, (%d,%d)\n",d[0],d[1],d[2],sx,sy);
                if( field[sy][sx] == -1 ){ // 平面
                    field[sy][sx] = d[0];
                    high[sy][sx]++;
                    //printf("field[%d][%d] = %d\n", sy,sx,field[sy][sx]);
                    break;
                }
                // 平面じゃないので、転がれるかチェックする
                if( 7 - d[1] > mk && 7 - d[1] > 3 && high[sy][sx] > high[sy][sx + 1] ){ // 右に転がれるか
                    // 右に転がる場合はroll_yに相当
                    idx = 0;
                    mk = 7 - d[1];
                }
                if( d[2] > mk && d[2] > 3 && high[sy][sx] > high[sy + 1][sx] ){ // 下に転がれるか
                    // 下に転がる場合はroll_z * 3に相当
                    idx = 1;
                    mk = d[2];
                }
                if( d[1] > mk && d[1] > 3 && high[sy][sx] > high[sy][sx - 1] ){ // 左に転がれるか
                    idx = 2;
                    mk = d[1];
                }
                if( 7 - d[2] > mk && 7 - d[2] > 3 && high[sy][sx] > high[sy - 1][sx] ){ // 上に転がれるか
                    idx = 3;
                    mk = 7 - d[2];
                }

                //printf("{%d,%d,%d}, sx = %d, sy = %d, idx = %d, mk = %d\n", d[0], d[1], d[2], sx, sy, idx, mk);
                if( mk == -1 ){
                    high[sy][sx]++;
                    field[sy][sx] = d[0];
                    break;
                }

                switch(idx){
                case 0: // 右に転がる
                    roll_y(d);
                    sx++;
                    break;
                case 1: // 下に転がる
                    roll_z(d); roll_z(d); roll_z(d);
                    sy++;
                    break;
                case 2: // 左に転がる
                    roll_y(d); roll_y(d); roll_y(d);
                    sx--;
                    break;
                case 3: // 上に転がる
                    roll_z(d);
                    sy--;
                    break;
                default:
                    puts("eeeeeeeeeeeeeeeeeee"); break;
                }
            }

            // debug
            /*
            for(j=0; j<SIZE; j++){
                for(k=0; k<SIZE; k++){
                    printf("%2d ",field[j][k] == -1 ? 0 : field[j][k]);
                }
                puts("");
            }
            puts("");
            */
        }

        int cnt[7] = {0};
        for(i=0; i<SIZE; i++){
            for(j=0; j<SIZE; j++){
                if( field[i][j] != -1 ) cnt[field[i][j]]++;
            }
        }

        for(i=1; i<=6; i++){
            if( i > 1 ) putchar(' ');
            printf("%d",cnt[i]);
        }
        puts("");
    }

    return 0;
}

Measured memory_bytes: 0