#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<cmath>
#include<climits>
#include<ctime>
#include<cstring>
#include<numeric>
 
#define ALL(v) (v).begin(),(v).end()
#define REP(i,p,n) for(int i=p;i<(int)(n);++i)
#define rep(i,n) REP(i,0,n)
#define dump(a) (cerr << #a << "=" << (a) << endl)
#define DUMP(list) cout << "{ "; for(auto nth : list){ cout << nth << " "; } cout << "}" << endl;
 
using namespace std;
 
enum FACE { TOP, BOTTOM, FRONT, BACK, LEFT, RIGHT };
int dy[]={0,0,1,-1,0,0};
int dx[]={0,0,0,0,1,-1};
 
class dice {
    private:
        int num[6];
 
        void roll(FACE a, FACE b, FACE c, FACE d) {
            int tmp = num[a];
            num[a] = num[b];
            num[b] = num[c];
            num[c] = num[d];
            num[d] = tmp;
        }
 
    public:
        dice() {
            num[TOP] = 1;
            num[BOTTOM] = 6;
            num[FRONT] = 3;
            num[BACK] = 4;
            num[RIGHT] = 5;
            num[LEFT] = 2;
        }
 
        void set(int top, int front) {
            if(num[RIGHT] == top || num[LEFT] == top)
                west();
 
            while(num[TOP] != top)
                north();
 
            while(num[FRONT] != front)
                right();
        }
 
        int operator[] (FACE f) const { return num[f]; }
 
        //??????¬????????????¨????????????¢
        void north() { roll(TOP, BACK, BOTTOM, FRONT); }
        void east() { roll(TOP, LEFT, BOTTOM, RIGHT); }
        void west() { roll(TOP, RIGHT, BOTTOM, LEFT); }
        void south() { roll(TOP, FRONT, BOTTOM, BACK); }
        void right() { roll(BACK, RIGHT, FRONT, LEFT); }
        void left() { roll(BACK, LEFT, FRONT, RIGHT); }
};
 
/*
int main(){
    dice d;
    d.set(1,3);
    d.north();
    cout << d[TOP] << endl;//??????§??????
}
*/
 
const int MAX = 200;
 
pair<int, dice> field[MAX][MAX];
 
void show(){
    cout << endl;
    for(int i=95;i<105;i++){
        for(int j=95;j<105;j++){
            cout << field[i][j].first;
        }
        cout << endl;
 
    }
}
 
void solve(dice d,int x,int y) {
    int number=0;
    vector<pair<int, int>> plan; //??????????????????°??????¨??????
    number=d[RIGHT];
    plan.push_back(make_pair(number, RIGHT));
    number=d[LEFT];
    plan.push_back(make_pair(number, LEFT));
    number=d[FRONT];
    plan.push_back(make_pair(number, FRONT));
    number=d[BACK];
    plan.push_back(make_pair(number, BACK));
 
    sort(ALL(plan));
 
    int n = plan.size() - 1;
    bool flag = false;  
    for(int i = n; i >= 0; --i) {
        if(plan[i].first>=4 && field[y+dy[plan[i].second]][x+dx[plan[i].second]].first<field[y][x].first){    
            if(plan[i].second == FRONT){ d.north(); }
            else if(plan[i].second == BACK){ d.south(); } 
            else if(plan[i].second == RIGHT){ d.east();}
            else if(plan[i].second == LEFT){d.west();}
            flag = true;
            y+=dy[plan[i].second];
            x+=dx[plan[i].second];
            break;
        }
    }
    if(!flag){
        field[y][x].first++;
        field[y][x].second=d;
        return;
    }
    solve(d,x,y);
}
 
int main() {
    int n;
    while(cin >> n, n) {
        fill_n((pair<int, dice>*)field, MAX*MAX, make_pair(0, dice()));
        int t, f;
        rep(i, n) {
            cin >> t >> f;
            dice d;
            d.set(t, f);
             
            solve(d, 100, 100);
        }
        vector<int> ans(7, 0);
        rep(i,MAX){
            rep(j,MAX){
                if(field[i][j].first>0){
                    ++ans[field[i][j].second[TOP]];
                }
            }
        }
         
        for(int i = 1; i <= 6; ++i)  {
            cout << ans[i];
            if(i<6) cout << " ";
        }cout << endl;
    }
    return 0;
}

Measured memory_bytes: 2288