Skip to content

Instantly share code, notes, and snippets.

@torazuka
Created April 7, 2013 04:17
Show Gist options
  • Save torazuka/5328992 to your computer and use it in GitHub Desktop.
Save torazuka/5328992 to your computer and use it in GitHub Desktop.
第9回オフラインリアルタイムどう書く(Java解答)の別解
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