Created
August 17, 2012 17:03
-
-
Save torazuka/3380648 to your computer and use it in GitHub Desktop.
第3回 オフラインリアルタイムどう書くの参考問題: Java解答
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Context { | |
int out; | |
int strike; | |
int ball; | |
@Override | |
// アウト・ストライク・ボールの順にカウントをつなげたものをコンマで区切る。 | |
public String toString() { | |
StringBuilder sb = new StringBuilder(); | |
sb.append(String.valueOf(out)); | |
sb.append(String.valueOf(strike)); | |
sb.append(String.valueOf(ball)); | |
return new String(sb); | |
} | |
} | |
interface Play { | |
void evaluate(Context con); | |
void check(Context con); | |
} | |
class DefaultPlay implements Play { | |
@Override | |
public void evaluate(Context con) { | |
} | |
@Override | |
// アウトが3つになったら、アウト・ストライク・ボール全てゼロになる。 | |
public void check(Context con) { | |
if (con.out == 3) { | |
con.out = 0; | |
con.strike = 0; | |
con.ball = 0; | |
} | |
} | |
} | |
class Strike extends DefaultPlay implements Play { | |
@Override | |
// ストライクが3つになったらアウトが増え、ストライクとボールがゼロになる。 | |
public void evaluate(Context con) { | |
con.strike++; | |
if (2 < con.strike) { | |
con.out++; | |
con.strike = 0; | |
con.ball = 0; | |
} | |
} | |
} | |
class Ball extends DefaultPlay implements Play { | |
@Override | |
// ボールが4つになったらフォアボールになり、ストライクとボールがゼロになる。アウトは増えない。 | |
public void evaluate(Context con) { | |
con.ball++; | |
if (3 < con.ball) { | |
con.strike = 0; | |
con.ball = 0; | |
} | |
} | |
} | |
class Foul extends DefaultPlay implements Play { | |
@Override | |
// ファウルの場合、もともとストライクが1以下の場合はストライクが増え、ストライクが2の場合には変化なし。 | |
public void evaluate(Context con) { | |
if (con.strike < 2) { | |
con.strike++; | |
} | |
} | |
} | |
class Hit extends DefaultPlay implements Play { | |
@Override | |
// ヒットを打ったらストライクとボールがゼロになる。アウトは増えない。 | |
public void evaluate(Context con) { | |
con.strike = 0; | |
con.ball = 0; | |
} | |
} | |
class PitcherFly extends DefaultPlay implements Play { | |
@Override | |
// ピッチャーフライを打ったらストライクとボールがゼロになり、アウトが増える。 | |
public void evaluate(Context con) { | |
con.strike = 0; | |
con.ball = 0; | |
con.out++; | |
} | |
} | |
/** | |
* 問題: http://qiita.com/items/ebd8a56b41711ba459f9 | |
*/ | |
public class BallCount { | |
protected Play convertPlay(char c) { | |
Play result = null; | |
if (c == 's') { | |
result = new Strike(); | |
} else if (c == 'b') { | |
result = new Ball(); | |
} else if (c == 'f') { | |
result = new Foul(); | |
} else if (c == 'h') { | |
result = new Hit(); | |
} else if (c == 'p') { | |
result = new PitcherFly(); | |
} | |
return result; | |
} | |
protected String execute(String input) { | |
Context con = new Context(); | |
String[] tmp = new String[input.length()]; | |
for (int i = 0; i < input.length(); i++) { | |
char c = input.charAt(i); | |
Play play = convertPlay(c); | |
play.evaluate(con); | |
play.check(con); | |
tmp[i] = con.toString(); | |
} | |
StringBuilder result = new StringBuilder(); | |
result.append(tmp[0]); | |
for (int i = 1; i < input.length(); i++) { | |
result.append(','); | |
result.append(tmp[i]); | |
} | |
return new String(result); | |
} | |
public static void main(String[] args) { | |
BallCount count = new BallCount(); | |
System.out.println(count.execute("ssffpffssp")); | |
// 010,020,020,020,100,110,120,200,210,000 | |
// すべてのテストデータはBallCountTes.javaを参照。 | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import static org.junit.Assert.assertEquals; | |
import org.junit.Test; | |
/** | |
* test data: http://qiita.com/items/ebd8a56b41711ba459f9 | |
*/ | |
public class BallCountTest { | |
@Test | |
public void testName() throws Exception { | |
BallCount count = new BallCount(); | |
assertEquals("010", count.execute("s")); | |
assertEquals("010,020,100", count.execute("sss")); | |
assertEquals("001,002,003,000", count.execute("bbbb")); | |
assertEquals("010,020,021,022,023,000", count.execute("ssbbbb")); | |
assertEquals("000,010,011,000,010,000,001,000", | |
count.execute("hsbhfhbh")); | |
assertEquals("100,110,111,200,210,000,001,100", | |
count.execute("psbpfpbp")); | |
assertEquals("100,200,000", count.execute("ppp")); | |
assertEquals("010,020,020,020,100", count.execute("ffffs")); | |
assertEquals("010,020,100,200,210,220,220,000", | |
count.execute("ssspfffs")); | |
assertEquals("001,002,003,013,023,000,100,200,000", | |
count.execute("bbbsfbppp")); | |
assertEquals( | |
"010,020,100,101,102,103,100,110,111,100,110,111,200,000,100", | |
count.execute("sssbbbbsbhsbppp")); | |
assertEquals("010,020,020,020,100,110,120,200,210,000", | |
count.execute("ssffpffssp")); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment