Problem:
サイコロが以下の図のような向きで置かれている．

ここで使用するサイコロは，この図のように，上側に 1，南側に 2 があるときは，東側に 3 があるものとする．サイコロの向かいあう面の和は必ず 7 なので，見えない面はそれぞれ北側 5，西側 4，下側 6 になっている．

　この初期配置の状態から指示に従ってサイコロを動かしていく．ただし，指示は以下の 6 通りの操作を何回か行うものである．

North，East，South，West の各操作は指示された方向へサイコロを 90 度回転させる．
　Right，Left の 2 つの操作は上下の面はそのままで水平方向に 90 度回転させる．（回転させる向きに要注意．）

　初期配置で上の面に出ている目 1 を初期値とし， 1 回の操作が終わるたびに，上の面に出ている目の数を加算していき，指示にしたがってすべての操作を終えたときの合計値を出力するプログラムを作成しなさい.

　入力ファイルの 1 行目には総指示回数 n が書かれていて，続く n 行の各行には「North，East，South，West，Right，Left」のいずれか 1 つの指示が書かれているものとする．ただし， n ≦ 10000 とする．

入力例１

入力例２

5

8

North

West

North

North

East

Left

South

South

West

Right

North

Left

East

　

出力例１

出力例２

21

34

入力

入力は複数のデータセットからなる．n が 0 のとき入力が終了する．データセットの数は 5 を超えない．

出力

データセットごとに、合計値を１行に出力する．

入力例

5
North
North
East
South
West
8
West
North
Left
South
Right
North
Left
East
0

出力例

21
34

各データセットの出力（合計値）の後に改行を入れること。

上記問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in JAVA (judge verdict: Accepted)

import java.util.*;

enum Eye {
    TOP,
    FRONT,
    RIGHT,
    LEFT,
    BACK,
    BOTTOM
}

class Dice {
    private int[] eye = { 1, 2, 3, 4, 5, 6 };
    private int topCount;

    public Dice() {
        this.topCount = 1;
    }

    public void clearDice() {
        for (int i = 0; i < 6; i++) {
            this.eye[i] = i + 1;
        }
        this.topCount = 1;
    }

    public void rollNorth() {
        rollN();
        addTopCount();
    }

    public void rollSouth() {
        rollS();
        addTopCount();
    }

    public void rollEast() {
        rollE();
        addTopCount();
    }

    public void rollWest() {
        rollW();
        addTopCount();
    }

    public void rollRight() {
        rollR();
        addTopCount();
    }

    public void rollLeft() {
        rollL();
        addTopCount();
    }

    public int getTopCount() {
        return this.topCount;
    }

    private void rollN() {
        int tmp;

        tmp = this.eye[Eye.TOP.ordinal()];
        this.eye[Eye.TOP.ordinal()] = this.eye[Eye.FRONT.ordinal()];
        this.eye[Eye.FRONT.ordinal()] = this.eye[Eye.BOTTOM.ordinal()];
        this.eye[Eye.BOTTOM.ordinal()] = this.eye[Eye.BACK.ordinal()];
        this.eye[Eye.BACK.ordinal()] = tmp;
    }

    private void rollS() {
        int tmp;

        tmp = this.eye[Eye.TOP.ordinal()];
        this.eye[Eye.TOP.ordinal()] = this.eye[Eye.BACK.ordinal()];
        this.eye[Eye.BACK.ordinal()] = this.eye[Eye.BOTTOM.ordinal()];
        this.eye[Eye.BOTTOM.ordinal()] = this.eye[Eye.FRONT.ordinal()];
        this.eye[Eye.FRONT.ordinal()] = tmp;
    }

    private void rollE() {
        int tmp;

        tmp = this.eye[Eye.TOP.ordinal()];
        this.eye[Eye.TOP.ordinal()] = this.eye[Eye.LEFT.ordinal()];
        this.eye[Eye.LEFT.ordinal()] = this.eye[Eye.BOTTOM.ordinal()];
        this.eye[Eye.BOTTOM.ordinal()] = this.eye[Eye.RIGHT.ordinal()];
        this.eye[Eye.RIGHT.ordinal()] = tmp;
    }

    private void rollW() {
        int tmp;

        tmp = this.eye[Eye.TOP.ordinal()];
        this.eye[Eye.TOP.ordinal()] = this.eye[Eye.RIGHT.ordinal()];
        this.eye[Eye.RIGHT.ordinal()] = this.eye[Eye.BOTTOM.ordinal()];
        this.eye[Eye.BOTTOM.ordinal()] = this.eye[Eye.LEFT.ordinal()];
        this.eye[Eye.LEFT.ordinal()] = tmp;
    }

    private void rollR() {
        int tmp;

        tmp = this.eye[Eye.FRONT.ordinal()];
        this.eye[Eye.FRONT.ordinal()] = this.eye[Eye.RIGHT.ordinal()];
        this.eye[Eye.RIGHT.ordinal()] = this.eye[Eye.BACK.ordinal()];
        this.eye[Eye.BACK.ordinal()] = this.eye[Eye.LEFT.ordinal()];
        this.eye[Eye.LEFT.ordinal()] = tmp;
    }

    private void rollL() {
        int tmp;

        tmp = this.eye[Eye.FRONT.ordinal()];
        this.eye[Eye.FRONT.ordinal()] = this.eye[Eye.LEFT.ordinal()];
        this.eye[Eye.LEFT.ordinal()] = this.eye[Eye.BACK.ordinal()];
        this.eye[Eye.BACK.ordinal()] = this.eye[Eye.RIGHT.ordinal()];
        this.eye[Eye.RIGHT.ordinal()] = tmp;
    }

    private void addTopCount() {
        this.topCount += this.eye[Eye.TOP.ordinal()];
    }
}

class Player {
    private Dice dice;

    public Player() {
        dice = new Dice();
    }

    public void start() {
        dice.clearDice();
    }

    public void setDirection(String direction) {
        rollDice(direction);
    }

    void rollDice(String direction) {
        if (direction.equals("North")) {
            dice.rollNorth();
        } else if (direction.equals("South")) {
            dice.rollSouth();
        } else if (direction.equals(("East"))) {
            dice.rollEast();
        } else if (direction.equals(("West"))) {
            dice.rollWest();
        } else if (direction.equals(("Right"))) {
            dice.rollRight();
        } else if (direction.equals(("Left"))) {
            dice.rollLeft();
        }
    }

    int getCount() {
        return dice.getTopCount();
    }
}

public class Main {

    public static void main(String[] args) {
	    // write your code here
        Player player = new Player();
        Scanner sc = new Scanner(System.in);

        while (true) {
            player.start();
            int a = 0;
            int n = Integer.parseInt(sc.next());
            if (n == 0) {
                break;
            }
            for (int i = 0; i < n; i++) {
                String str = sc.next();
                player.setDirection(str);
            }
            System.out.println(player.getCount());
        }
    }
}