Created
April 7, 2013 04:17
-
-
Save torazuka/5328992 to your computer and use it in GitHub Desktop.
第9回オフラインリアルタイムどう書く(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
package yhpg9; | |
import static org.junit.Assert.assertEquals; | |
import java.util.ArrayList; | |
import java.util.Arrays; | |
import java.util.Iterator; | |
import java.util.List; | |
import org.junit.Test; | |
class Paseenger { | |
Age age; | |
Kind kind; | |
public Paseenger(final String str) { | |
age = createAge(str.charAt(0)); | |
kind = createKind(str.charAt(1)); | |
} | |
private Age createAge(final char c) { | |
AgeKey key = AgeKey.valueOf(String.valueOf(c)); | |
return key.make(); | |
} | |
private Kind createKind(final char c) { | |
KindKey key = KindKey.valueOf(String.valueOf(c)); | |
return key.make(); | |
} | |
public void lineUp(final BusfeeEx bf) { | |
age.lineUp(this, bf); | |
} | |
public int getFee(final int base) { | |
int tmp = age.getFee(base); | |
return kind.discount(tmp); | |
} | |
} | |
abstract class Age { | |
abstract int getFee(final int base); | |
abstract void lineUp(final Paseenger p, final BusfeeEx bf); | |
} | |
class Adult extends Age { | |
@Override | |
public int getFee(final int base) { | |
return base; | |
} | |
@Override | |
void lineUp(final Paseenger p, final BusfeeEx bf) { | |
bf.pushPassenger(this, p); | |
} | |
} | |
class Child extends Age { | |
@Override | |
public int getFee(final int base) { | |
return BusfeeEx.getHalf(base); | |
} | |
@Override | |
void lineUp(final Paseenger p, final BusfeeEx bf) { | |
bf.pushPassenger(this, p); | |
} | |
} | |
class Infant extends Age { | |
@Override | |
public int getFee(final int base) { | |
return BusfeeEx.getHalf(base); | |
} | |
@Override | |
void lineUp(final Paseenger p, final BusfeeEx bf) { | |
p.kind.lineUp(p, bf); | |
} | |
} | |
enum AgeKey { | |
A { | |
@Override | |
Age make() { | |
return new Adult(); | |
} | |
}, | |
C { | |
@Override | |
Age make() { | |
return new Child(); | |
} | |
}, | |
I { | |
@Override | |
Age make() { | |
return new Infant(); | |
} | |
}; | |
abstract Age make(); | |
} | |
abstract class Kind { | |
abstract int discount(final int original); | |
abstract void lineUp(final Paseenger p, final BusfeeEx bf); | |
} | |
class Normal extends Kind { | |
@Override | |
public int discount(final int original) { | |
return original; | |
} | |
@Override | |
void lineUp(final Paseenger p, final BusfeeEx bf) { | |
bf.pushPassenger(this, p); | |
} | |
} | |
class Pass extends Kind { | |
@Override | |
public int discount(final int original) { | |
return 0; | |
} | |
@Override | |
void lineUp(final Paseenger p, final BusfeeEx bf) { | |
bf.pushPassenger(this, p); | |
} | |
} | |
class Welfare extends Kind { | |
@Override | |
public int discount(final int original) { | |
return BusfeeEx.getHalf(original); | |
} | |
@Override | |
void lineUp(final Paseenger p, final BusfeeEx bf) { | |
bf.pushPassenger(this, p); | |
} | |
} | |
enum KindKey { | |
n { | |
@Override | |
Kind make() { | |
return new Normal(); | |
} | |
}, | |
p { | |
@Override | |
Kind make() { | |
return new Pass(); | |
} | |
}, | |
w { | |
@Override | |
Kind make() { | |
return new Welfare(); | |
} | |
}; | |
abstract Kind make(); | |
} | |
/** | |
* 問題: http://nabetani.sakura.ne.jp/hena/ord9busfare/ | |
*/ | |
public class BusfeeEx { | |
List<Paseenger> adults = new ArrayList<>(); | |
List<Paseenger> children = new ArrayList<>(); | |
List<Paseenger> infantNormal = new ArrayList<>(); | |
List<Paseenger> infantPass = new ArrayList<>(); | |
List<Paseenger> infantWelfare = new ArrayList<>(); | |
static int getHalf(final int original) { | |
int tmp = original / 2; | |
if (tmp % 10 == 0) { | |
return tmp; | |
} | |
return tmp + (10 - tmp % 10); | |
} | |
List<Paseenger> createPassengers(final String str) { | |
List<String> tmp = Arrays.asList(str.split(",")); | |
List<Paseenger> result = new ArrayList<>(); | |
for (String each : tmp) { | |
result.add(new Paseenger(each)); | |
} | |
return result; | |
} | |
public void pushPassenger(final Adult age, final Paseenger p) { | |
adults.add(p); | |
} | |
public void pushPassenger(final Child age, final Paseenger p) { | |
children.add(p); | |
} | |
public void pushPassenger(final Normal kind, final Paseenger p) { | |
infantNormal.add(p); | |
} | |
public void pushPassenger(final Pass kind, final Paseenger p) { | |
infantPass.add(p); | |
} | |
public void pushPassenger(final Welfare kind, final Paseenger p) { | |
infantWelfare.add(p); | |
} | |
public String solve(final String input) { | |
int base = Integer.valueOf(input.split(":")[0]); | |
List<Paseenger> passengers = createPassengers(input.split(":")[1]); | |
for (Paseenger each : passengers) { | |
each.lineUp(this); | |
} | |
int freeLimit = adults.size() * 2; | |
freeLimit = discount(infantNormal, freeLimit); | |
discount(infantWelfare, freeLimit); | |
passengers.clear(); | |
passengers.addAll(adults); | |
passengers.addAll(children); | |
passengers.addAll(infantNormal); | |
passengers.addAll(infantPass); | |
passengers.addAll(infantWelfare); | |
int result = 0; | |
for (Paseenger each : passengers) { | |
result += each.getFee(base); | |
} | |
return String.valueOf(result); | |
} | |
private int discount(List<Paseenger> list, final int freeLimit) { | |
int result = freeLimit; | |
Iterator<Paseenger> iterator = list.iterator(); | |
while (iterator.hasNext()) { | |
iterator.next(); | |
if (0 < result) { | |
iterator.remove(); | |
result--; | |
} | |
} | |
return result; | |
} | |
private void test(final String input, final String expected) { | |
Busfee bf = new Busfee(); | |
assertEquals(expected, bf.solve(input)); | |
} | |
@Test | |
public void testBusfee() throws Exception { | |
/* 0 */test("210:Cn,In,Iw,Ap,Iw", "170"); | |
/* 1 */test("220:Cp,In", "110"); | |
/* 2 */test("230:Cw,In,Iw", "240"); | |
/* 3 */test("240:In,An,In", "240"); | |
/* 4 */test("250:In,In,Aw,In", "260"); | |
/* 5 */test("260:In,In,In,In,Ap", "260"); | |
/* 6 */test("270:In,An,In,In,Ip", "410"); | |
/* 7 */test("280:Aw,In,Iw,In", "210"); | |
/* 8 */test("200:An", "200"); | |
/* 9 */test("210:Iw", "60"); | |
/* 10 */test("220:Ap", "0"); | |
/* 11 */test("230:Cp", "0"); | |
/* 12 */test("240:Cw", "60"); | |
/* 13 */test("250:In", "130"); | |
/* 14 */test("260:Cn", "130"); | |
/* 15 */test("270:Ip", "0"); | |
/* 16 */test("280:Aw", "140"); | |
/* 17 */test("1480:In,An,In,In,In,Iw,Cp,Cw,In,Aw,In,In,Iw,Cn,Aw,Iw", | |
"5920"); | |
/* 18 */test("630:Aw,Cw,Iw,An,An", "1740"); | |
/* 19 */test("340:Cn,Cn,Ip,Ap", "340"); | |
/* 20 */test("240:Iw,Ap,In,Iw,Aw", "120"); | |
/* 21 */test("800:Cw,An,Cn,Aw,Ap", "1800"); | |
/* 22 */test("1210:An,Ip,In,Iw,An,Iw,Iw,An,Iw,Iw", "3630"); | |
/* 23 */test("530:An,Cw,Cw", "810"); | |
/* 24 */test("170:Aw,Iw,Ip", "90"); | |
/* 25 */test("150:In,Ip,Ip,Iw,In,Iw,Iw,In,An,Iw,Aw,Cw,Iw,Cw,An,Cp,Iw", | |
"580"); | |
/* 26 */test("420:Cn,Cw,Cp", "320"); | |
/* 27 */test("690:Cw,In,An,Cp,Cn,In", "1220"); | |
/* 28 */test("590:Iw,Iw,Cn,Iw,Aw,In,In,Ip,Iw,Ip,Aw", "1200"); | |
/* 29 */test("790:Cw,Cn,Cn", "1000"); | |
/* 30 */test("1220:In,In,An,An,In,Iw,Iw,In,In,Ip,In,An,Iw", "4590"); | |
/* 31 */test("570:Cw,Cn,Cp", "440"); | |
/* 32 */test("310:Cn,Cw,An,An,Iw,Cp,Cw,Cn,Iw", "1100"); | |
/* 33 */test("910:Aw,In,Iw,Iw,Iw,Iw,Iw,An,Cw,In", "2290"); | |
/* 34 */test("460:Iw,Cw,Cw,Cn", "590"); | |
/* 35 */test("240:Iw,Iw,In,Iw,In,In,Cn,In,An", "780"); | |
/* 36 */test("1240:In,In,In,Ap,In,Cw,Iw,Iw,Iw,Aw,Cw", "2170"); | |
/* 37 */test( | |
"1000:Iw,Ip,In,An,In,In,In,An,In,Iw,In,In,Iw,In,Iw,Iw,Iw,An", | |
"5500"); | |
/* 38 */test("180:In,Aw,Ip,Iw,In,Aw,In,Iw,Iw,In", "330"); | |
/* 39 */test("440:In,Ip,Cp,Aw,Iw,In,An", "660"); | |
/* 40 */test("1270:Ap,In,An,Ip,In,Ip,Ip", "1270"); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment