Merge pull request '2' (#2) from develop into main
commit
5a12fbe74b
@ -1,34 +1,32 @@
|
|||||||
import java.io.FileWriter;
|
import java.io.FileWriter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
|
|
||||||
public class Generator {
|
public class Generator {
|
||||||
public static void generate(Users users, int count, ProblemsGenerator problemsGenerator) {
|
public static void generate(Users users, int count, ProblemsGenerator problemsGenerator) {
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
for (int i = 1; i <= count; i++) {
|
for (int i = 1; i <= count; i++) {
|
||||||
builder.append(i).append(". ").append(problemsGenerator.generate()).append("\n\n");
|
builder.append(i).append(". ").append(problemsGenerator.generate()).append("\n\n");
|
||||||
}
|
}
|
||||||
save(users, builder.toString());
|
save(users, builder.toString());
|
||||||
System.out.println("题目生成完成。");
|
System.out.println("题目生成完成。");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void save(Users users, String content) {
|
private static void save(Users users, String content) {
|
||||||
try {
|
try {
|
||||||
String folder = "doc/" + users.getType();
|
String folder = "doc/" + users.getName();
|
||||||
java.io.File dir = new java.io.File(folder);
|
java.io.File dir = new java.io.File(folder);
|
||||||
if (!dir.exists()) {
|
if (!dir.exists()) {
|
||||||
dir.mkdirs();
|
dir.mkdirs();
|
||||||
}
|
}
|
||||||
String filename = LocalDateTime.now()
|
String filename = LocalDateTime.now()
|
||||||
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss")) + ".txt";
|
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss")) + ".txt";
|
||||||
FileWriter writer = new FileWriter(folder + "/" + filename);
|
FileWriter writer = new FileWriter(folder + "/" + filename);
|
||||||
writer.write(content);
|
writer.write(content);
|
||||||
writer.close();
|
writer.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
System.out.println("保存失败:" + e.getMessage());
|
System.out.println("保存失败:" + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,23 +1,51 @@
|
|||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public class JuniorProblem implements ProblemsGenerator{
|
public class JuniorProblem implements ProblemsGenerator {
|
||||||
private static final Random RANDOM = new Random();
|
private static final Random RANDOM = new Random();
|
||||||
|
private static final String[] OPERATORS = {"+", "-", "*", "/"};
|
||||||
@Override
|
private static final String[] POW_OPERATORS = {"√", "^2"};
|
||||||
public String generate() {
|
|
||||||
int count = RANDOM.nextInt(5) + 1; // 1~5个数
|
@Override
|
||||||
StringBuilder sb = new StringBuilder();
|
public String generate() {
|
||||||
for (int i = 0; i < count; i++) {
|
String primaryExpr = generatePrimaryExpression();
|
||||||
int num = RANDOM.nextInt(20) + 1;
|
return addPowerOperators(primaryExpr);
|
||||||
if (RANDOM.nextBoolean()) {
|
}
|
||||||
sb.append(num).append("^2");
|
|
||||||
} else {
|
private String generatePrimaryExpression() {
|
||||||
sb.append("√").append(num);
|
int count = RANDOM.nextInt(4) + 2;
|
||||||
}
|
StringBuilder sb = new StringBuilder();
|
||||||
if (i < count - 1) {
|
|
||||||
sb.append(" + ");
|
for (int i = 0; i < count; i++) {
|
||||||
}
|
sb.append(RANDOM.nextInt(100) + 1);
|
||||||
}
|
if (i < count - 1) {
|
||||||
return sb.toString();
|
sb.append(" ").append(OPERATORS[RANDOM.nextInt(OPERATORS.length)]).append(" ");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String addPowerOperators(String expr) {
|
||||||
|
String[] parts = expr.split(" ");
|
||||||
|
boolean hasPower = false;
|
||||||
|
|
||||||
|
for (int i = 0; i < parts.length; i++) {
|
||||||
|
if (parts[i].matches("\\d+") && (!hasPower || RANDOM.nextBoolean())) {
|
||||||
|
String op = POW_OPERATORS[RANDOM.nextInt(POW_OPERATORS.length)];
|
||||||
|
parts[i] = op.equals("√") ? "√" + parts[i] : parts[i] + "^2";
|
||||||
|
hasPower = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasPower) {
|
||||||
|
for (int i = 0; i < parts.length; i++) {
|
||||||
|
if (parts[i].matches("\\d+")) {
|
||||||
|
String op = POW_OPERATORS[RANDOM.nextInt(POW_OPERATORS.length)];
|
||||||
|
parts[i] = op.equals("√") ? "√" + parts[i] : parts[i] + "^2";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return String.join(" ", parts);
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,20 +1,44 @@
|
|||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public class PrimaryProblem implements ProblemsGenerator {
|
public class PrimaryProblem implements ProblemsGenerator {
|
||||||
private static final Random RANDOM = new Random();
|
private static final Random RANDOM = new Random();
|
||||||
private static final char[] OPS = {'+', '-', '*', '/'};
|
private static final String[] OPERATORS = {"+", "-", "*", "/"};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String generate() {
|
public String generate() {
|
||||||
int count = RANDOM.nextInt(5) + 1; // 1~5个数
|
int count = RANDOM.nextInt(4) + 2;
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
for (int i = 0; i < count; i++) {
|
|
||||||
int num = RANDOM.nextInt(100) + 1;
|
boolean addParentheses = count >= 3 && RANDOM.nextDouble() < 0.5;
|
||||||
sb.append(num);
|
if (addParentheses) {
|
||||||
if (i < count - 1) {
|
int parenCount = RANDOM.nextInt(count - 2) + 2;
|
||||||
sb.append(" ").append(OPS[RANDOM.nextInt(OPS.length)]).append(" ");
|
int startPos = RANDOM.nextInt(count - parenCount + 1);
|
||||||
}
|
|
||||||
}
|
for (int i = 0; i < count; i++) {
|
||||||
return sb.toString();
|
if (i == startPos) {
|
||||||
}
|
sb.append("( ");
|
||||||
|
}
|
||||||
|
|
||||||
|
int num = RANDOM.nextInt(100) + 1;
|
||||||
|
sb.append(num);
|
||||||
|
|
||||||
|
if (i == startPos + parenCount - 1) {
|
||||||
|
sb.append(" )");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < count - 1) {
|
||||||
|
sb.append(" ").append(OPERATORS[RANDOM.nextInt(OPERATORS.length)]).append(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,21 +1,107 @@
|
|||||||
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[] FUNCS = {"sin", "cos", "tan"};
|
private static final String[] OPERATORS = {"+", "-", "*", "/"};
|
||||||
|
private static final String[] POW_OPERATORS = {"√", "^2"};
|
||||||
@Override
|
private static final String[] TRIG_OPERATORS = {"sin", "cos", "tan"};
|
||||||
public String generate() {
|
|
||||||
int count = RANDOM.nextInt(5) + 1; // 1~5个数
|
@Override
|
||||||
StringBuilder sb = new StringBuilder();
|
public String generate() {
|
||||||
for (int i = 0; i < count; i++) {
|
String primaryExpression = generatePrimaryExpression();
|
||||||
int angle = RANDOM.nextInt(90) + 1;
|
|
||||||
String func = FUNCS[RANDOM.nextInt(FUNCS.length)];
|
return addHighSchoolOperators(primaryExpression);
|
||||||
sb.append(func).append("(").append(angle).append("°)");
|
}
|
||||||
if (i < count - 1) {
|
|
||||||
sb.append(" + ");
|
private String generatePrimaryExpression() {
|
||||||
}
|
int count = RANDOM.nextInt(4) + 2;
|
||||||
}
|
StringBuilder sb = new StringBuilder();
|
||||||
return sb.toString();
|
|
||||||
}
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in new issue