#include <stdio.h>
#include <string.h>

int dx[4]={-1,1,0,0};
int dy[4]={0,0,1,-1};

enum{TOP,BOTTOM,LEFT,RIGHT,FRONT,BACK};
int dice[6] = {1,6,2,5,3,4};
void l_rotate(int *a, int *b, int *c, int *d){
	int t = *a;
	*a = *b; *b = *c; *c = *d; *d = t;
}

// d=方向
void rotate(int d){
	if(d == 0){
		l_rotate(&dice[LEFT], &dice[TOP], &dice[RIGHT], &dice[BOTTOM]);
	}else if(d == 1){
		rotate(0); rotate(0); rotate(0);
	}else if(d == 2){
		l_rotate(&dice[FRONT], &dice[TOP], &dice[BACK], &dice[BOTTOM]);
	}else if(d == 3){
		rotate(2); rotate(2); rotate(2);
	}else{
		l_rotate(&dice[FRONT], &dice[RIGHT], &dice[BACK], &dice[LEFT]);
	}
}

int t[200][200]; // 上部の数字
int h[200][200]; // 各マスにつまれているサイコロの数
// サイコロを落とす
void solve(int top, int front){
	int x = 100, y = 100, i, j;

	// 同じ回転状態のサイコロを探す．
	for(i = 0; i < 6; i++){
		for(j = 0; j < 4; j++){
			rotate(-1);
			if(dice[TOP] == top && dice[FRONT] == front){
				goto exit_loop; // 発見したので2重ループから抜ける
			}
		}
		if(i & 1){
			rotate(0);
		}else{
			rotate(2);
		}
	}
exit_loop:
	h[x][y]++;
	while(1){
		for(i = 6; i >= 3; i--) { // 転がす面
			if(i == 3){
				printf("%d\n",dice[TOP]);
				return;
			}
			for(j = 0; j < 4; j++){
				if(dice[2 + j] == i && h[x + dx[j]][y + dy[j]] < h[x][y] - 1){
					h[x][y]--;
					rotate(j);
					x += dx[j]; y += dy[j];
					h[x][y]++;
					i = 2; break;
				}
			}
		}
	}
}


int main() {
	int n, i, j;
	while(scanf("%d", &n) != EOF){
		int count[7] = {};
		if(n == 0) break;

		memset(h, 0, sizeof(h));
		memset(t, 0, sizeof(t));
		for(i = 0; i < n; i++){
			int top, front;
			scanf("%d %d", &top, &front);
			solve(top, front);
		}
		for(i = 0; i < 200; i++){
			for(j = 0; j < 200; j++){
				count[t[i][j]]++;
			}
		}
		for(i = 1; i <= 6; i++){
			printf(i == 1 ? "%d" : " %d", count[i]);
		}
		puts("");
		fflush(stdout);
	}
	return 0;
}