「第8回 オフラインリアルタイムどう書く」参考問題: 腕力解答(Java)
次回のどう書くの参考問題を解きました。
今回は、パースです!
- エントロピー符号 横へな 2013.3.1 の参考問題 http://nabetani.sakura.ne.jp/hena/ord8entco/
ひー、パース苦手。ひー。
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); } }
- 上のコードと、テストコード https://gist.github.com/torazuka/4987962
ケタ数の長いトークンから順にマッチして、ビンゴなら次へ行く戦略です。当たり前か。
- Stringを使わなくてもいいはず(最初0bでやろうとして、途中で諦めてしまった)
- 利用ケタ数の保持用のフィールドを作る等、形振り構わない感じに…
あとで反省する。