SRM534 DIV2

一応システムテスト済み。
致命的なミスがあるかもしれません・・・

250 point

入力:ファイルリスト {".","..","ContenstApplet.jnlp",...} みたいなかんじ
出力:"."と".."が最後の2つになっているようなファイルリスト。
条件:末尾でない場所に"."か".."があったら、末尾に追加するようにswap。
注意:swapする際に末尾が"."か".."があってもかならず末尾に挿入

public class EllysDirectoryListing {
	public String[] getFiles (String[] files) {
		int last = files.length -1;
		for (int i=0;i<files.length-2;i++) {
			if (files[i].equals(".") || files[i].equals("..")) {
				if (files[last].equals(".") || files[last].equals("..")) {
					String swp = files[last];
					files[last] = files[last-1];
					files[last-1] = swp;
				}
				String swp = files[i];
				files[i] = files[last];
				files[last] = swp;
				last--;
			}
		}
		return files;
	}
}

500 point

入力:右から順に.かoのString, ".o.." みたいなかんじ
出力:初めのプレーヤーがゲームに勝てるかどうか
条件:2人が交互にプレイして、oを右に動かす。動かせなくなったほうが負け。右に1つ動かすか、右に3つジャンプして動かすかを選択できる。ただし一番はじにoが移動したらその場でそのoは消える。
注意:右に1つ動かすのを3回するのと、右に3動かすのを行うのは等価。

考え方:
移動にかかる最短の手数を考える。

...ooooooooo
...432321210

といった具合に、右からの位置pに対して移動量はp/3+p%3。
すべての石に対して移動量を加算して、その和が奇数であれば初手の勝ち。

public class EllysCheckers {
	public String getWinner (String board) {
		int sum = 0;
		for (int i=0;i<board.length();i++) {
			if (board.charAt(i)=='o') {
				int p = board.length() -1 - i;
				sum += p/3 + p%3;
			}
		}
		if (sum%2==1) return "YES";
		return "NO";
	}
}