挑戦!
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", "-" );
}
}
多分、無駄がいっぱいある・・・