From 1b3ae88cf4890817654676dbd6f3d8c9f52e7327 Mon Sep 17 00:00:00 2001 From: hnu202326010305 <1405671544@qq.com> Date: Sat, 27 Sep 2025 03:10:26 +0800 Subject: [PATCH] Update SeniorProblem.java --- src/SeniorProblem.java | 126 ++++++++++++++++++++++++++++++++++------- 1 file changed, 106 insertions(+), 20 deletions(-) diff --git a/src/SeniorProblem.java b/src/SeniorProblem.java index a5675bf..72cae10 100644 --- a/src/SeniorProblem.java +++ b/src/SeniorProblem.java @@ -1,21 +1,107 @@ -import java.util.Random; - -public class SeniorProblem implements ProblemsGenerator{ - private static final Random RANDOM = new Random(); - private static final String[] FUNCS = {"sin", "cos", "tan"}; - - @Override - public String generate() { - int count = RANDOM.nextInt(5) + 1; // 1~5个数 - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < count; i++) { - int angle = RANDOM.nextInt(90) + 1; - String func = FUNCS[RANDOM.nextInt(FUNCS.length)]; - sb.append(func).append("(").append(angle).append("°)"); - if (i < count - 1) { - sb.append(" + "); - } - } - return sb.toString(); - } +import java.util.Random; + +public class SeniorProblem implements ProblemsGenerator { + private static final Random RANDOM = new Random(); + private static final String[] OPERATORS = {"+", "-", "*", "/"}; + private static final String[] POW_OPERATORS = {"√", "^2"}; + private static final String[] TRIG_OPERATORS = {"sin", "cos", "tan"}; + + @Override + public String generate() { + String primaryExpression = generatePrimaryExpression(); + + return addHighSchoolOperators(primaryExpression); + } + + private String generatePrimaryExpression() { + int count = RANDOM.nextInt(4) + 2; + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < count; i++) { + int num = RANDOM.nextInt(100) + 1; + 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(" "); + + for (int i = 0; i < parts.length; i++) { + if (isNumber(parts[i])) { + parts[i] = applyTrigOperator(parts[i]); + break; + } + } + + return String.join(" ", parts); + } } \ No newline at end of file