「第8回 オフラインリアルタイムどう書く」参考問題: 腕力解答(Java)

次回のどう書くの参考問題を解きました。

今回は、パースです!

ひー、パース苦手。ひー。

1時間半もかかった上に、地獄のように汚くなってしまいました。

import java.util.EnumSet;

enum Token {
	c("0101101"), l("010111"), d("01010"), s("0010"), n("0011"), o("0110"), i(
			"0100"), a("0111"), r("1100"), h("1101"), t("000"), end("111"), e(
			"10");
	private String str;

	private Token(String s) {
		str = s;
	}

	String getStr() {
		return str;
	}
}

public class Entco {

	private int use;

	protected String match(String str, int cur) {
		StringBuilder result = new StringBuilder();
		EnumSet<Token> allOf = EnumSet.allOf(Token.class);
		Token tmp = null;
		for (Token each : allOf) {
			if (cur + each.getStr().length() < str.length() + 1) {
				if (each.getStr().equals(
						str.substring(cur, cur + each.getStr().length()))) {
					tmp = each;
					use += tmp.getStr().length();
					if (each.name().equals("end")) {
						return new String(result);
					} else {
						result.append(each.name());
					}
					break;
				}
			}
		}
		if (tmp == null) {
			throw new IllegalArgumentException();
		}

		if (cur < str.length() && tmp.name().equals("end") == false) {
			result.append(match(str, cur + tmp.getStr().length()));
		}
		return new String(result);
	}

	protected String solve(String input) {
		char[] charArray = input.toCharArray();
		StringBuilder sb = new StringBuilder();
		for (char c : charArray) {
			byte bt = Byte.parseByte(String.valueOf(c), 16);
			String str = Integer.toString(bt, 2);
			StringBuilder tmp = new StringBuilder();
			for (int i = 1; i < str.length() + 1; i++) {
				tmp.append(str.charAt(str.length() - i));
			}
			if (tmp.length() < 4) {
				for (int i = tmp.length(); i < 4; i++) {
					tmp.append('0');
				}
			}
			sb.append(tmp);
		}

		StringBuilder result = new StringBuilder();
		try {
			result.append(match(new String(sb), 0));
		} catch (IllegalArgumentException e) {
			return "*invalid*";
		}
		result.append(":");
		result.append(use);
		return new String(result);
	}
}

ケタ数の長いトークンから順にマッチして、ビンゴなら次へ行く戦略です。当たり前か。

  • Stringを使わなくてもいいはず(最初0bでやろうとして、途中で諦めてしまった)
  • 利用ケタ数の保持用のフィールドを作る等、形振り構わない感じに…

あとで反省する。