| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
-
- final class WordProblemSolver {
-
- private static final String INTEGER_REGEX_STRING = "(-?\\d+)";
-
- private static final String BINARY_OPERATION_REGEX_STRING = "(plus|minus|multiplied by|divided by)";
-
- private static final String VALID_QUESTION_REGEX_STRING =
- "^What is " + INTEGER_REGEX_STRING +
- "( " + BINARY_OPERATION_REGEX_STRING + " " + INTEGER_REGEX_STRING + ")+" +
- "\\?$";
-
- int solve(final String wordProblem) {
- if (!wordProblem.matches(VALID_QUESTION_REGEX_STRING)) {
- throw new IllegalArgumentException("I'm sorry, I don't understand the question!");
- }
-
- final Matcher initialValueMatcher = Pattern.compile(INTEGER_REGEX_STRING).matcher(wordProblem);
-
- initialValueMatcher.find();
- int result = Integer.parseInt(initialValueMatcher.group());
-
- final Matcher operationAndValueMatcher
- = Pattern.compile(BINARY_OPERATION_REGEX_STRING + " " + INTEGER_REGEX_STRING).matcher(wordProblem);
-
- while (operationAndValueMatcher.find()) {
- result = applyBinaryOperation(
- result,
- operationAndValueMatcher.group(1),
- Integer.parseInt(operationAndValueMatcher.group(2)));
- }
-
- return result;
- }
-
- private int applyBinaryOperation(
- final int firstValue,
- final String operationDescription,
- final int secondValue) {
-
- switch (operationDescription) {
- case "plus":
- return firstValue + secondValue;
- case "minus":
- return firstValue - secondValue;
- case "multiplied by":
- return firstValue * secondValue;
- case "divided by":
- return firstValue / secondValue;
- default:
- throw new IllegalArgumentException("This branch should never be executed.");
- }
- }
-
- }
|