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.*;
import java.util.*;

public class Main {
	static public void main(String[] argv) {
		try{
//			FileReader file_in = new FileReader("test.txt");
//			BufferedReader d = new BufferedReader( file_in );
			BufferedReader d = new BufferedReader(new InputStreamReader(System.in));
	
			while(true) {
				String buf = d.readLine();
				
				int num = Integer.valueOf(buf);
				if( num == 0 ) break;
				
				Dice dice = new Dice();
				int res = 1;
				
				for(int i = 0; i < num; i++) {
					buf = d.readLine();
					res += dice.operation(buf);
				}
				
				System.out.println(res);
			}
			
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
}

class Dice {
	private int _top;
	private int _north;
	private int _east;
	
	public Dice() {
		_top = 1;
		_north = 5;
		_east = 3;
	}
	
	public int operation(String order) {
		if( order.equals("North") ) {
			return north();
		} else if( order.equals("South") ) {
			return south();
		} else if( order.equals("East") ) {
			return east();
		} else if( order.equals("West") ) {
			return west();
		} else if( order.equals("Left") ) {
			return left();
		} else if( order.equals("Right") ) {
			return right();
		}
		
		System.out.println("error: invalid order.");
		return 65535;
	}
	
	private int north() {
		int tmp = _north;
		_north = _top;
		_top = 7-tmp;
		return _top;
	}
	
	private int south() {
		int tmp = _north;
		_north = 7-_top;
		_top = tmp;
		return _top;
	}
	
	private int east() {
		int tmp = _east;
		_east = _top;
		_top = 7-tmp;
		return _top;
	}
	
	private int west() {
		int tmp = _east;
		_east = 7-_top;
		_top = tmp;
		return _top;
	}
	
	private int left() {
		int tmp = _north;
		_north = _east;
		_east = 7-tmp;
		return _top;
	}
	
	private int right() {
		int tmp = _north;
		_north = 7-_east;
		_east = tmp;
		return _top;
	}
}