package bank.ocr; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.google.common.base.Function; import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; public class BankOCR { private final static Map<List<String>, Integer> dictionary = new HashMap<List<String>, Integer>(10){{ put(digit( " ", " |", " |", " "), 1); put(digit( " _ ", " _|", "|_ ", " "), 2); put(digit( " _ ", " _|", " _|", " "), 3); put(digit( " ", "|_|", " |", " "), 4); put(digit( " _ ", "|_ ", " _|", " "), 5); put(digit( " _ ", "|_ ", "|_|", " "), 6); put(digit( " _ ", " |", " |", " "), 7); put(digit( " _ ", "|_|", "|_|", " "), 8); put(digit( " _ ", "|_|", " _|", " "), 9); }} ; public static final int DIGIT_WIDTH = 3; private static List<String> digit(String... digitLines) { return Lists.newArrayList(digitLines); } public static int parse(String lcdText) { return parseDigits(split(lcdText)); } private static Integer parseDigits(List<List<String>> lcdText) { int res = 0; for (List<String> strings : lcdText) { res = res * 10 + parseDigit(strings); } return res; } private static Integer parseDigit(List<String> lcdText) { return dictionary.get(lcdText); } private static List<List<String>> split(String lcdText) { List<List<String>> res = new ArrayList<>(); final String[] lines = lcdText.split("\n"); final FluentIterable<String> block = FluentIterable.from(Lists.newArrayList(lines)); final String aLine = block.first().get(); final int digitCount = aLine.length() / DIGIT_WIDTH; for (int j = 0; j < digitCount; j++) { res.add(extractDigit(j, block)); } return res; } private static ImmutableList<String> extractDigit(int digitIndex, FluentIterable<String> lines) { final int digitPos = digitIndex * DIGIT_WIDTH; return lines.transform(new Function<String, String>() { @Override public String apply(String line) { return line.substring(digitPos, digitPos + DIGIT_WIDTH); } }).toList(); } }