// AOJ 1181
// Biased Dice

#include<iostream>
#include<vector>

#define MAX_X 151
#define MAX_Y 151
#define M (MAX_X / 2)



typedef struct dice
{
  int top, front, right, left, back, bottom, z;
}dice;

using namespace std;

void drop(dice d, vector< vector<dice> > &map, int x, int y)
{


  dice dd;
  int zz = d.z, xx = -1, yy = -1;
  for(int i = 6; i >= 4; i--)
    {
      if(d.front == i && map[y - 1][x].z < zz)
	{
	  dd.top = d.back, dd.bottom = d.front;
	  dd.right = d.right, dd.left = d.left;
	  dd.front = d.top, dd.back = d.bottom;
	  dd.z = map[y - 1][x].z;
	  xx = x, yy = y - 1;
	  break;
	}
      else if(d.right == i && map[y][x + 1].z < zz)
	{
	  dd.top = d.left, dd.bottom = d.right;
	  dd.right = d.top, dd.left = d.bottom;
	  dd.front = d.front, dd.back = d.back;
	  dd.z = map[y][x + 1].z;
	  xx = x + 1, yy = y;
	  break;
	}
      else if(d.back == i && map[y + 1][x].z < zz)
	{
	  dd.top = d.front, dd.bottom  = d.back;
	  dd.right = d.right, dd.left = d.left;
	  dd.front = d.bottom, dd.back = d.top;
	  dd.z = map[y + 1][x].z;
	  xx = x, yy = y + 1;
	  break;
	}
      else if(d.left == i && map[y][x - 1].z < zz)
	{
	  dd.top = d.right, dd.bottom = d.left;
	  dd.right = d.bottom, dd.left = d.top;
	  dd.front = d.front, dd.back = d.back;
	  dd.z = map[y][x - 1].z;
	  xx = x - 1, yy = y;
	  break;
	}
    }

  if(xx == -1 && yy == -1)
    {
      d.z++;
      map[y][x] = d;
      return ;
    }
  else
    drop(dd, map, xx, yy);
}

void init(vector< vector<dice> > &map)
{
  for(int i; i < MAX_X; i++)
    {
      for(int j; j < MAX_Y; j++)
	{
	  map[i][j].top = 0, map[i][j].bottom = 0;
	  map[i][j].right = 0, map[i][j].left = 0;
	  map[i][j].front = 0, map[i][j].back = 0;
	  map[i][j].z = 0;
	}
   } 
}



int main(void)
{
  int n;
  
  dice d;
  d.top = 4, d.bottom = 3;
  d.front = 6, d.back = 1;
  d.left = 2, d.right = 5;

  int arr[7][7];
  arr[1][2] = 4, arr[1][3] = 2, arr[1][4] = 5, arr[1][5] = 3;
  arr[2][1] = 3, arr[2][3] = 6, arr[2][4] = 1, arr[2][6] = 4;
  arr[3][1] = 5, arr[3][2] = 1, arr[3][5] = 6, arr[3][6] = 2;
  arr[4][1] = 2, arr[4][2] = 6, arr[4][5] = 1, arr[4][6] = 5;
  arr[5][1] = 4, arr[5][3] = 1, arr[5][4] = 6, arr[5][6] = 3;
  arr[6][2] = 3, arr[6][3] = 5, arr[6][4] = 2, arr[6][5] = 4;

  
  while(cin >> n, n)
    {
      int cnt[7] = {0};
      vector< vector<dice> > map(MAX_X, vector<dice>(MAX_Y));
      init(map);
      for(int i = 0; i < n; i++)
	{
	  int top, front;

	  cin >> top, cin >> front;

	  d.top = top, d.bottom = 7 - d.top;
	  d.right = arr[top][front], d.left = 7 - d.right;
	  d.front = front, d.back = 7 - d.front;

	  d.z = map[M][M].z;

	  drop(d, map, M, M);
	}
      for(int i = 0; i < MAX_X; i++)
	for(int j = 0; j < MAX_Y; j++)
	  cnt[map[i][j].top]++;

      for(int i = 1; i < 6; i++)
	cout << cnt[i] << " ";
      cout << cnt[6] << endl;
    }
  return 0;
}