Skip to content

Instantly share code, notes, and snippets.

@torazuka
Created August 17, 2012 17:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save torazuka/3380648 to your computer and use it in GitHub Desktop.
Save torazuka/3380648 to your computer and use it in GitHub Desktop.
第3回 オフラインリアルタイムどう書くの参考問題: Java解答
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を参照。
}
}
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