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: Wrong Answer)

import java.util.*;
import java.io.*;
import java.awt.geom.*;
import java.math.*;

public class Main {

	static final Scanner in = new Scanner(System.in);
	static final PrintWriter out = new PrintWriter(System.out,false);
	static boolean debug = false;

	static boolean solve() {
		int n = in.nextInt();
		if (n == 0) return false;

		Dice d = new Dice();
		int sum = 1;
		for (int i=0; i<n; i++) {
			String s = in.next();
			if ("North".equals(s)) {
				d.rotate(1);
			} else if ("East".equals(s)) {
				d.rotate(0);
			} else if ("West".equals(s)) {
				d.rotate(2);
			} else if ("South".equals(s)) {
				d.rotate(3);
			} else if ("Right".equals(s)) {
				d.rotate(4);
			} else if ("Left".equals(s)) {
				d.rotate(5);
			}

			sum += d.face[Dice.TOP];
		}
		out.println(sum);

		return true;
	}

	public static void main(String[] args) {
		debug = args.length > 0;
		long start = System.currentTimeMillis();

		while(solve());
		out.flush();

		long end = System.currentTimeMillis();
		dump((end-start) + "ms");
		in.close();
		out.close();
	}

	static void dump(Object... o) { if (debug) System.err.println(Arrays.deepToString(o)); }
}

class Dice implements Cloneable{

	public static final int TOP = 0;
	public static final int BOTTOM = 1;
	public static final int FRONT = 2;
	public static final int BACK = 3;
	public static final int LEFT = 4;
	public static final int RIGHT = 5;

	public static final int[][] roll = {
		{TOP,LEFT,BOTTOM,RIGHT},//+x
		{TOP,FRONT,BOTTOM,BACK},//+y
		{TOP,RIGHT,BOTTOM,LEFT},//-x
		{TOP,BACK,BOTTOM,FRONT},//-y

		{FRONT,RIGHT,BACK,LEFT},//cw
		{FRONT,LEFT,BACK,RIGHT},//ccw
	};

	public static final int[] dx = {1,0,-1,0};
	public static final int[] dy = {0,1,0,-1};

	final int[] face;

	public Dice() {
		this.face = new int[6];
		this.face[TOP] = 1; this.face[BOTTOM] = 6; this.face[FRONT] = 2;
		this.face[BACK] = 4; this.face[LEFT] = 4; this.face[RIGHT] = 3;
	}
	public Dice(int[] nums) {
		this.face = nums.clone();
	}

	public void rotate(int dir) {
		int temp = face[roll[dir][0]];
		for (int i=0; i<3; i++) {
			face[roll[dir][i]] = face[roll[dir][i+1]];
		}
		face[roll[dir][3]] = temp;
	}

	static void swap(Dice d1, Dice d2) {
		for (int i=0; i<6; i++) {
			int temp = d1.face[i];
			d1.face[i] = d2.face[i];
			d2.face[i] = temp;
		}
	}

	public boolean equals(Dice d) {
		return  this.face[TOP] == d.face[TOP] && this.face[BOTTOM] == d.face[BOTTOM]
			&& this.face[FRONT] == d.face[FRONT] && this.face[BACK] == d.face[BACK]
			&& this.face[LEFT] == d.face[LEFT] && this.face[RIGHT] == d.face[RIGHT];
	}

	public String toString() {
		return Arrays.toString(face);
	}

	@Override
	public Dice clone() {
		return new Dice(this.face);
	}
}