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.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(
				new InputStreamReader(System.in));
		
		ArrayList<Integer> sumList = new ArrayList<Integer>();
		
		while(true) {
			String line = br.readLine();
			int n = Integer.parseInt(line);
			if(n == 0)break;
			
			Dice dice = new Dice();
			
			int sum = 1;
			for(int i = 0;i < n;i++) {
				line = br.readLine();
				if(line.equals("North")) {
					dice.north();
				}else if(line.equals("East")) {
					dice.east();
				}else if(line.equals("South")) {
					dice.south();
				}else if(line.equals("West")) {
					dice.west();
				}else if(line.equals("Right")) {
					dice.right();
				}else {
					dice.left();
				}
				
				sum += dice.getUpper();
			}
			
			sumList.add(sum);
		}
		
		// データセットごとに上面の数の合計値を出力する
		for(int sum : sumList) {
			System.out.println(sum);
		}
	}
}

// サイコロクラス
class Dice{
	private int upper;
	private int north;
	private int east;
	private int south;
	private int west;
	private int bottom;
	
	// コンストラクタ
	public Dice() {
		upper = 1;
		north = 5;
		east = 3;
		south = 2;
		west = 4;
		bottom = 6;
	}
	
	// サイコロの上面を取得するメソッド
	public int getUpper() {
		return upper;
	}
	
	// 北方向へ90度回転させるメソッド
	public void north() {
		int temp = upper;
		upper = south;
		south = bottom;
		bottom = north;
		north = temp;
	}
	
	// 東方向へ90度回転させるメソッド
	public void east() {
		int temp = upper;
		upper = west;
		west = bottom;
		bottom = east;
		east = temp;
	}
	
	// 南方向へ90度回転させるメソッド
	public void south() {
		int temp = upper;
		upper = north;
		north = bottom;
		bottom = south;
		south = temp;
	}
	
	// 西方向へ90度回転させるメソッド
	public void west() {
		int temp = upper;
		upper = east;
		east = bottom;
		bottom = west;
		west = temp;
	}
	
	// 右回りに90度回転させるメソッド
	public void right() {
		int temp = north;
		north = west;
		west = south;
		south = east;
		east = temp;
	}
	
	// 左回りに90度回転させるメソッド
	public void left() {
		int temp = north;
		north = east;
		east = south;
		south = west;
		west = temp;
	}
}