package question; import java.util.Random; public class PrimaryQuestionGenerator implements QuestionGenerator { private static final Random random = new Random(); @Override public Question generateQuestion() { int numOperands = random.nextInt(5) + 1; StringBuilder sb = new StringBuilder(); int currentValue = random.nextInt(100) + 1; sb.append(currentValue); for (int i = 1; i < numOperands; i++) { String[] ops = {"+", "-", "*", "/"}; String op; int nextVal; do { op = ops[random.nextInt(ops.length)]; nextVal = random.nextInt(100) + 1; } while ((op.equals("-") && currentValue < nextVal) || (op.equals("/") && (nextVal == 0 || currentValue % nextVal != 0))); sb.append(" ").append(op).append(" ").append(nextVal); switch (op) { case "+": currentValue += nextVal; break; case "-": currentValue -= nextVal; break; case "*": currentValue *= nextVal; break; case "/": currentValue /= nextVal; break; } } String expr = addParentheses(sb.toString()); return new Question(expr, evaluate(expr)); } private String addParentheses(String expr) { String[] tokens = expr.split(" "); if (tokens.length < 3) return expr; int start = random.nextInt(tokens.length / 2) * 2; int end = start + 2 + random.nextInt((tokens.length - start) / 2) * 2; end = Math.min(end, tokens.length - 1); StringBuilder newExpr = new StringBuilder(); for (int i = 0; i < tokens.length; i++) { if (i == start) newExpr.append("("); newExpr.append(tokens[i]); if (i == end) newExpr.append(")"); if (i != tokens.length - 1) newExpr.append(" "); } return newExpr.toString(); } private String evaluate(String expr) { try { javax.script.ScriptEngineManager mgr = new javax.script.ScriptEngineManager(); javax.script.ScriptEngine engine = mgr.getEngineByName("JavaScript"); return String.valueOf(engine.eval(expr)); } catch (Exception e) { return "?"; } } }