You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.3 KiB
65 lines
2.3 KiB
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 "?";
|
|
}
|
|
}
|
|
} |