parent
28b0d64598
commit
44062e673a
@ -1,107 +1,43 @@
|
|||||||
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成高中题目
|
||||||
|
*/
|
||||||
public class SeniorProblem implements ProblemsGenerator {
|
public class SeniorProblem implements ProblemsGenerator {
|
||||||
private static final Random RANDOM = new Random();
|
private static final Random RANDOM = new Random();
|
||||||
private static final String[] OPERATORS = {"+", "-", "*", "/"};
|
private final BracketManager bracketManager = new BracketManager();
|
||||||
private static final String[] POW_OPERATORS = {"√", "^2"};
|
private final PowerManager powerManager = new PowerManager();
|
||||||
private static final String[] TRIG_OPERATORS = {"sin", "cos", "tan"};
|
private final TrigManager trigManager = new TrigManager();
|
||||||
|
private final ExpressionBuilder expressionBuilder = new ExpressionBuilder();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String generate() {
|
public String generate() {
|
||||||
String primaryExpression = generatePrimaryExpression();
|
String expression;
|
||||||
|
boolean hasTrig;
|
||||||
return addHighSchoolOperators(primaryExpression);
|
do {
|
||||||
}
|
int numCount = RANDOM.nextInt(5) + 1;
|
||||||
|
expression = expressionBuilder.generateBasicExpression(numCount);
|
||||||
private String generatePrimaryExpression() {
|
List<Integer> numPositions = expressionBuilder.getNumberPositions(expression);
|
||||||
int count = RANDOM.nextInt(4) + 2;
|
|
||||||
StringBuilder sb = new StringBuilder();
|
if (RANDOM.nextDouble() < 0.8) {
|
||||||
|
int pairs = bracketManager.decideParenthesesPairs(numCount);
|
||||||
for (int i = 0; i < count; i++) {
|
if (pairs > 0) {
|
||||||
int num = RANDOM.nextInt(100) + 1;
|
expression = bracketManager.addParentheses(expression, pairs, numPositions);
|
||||||
sb.append(num);
|
|
||||||
if (i < count - 1) {
|
|
||||||
sb.append(" ").append(OPERATORS[RANDOM.nextInt(OPERATORS.length)]).append(" ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private String addHighSchoolOperators(String primaryExpression) {
|
|
||||||
String[] parts = primaryExpression.split(" ");
|
|
||||||
StringBuilder result = new StringBuilder();
|
|
||||||
boolean hasTrigonometry = false;
|
|
||||||
boolean hasAlgebra = false;
|
|
||||||
|
|
||||||
for (int i = 0; i < parts.length; i++) {
|
|
||||||
String part = parts[i];
|
|
||||||
|
|
||||||
if (isNumber(part)) {
|
|
||||||
if (!hasTrigonometry || RANDOM.nextDouble() < 0.6) {
|
|
||||||
part = applyTrigOperator(part);
|
|
||||||
hasTrigonometry = true;
|
|
||||||
}
|
}
|
||||||
else if (RANDOM.nextDouble() < 0.3) {
|
|
||||||
part = applyAlgebraOperator(part);
|
|
||||||
hasAlgebra = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result.append(part);
|
|
||||||
if (i < parts.length - 1) {
|
|
||||||
result.append(" ");
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (!hasTrigonometry) {
|
|
||||||
return addTrigonometryForced(result.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isNumber(String str) {
|
|
||||||
try {
|
|
||||||
Integer.parseInt(str);
|
|
||||||
return true;
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String applyTrigOperator(String number) {
|
|
||||||
String operator = TRIG_OPERATORS[RANDOM.nextInt(TRIG_OPERATORS.length)];
|
|
||||||
int num = Integer.parseInt(number);
|
|
||||||
int angle = generateValidAngle(operator);
|
|
||||||
return operator + angle + "°";
|
|
||||||
}
|
|
||||||
|
|
||||||
private String applyAlgebraOperator(String number) {
|
|
||||||
String operator = POW_OPERATORS[RANDOM.nextInt(POW_OPERATORS.length)];
|
|
||||||
int num = Integer.parseInt(number);
|
|
||||||
return operator.equals("√") ? "√" + num : num + "^2";
|
|
||||||
}
|
|
||||||
|
|
||||||
private int generateValidAngle(String trigOp) {
|
|
||||||
int angle = RANDOM.nextInt(100) + 1;
|
|
||||||
if (trigOp.equals("tan")) {
|
|
||||||
while (angle == 90) {
|
|
||||||
angle = RANDOM.nextInt(100) + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return angle;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String addTrigonometryForced(String expression) {
|
// 添加三角函数并检查是否存在
|
||||||
String[] parts = expression.split(" ");
|
expression = trigManager.addTrigOperations(expression, numPositions);
|
||||||
|
List<Integer> trigPositions = expressionBuilder.getNumberPositions(expression);
|
||||||
|
hasTrig = expression.contains("sin") || expression.contains("cos") || expression.contains("tan");
|
||||||
|
|
||||||
for (int i = 0; i < parts.length; i++) {
|
// 40% 概率加幂运算,避免与 trig 重叠
|
||||||
if (isNumber(parts[i])) {
|
if (RANDOM.nextDouble() < 0.4) {
|
||||||
parts[i] = applyTrigOperator(parts[i]);
|
expression = powerManager.addPowerOperationsAvoid(expression, numPositions, trigPositions);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
} while (expressionBuilder.hasDivideByZero(expression) || !hasTrig);
|
||||||
|
|
||||||
return String.join(" ", parts);
|
return expression;
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in new issue