第6回オフラインリアルタイムどう書くの問題 Javaで回答

http://qiita.com/Nabetani/items/5e1c944541f09f0f9711

挑戦!

```java

package how;

public class JudgeZokugara {

	/** 続柄：本人 */
	private static final String HONNIN =  "me";
	/** 続柄：母 */
	private static final String HAHA =  "mo";
	/** 続柄：娘 */
	private static final String MUSUME =  "da";
	/** 続柄：姉妹 */
	private static final String SIMAI =  "si";
	/** 続柄：おば */
	private static final String OBA =  "au";
	/** 続柄：姪 */
	private static final String MEI =  "ni";
	/** 続柄：いとこ */
	private static final String ITOKO =  "co";
	/** 続柄：その他 */
	private static final String OTHER =  "-";

	/**
	 * 判定メソッド
	 * @param relation 関係
	 * @return 続柄
	 */
	private static String judge(String relation) {

		// relation(a->b)を"a"と"b"に分解
		int from = Integer.valueOf(relation.split("->")[0]);
		int to = Integer.valueOf(relation.split("->")[1]);
		// fromとtoが同値であれば本人
		if (from == to) {
			return HONNIN;
		}

		// 世代判定
		// fromの世代判定
		int fromGene = isGeneration(from);
		// toの世代判定
		int toGene = isGeneration(to);
		if (fromGene == toGene) {
			// 世代が同じ
			if(getParentNo(from) == getParentNo(to)) {
				// 親が同じ => 姉妹
				return SIMAI;
			} else {
				// 親が違う
				if (getParentNo(getParentNo(from)) == getParentNo(getParentNo((to)))) {
					// 祖母が同じ => 従姉妹
					return ITOKO;
				} else {
					return OTHER;
				}
			}
		} else if (fromGene > toGene) {
			// toがfromより世代が1つ上 => 母 or おば
			// それ以外 => その他の続柄
			if (fromGene-1 == toGene) {
				if (to == getParentNo(from)) {
					// fromの親番号がtoと同じ => 母
					return HAHA;
				} else {
					if (getParentNo(to) == getParentNo(getParentNo(from))) {
						// fromの祖母がtoの母と同じ => おば
						return OBA;
					}
				}
				// fromの祖母がtoの母と違う => その他
				return OTHER;
			}
			return OTHER;
		} else {
			// fromがtoより世代が1つ上 => 娘 or 姪
			// それ以外 => その他の続柄
			if (fromGene+1 == toGene) {
				if (from == getParentNo(to)) {
					// toの親番号がfromと同じ => 娘
					return MUSUME;
				} else {
					if (getParentNo(from) == getParentNo(getParentNo(to))) {
						// toの祖母がfromの母と同じ => 姪
						return MEI;
					}
				}
				// toの祖母がfromの母と違う => その他
				return OTHER;
			}
			return OTHER;
		}
	}

	/**
	 * 世代判定
	 * @param num
	 * @return 世代番号（第1世代：0,第2世代:1）
	 */
	private static int isGeneration(int num) {
		int gene = 0;
		int start = 1;
		int end = 1;
		if (1 < num) {
			gene = 1;
			while (gene<=3) {
				start = start + (int)Math.pow(3,gene-1);
				end = end + (int)Math.pow(3,gene);
				if (start <= num
						&& end >= num) {
					break;
				}
				gene++;
			}
		}
		return gene;
	}

	/**
	 * 親の番号を返却する。
	 * @param no
	 * @return
	 */
	private static int getParentNo(int no) {
		int parentNo = 1;

		if (0==no%3) {
			parentNo = no/3;
		} else if ((no-1)%3==0) {
			parentNo = (no-1)/3;
		} else if ((no+1)%3==0) {
			parentNo = (no+1)/3;
		}


		return parentNo;
	}

	/**
	 * テスト実行メソッド
	 * @param relation 関係
	 * @param exp 結果の期待値
	 */
	private static void test(String relation, String exp) {
		// 判定
		if (exp.equals(judge(relation))) {
			System.out.println(relation + " : " + exp + " => OK" );
		} else {
			System.out.println(relation + " : " + exp + " => NG" );
		}
	}

	/**
	 * 実行メソッド
	 * @param args
	 */
	public static void main(String[] args) {
		/*#0*/ test( "5->2", "mo" );
		/*#1*/ test( "28->10", "au" );
		/*#2*/ test( "1->1", "me" );
		/*#3*/ test( "40->40", "me" );
		/*#4*/ test( "27->27", "me" );
		/*#5*/ test( "7->2", "mo" );
		/*#6*/ test( "40->13", "mo" );
		/*#7*/ test( "9->3", "mo" );
		/*#8*/ test( "4->1", "mo" );
		/*#9*/ test( "1->3", "da" );
		/*#10*/ test( "12->35", "da" );
		/*#11*/ test( "3->8", "da" );
		/*#12*/ test( "6->19", "da" );
		/*#13*/ test( "38->40", "si" );
		/*#14*/ test( "9->8", "si" );
		/*#15*/ test( "4->2", "si" );
		/*#16*/ test( "15->16", "si" );
		/*#17*/ test( "40->12", "au" );
		/*#18*/ test( "10->4", "au" );
		/*#19*/ test( "21->5", "au" );
		/*#20*/ test( "8->2", "au" );
		/*#21*/ test( "3->5", "ni" );
		/*#22*/ test( "11->39", "ni" );
		/*#23*/ test( "2->13", "ni" );
		/*#24*/ test( "13->32", "ni" );
		/*#25*/ test( "14->22", "co" );
		/*#26*/ test( "40->34", "co" );
		/*#27*/ test( "5->8", "co" );
		/*#28*/ test( "12->10", "co" );
		/*#29*/ test( "1->27", "-" );
		/*#30*/ test( "8->1", "-" );
		/*#31*/ test( "12->22", "-" );
		/*#32*/ test( "2->40", "-" );
		/*#33*/ test( "32->31", "-" );
		/*#34*/ test( "13->14", "-" );
	}
}
```

多分、無駄がいっぱいある・・・