test3完成小学、初中基础题型产生的解耦以及初中强制加入高级运算符的解耦

pull/1/head
杨博文 1 week ago
parent b588aba198
commit 32110cc5eb

@ -1,13 +1,16 @@
package mathpuzzle.service; package mathpuzzle.service;
import java.util.*; import java.util.*;
import static mathpuzzle.service.PrimarySchoolGenerator.isNumeric;
/** /**
* *
* *
*/ */
public class JuniorHighGenerator implements QuestionGenerator { public class JuniorHighGenerator implements QuestionGenerator {
private static final String[] ADVANCED_OPS = {"平方", "开根号"}; private static final String[] ADVANCED_OPS = {"平方", "开根号"};
private Random random = new Random(); private static final String[] OPERATORS = {"+", "-", "*", "/"};
private final Random random = new Random();
@Override @Override
public List<String> generateQuestions(int count) { public List<String> generateQuestions(int count) {
@ -20,26 +23,85 @@ public class JuniorHighGenerator implements QuestionGenerator {
} }
private String generateSingleQuestion() { private String generateSingleQuestion() {
StringBuilder sb = new StringBuilder(); List<String> parts = new ArrayList<>();
int baseNum = random.nextInt(100) + 1; int operandCount = random.nextInt(4) + 2;
sb.append(baseNum);
parts = generateBase(operandCount, parts);
// 检测一下下面的循环是否加入了高级运算符,如果没有就启动保底
boolean hasAdvancedOp = false;
if (operandCount > 2 && random.nextBoolean()) {
// 遍历查找左括号的合理位置
for(int i = 0; i < parts.size() - 2; i++) {
// 该位置要为操作数且随机添加括号
if (isNumeric(parts.get(i)) && random.nextBoolean()) {
// 随机数看取出来的是不是开根号运算符
if("开根号".equals(ADVANCED_OPS[random.nextInt(ADVANCED_OPS.length)])) {
if(random.nextBoolean()) {
parts.set(i, "开根号(" + parts.get(i) + ")");
}
else {
parts.set(i, "开根号(" + parts.get(i));
// 为避免随机数上限出现0此处要单独判断一下左括号正好括住倒数第二个操作数的情况
if (i == parts.size() - 3) {
parts.set(parts.size() - 1, parts.get(parts.size() - 1) + ")");
} else {
while(true) {
int i2 = random.nextInt(parts.size() - 3 - i) + 2;
if(isNumeric(parts.get(i + i2))) {
parts.set(i + i2, parts.get(i + i2) + ")");
break;
}
}
}
}
}
// 如果不是开根号就是平方运算
else {
parts.set(i, "(" + parts.get(i));
// 为避免随机数上限出现0此处要单独判断一下左括号正好括住倒数第二个操作数的情况
if (i == parts.size() - 3) {
parts.set(parts.size() - 1, parts.get(parts.size() - 1) + ")");
} else {
while(true) {
int i2 = random.nextInt(parts.size() - 3 - i) + 2;
if(isNumeric(parts.get(i + i2))) {
parts.set(i + i2, parts.get(i + i2) + ")平方");
break;
}
}
}
}
hasAdvancedOp = true;
break;
}
}
}
// 强制加入一个高级运算符 // 强制加入一个高级运算符
if(!hasAdvancedOp) {
parts = forceAddAdvancedOp(parts);
}
return String.join(" ", parts) + " =";
}
// 产生基本操作
public List<String> generateBase(int operandCount, List<String> parts) {
for (int i = 0; i < operandCount; i++) {
int num = random.nextInt(100) + 1;
parts.add(String.valueOf(num));
if (i < operandCount - 1) {
parts.add(OPERATORS[random.nextInt(OPERATORS.length)]);
}
}
return parts;
}
// 强制加入一个高级运算符
public List<String> forceAddAdvancedOp(List<String> parts) {
String advancedOp = ADVANCED_OPS[random.nextInt(ADVANCED_OPS.length)]; String advancedOp = ADVANCED_OPS[random.nextInt(ADVANCED_OPS.length)];
if ("平方".equals(advancedOp)) { if ("平方".equals(advancedOp)) {
sb.append(" ").append(advancedOp); parts.add("平方");
} else { // 开根号 } else { // 开根号
sb.insert(0, advancedOp + "(").append(")"); parts.set(0, "开根号(" + parts.get(0));
} parts.set(parts.size() - 1, parts.get(parts.size() - 1) + ")" );
// 可能再附加一个基础运算
if (random.nextBoolean()) {
String[] basicOps = {"+", "-", "*", "/"};
String op = basicOps[random.nextInt(basicOps.length)];
int anotherNum = random.nextInt(100) + 1;
sb.append(" ").append(op).append(" ").append(anotherNum);
} }
return parts;
return sb.toString() + " =";
} }
} }

@ -7,7 +7,7 @@ import java.util.*;
*/ */
public class PrimarySchoolGenerator implements QuestionGenerator { public class PrimarySchoolGenerator implements QuestionGenerator {
private static final String[] OPERATORS = {"+", "-", "*", "/"}; private static final String[] OPERATORS = {"+", "-", "*", "/"};
private Random random = new Random(); private final Random random = new Random();
@Override @Override
public List<String> generateQuestions(int count) { public List<String> generateQuestions(int count) {
@ -21,15 +21,8 @@ public class PrimarySchoolGenerator implements QuestionGenerator {
private String generateSingleQuestion() { private String generateSingleQuestion() {
int operandCount = random.nextInt(4) + 2; // 2-5个操作数 int operandCount = random.nextInt(4) + 2; // 2-5个操作数
List<String> parts = new ArrayList<>(); List<String> parts = new ArrayList<>();
// 生成基础操作
for (int i = 0; i < operandCount; i++) { parts = generateBase(operandCount, parts);
int num = random.nextInt(100) + 1;
parts.add(String.valueOf(num));
if (i < operandCount - 1) {
parts.add(OPERATORS[random.nextInt(OPERATORS.length)]);
}
}
// 简单添加括号逻辑:随机加一个括号 // 简单添加括号逻辑:随机加一个括号
if (operandCount > 2 && random.nextBoolean()) { if (operandCount > 2 && random.nextBoolean()) {
// 遍历查找左括号的合理位置 // 遍历查找左括号的合理位置
@ -67,4 +60,15 @@ public class PrimarySchoolGenerator implements QuestionGenerator {
return false; return false;
} }
} }
public List<String> generateBase(int operandCount, List<String> parts) {
for (int i = 0; i < operandCount; i++) {
int num = random.nextInt(100) + 1;
parts.add(String.valueOf(num));
if (i < operandCount - 1) {
parts.add(OPERATORS[random.nextInt(OPERATORS.length)]);
}
}
return parts;
}
} }
Loading…
Cancel
Save