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.");
}
}
}