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.

44 lines
1.6 KiB

import java.util.List;
import java.util.Random;
/**
* 生成高中题目
*/
public class SeniorProblem implements ProblemsGenerator {
private static final Random RANDOM = new Random();
private final BracketManager bracketManager = new BracketManager();
private final PowerManager powerManager = new PowerManager();
private final TrigManager trigManager = new TrigManager();
private final ExpressionBuilder expressionBuilder = new ExpressionBuilder();
@Override
public String generate() {
String expression;
boolean hasTrig;
do {
int numCount = RANDOM.nextInt(5) + 1;
expression = expressionBuilder.generateBasicExpression(numCount);
List<Integer> numPositions = expressionBuilder.getNumberPositions(expression);
if (RANDOM.nextDouble() < 0.8) {
int pairs = bracketManager.decideParenthesesPairs(numCount);
if (pairs > 0) {
expression = bracketManager.addParentheses(expression, pairs, numPositions);
}
}
// 添加三角函数并检查是否存在
expression = trigManager.addTrigOperations(expression, numPositions);
List<Integer> trigPositions = expressionBuilder.getNumberPositions(expression);
hasTrig = expression.contains("sin") || expression.contains("cos") || expression.contains("tan");
// 40% 概率加幂运算,避免与 trig 重叠
if (RANDOM.nextDouble() < 0.4) {
expression = powerManager.addPowerOperationsAvoid(expression, numPositions, trigPositions);
}
} while (expressionBuilder.hasDivideByZero(expression) || !hasTrig);
return expression;
}
}