From a0aff7afd5c7b5ff4b48b16c25d471543e29eeda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=8B=E5=A5=87=E5=B3=B0?= Date: Sat, 27 Sep 2025 14:43:41 +0800 Subject: [PATCH] commit --- doc/MathPaperGenerator.jar | Bin 16531 -> 16641 bytes doc/README.md | 1 + ...§æ¨¡åž‹åŽäººå·¥ä¿®æ”¹ä»£ç ä¸€è§ˆè¡¨.docx | Bin 0 -> 29298 bytes src/Create.java | 2 +- src/Generator.java | 312 +++++++++--------- src/QuestionGenerator.java | 46 +++ 6 files changed, 201 insertions(+), 160 deletions(-) create mode 100644 doc/宋奇峰个人项目使用大模型åŽäººå·¥ä¿®æ”¹ä»£ç ä¸€è§ˆè¡¨.docx create mode 100644 src/QuestionGenerator.java diff --git a/doc/MathPaperGenerator.jar b/doc/MathPaperGenerator.jar index 066e36fcefde968129c47c484f1dd931aca86a7d..8dd6d55bd0c301072231c947caa8f757222e70c0 100644 GIT binary patch delta 5663 zcmZ`-1ys~u(_WVDkd&1UX%^{PK$;~4q&tMAyK(961xZOsNu|4UDQQ8Fl#)~g2|swh z^8cRin{&@^&iwA3b7t;5bI+Lv5sVTXf`X@^f{KO%0AK+C-#n7>*nsz6p%mb{N8Q*7 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 literal 0 HcmV?d00001 diff --git a/src/Create.java b/src/Create.java index 18b921d..1cdb695 100644 --- a/src/Create.java +++ b/src/Create.java @@ -4,7 +4,7 @@ public class Create { public static void create(int n,Login.Level currentLevel,Login.Account user) { List existing = LoadFile.loadExistingQuestions(user.username); - Generator.QuestionGenerator qg = new Generator.QuestionGenerator(currentLevel, existing); + Generator qg = new Generator(currentLevel, existing); List paper = qg.generatePaper(n); if (paper.isEmpty()) { System.out.println("未能生æˆé¢˜ç›®ï¼ˆå¯èƒ½å› åŽ»é‡çº¦æŸå¯¼è‡´ï¼‰ã€‚"); diff --git a/src/Generator.java b/src/Generator.java index d9dfdce..00d3cee 100644 --- a/src/Generator.java +++ b/src/Generator.java @@ -1,196 +1,190 @@ -import java.util.Random; -import java.util.Set; -import java.util.LinkedHashSet; -import java.util.List; import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Random; +import java.util.Set; import java.util.stream.Collectors; /** * 工具类:负责生æˆä¸åŒéš¾åº¦çš„æ•°å­¦é¢˜ç›®ã€‚ */ -public class Generator { - - private static final Random RAND = new Random(); - private static final int MAX_ATTEMPTS = 2000; - - /** - * 内部类:按用户难度等级生æˆé¢˜ç›®ã€‚ - */ - static class QuestionGenerator { +public class Generator extends QuestionGenerator { - private final Login.Level level; - private final Set existing; + public static final Random RAND = new Random(); + public static final int MAX_ATTEMPTS = 2000; - QuestionGenerator(Login.Level level, List existingQuestions) { - this.level = level; - this.existing = existingQuestions.stream().map(String::trim).collect(Collectors.toSet()); - } + public final Login.Level level; + public final Set existing; - /** - * 生æˆä¸€ä»½è¯•å·ã€‚ - * - * @param n 需è¦ç”Ÿæˆçš„é¢˜ç›®æ•°é‡ - * @return 生æˆçš„题目列表 - */ - List generatePaper(int n) { - Set generated = new LinkedHashSet<>(); - // 防止死循环 - int attempts = 0; - - while (generated.size() < n && attempts < MAX_ATTEMPTS) { - attempts++; - String q = generateOneQuestion(); - // 统一去掉题å·ä¸Žå¤šä½™ç©ºç™½æ¥æ¯”对 - String key = normalize(q); - //与文件内+本次å‰é¢ç”Ÿæˆçš„æŸ¥é‡ - if (!existing.contains(key) && !generated.contains(key)) { - generated.add(q); - } - } + Generator(Login.Level level, List existingQuestions) { + this.level = level; + this.existing = existingQuestions.stream().map(String::trim).collect(Collectors.toSet()); + } - if (generated.size() < n) { - System.out.println( - "注æ„:无法生æˆè¶³å¤Ÿçš„ä¸é‡å¤é¢˜ç›®ï¼Œå·²ç”Ÿæˆ " - + generated.size() + " é“题(请求 " + n + " é“)"); + /** + * 生æˆä¸€ä»½è¯•å·ã€‚ + * + * @param n 需è¦ç”Ÿæˆçš„é¢˜ç›®æ•°é‡ + * @return 生æˆçš„题目列表 + */ + public List generatePaper(int n) { + Set generated = new LinkedHashSet<>(); + // 防止死循环 + int attempts = 0; + + while (generated.size() < n && attempts < MAX_ATTEMPTS) { + attempts++; + String q = generateOneQuestion(); + // 统一去掉题å·ä¸Žå¤šä½™ç©ºç™½æ¥æ¯”对 + String key = normalize(q); + //与文件内+本次å‰é¢ç”Ÿæˆçš„æŸ¥é‡ + if (!existing.contains(key) && !generated.contains(key)) { + generated.add(q); } - return new ArrayList<>(generated); } - //去空格 - private String normalize(String s) { - return s.replaceAll("\\s+", "").toLowerCase(); + if (generated.size() < n) { + System.out.println( + "注æ„:无法生æˆè¶³å¤Ÿçš„ä¸é‡å¤é¢˜ç›®ï¼Œå·²ç”Ÿæˆ " + + generated.size() + " é“题(请求 " + n + " é“)"); } + return new ArrayList<>(generated); + } - // 生æˆå•题主逻辑 - private String generateOneQuestion() { - int operands = RAND.nextInt(5) + 1; // ä¿è¯ 1..5 个æ“作数 - int operands_p = RAND.nextInt(4) + 2; // ä¿è¯ 2..5 个æ“作数 - return switch (level) { - case PRIMARY -> genPrimary(operands_p); - case MIDDLE -> genMiddle(operands); - case HIGH -> genHigh(operands); - }; - } + //去空格 + public String normalize(String s) { + return s.replaceAll("\\s+", "").toLowerCase(); + } + + // 生æˆå•题主逻辑 + public String generateOneQuestion() { + int operands = RAND.nextInt(5) + 1; // ä¿è¯ 1..5 个æ“作数 + int operands_p = RAND.nextInt(4) + 2; // ä¿è¯ 2..5 个æ“作数 + return switch (level) { + case PRIMARY -> genPrimary(operands_p); + case MIDDLE -> genMiddle(operands); + case HIGH -> genHigh(operands); + }; + } - // 生æˆå°å­¦é¢˜ï¼ˆåªæœ‰ + - * / 和括å·ï¼‰ - private String genPrimary(int operands) { - if (operands == 1) { - return String.valueOf(randInt(1, 100)); + // 生æˆå°å­¦é¢˜ï¼ˆåªæœ‰ + - * / 和括å·ï¼‰ + public String genPrimary(int operands) { + if (operands == 1) { + return String.valueOf(randInt(1, 100)); + } + List ops = Arrays.asList("+", "-", "*", "/"); + StringBuilder sb = new StringBuilder(); + // éšæœºå†³å®šæ˜¯å¦ä½¿ç”¨æ‹¬å· + boolean useParens = RAND.nextBoolean(); + if (useParens && operands >= 3 && RAND.nextBoolean()) { + // 构造 (a op b) op c ... + sb.append("("); + sb.append(randInt(1, 100)).append(" ").append(randomChoice(ops)).append(" ") + .append(randInt(1, 100)); + sb.append(")"); + for (int i = 2; i < operands; i++) { + sb.append(" ").append(randomChoice(ops)).append(" ").append(randInt(1, 100)); } - List ops = Arrays.asList("+", "-", "*", "/"); - StringBuilder sb = new StringBuilder(); - // éšæœºå†³å®šæ˜¯å¦ä½¿ç”¨æ‹¬å· - boolean useParens = RAND.nextBoolean(); - if (useParens && operands >= 3 && RAND.nextBoolean()) { - // 构造 (a op b) op c ... - sb.append("("); - sb.append(randInt(1, 100)).append(" ").append(randomChoice(ops)).append(" ") - .append(randInt(1, 100)); - sb.append(")"); - for (int i = 2; i < operands; i++) { - sb.append(" ").append(randomChoice(ops)).append(" ").append(randInt(1, 100)); - } - } else { - // 直连 - sb.append(randInt(1, 100)); - for (int i = 1; i < operands; i++) { - sb.append(" ").append(randomChoice(ops)).append(" ").append(randInt(1, 100)); - } + } else { + // 直连 + sb.append(randInt(1, 100)); + for (int i = 1; i < operands; i++) { + sb.append(" ").append(randomChoice(ops)).append(" ").append(randInt(1, 100)); } - return sb.toString(); } + return sb.toString(); + } - // 生æˆåˆä¸­é¢˜ï¼šè‡³å°‘包å«ä¸€ä¸ª ^2 或 sqrt() - private String genMiddle(int operands) { - // 基本表达å¼ç”Ÿæˆï¼ŒåŽæ’å…¥å¹³æ–¹æˆ–å¼€æ ¹å· - String expr = genPrimary(operands); // 基本算术 - // 2选1 - if (RAND.nextBoolean()) { - // 找一个数字ä½ç½®å¹¶æ›¿æ¢ä¸º (x)^2 - expr = applySquare(expr); - } else { - expr = applySqrt(expr); - } - return expr; + // 生æˆåˆä¸­é¢˜ï¼šè‡³å°‘包å«ä¸€ä¸ª ^2 或 sqrt() + public String genMiddle(int operands) { + // 基本表达å¼ç”Ÿæˆï¼ŒåŽæ’å…¥å¹³æ–¹æˆ–å¼€æ ¹å· + String expr = genPrimary(operands); // 基本算术 + // 2选1 + if (RAND.nextBoolean()) { + // 找一个数字ä½ç½®å¹¶æ›¿æ¢ä¸º (x)^2 + expr = applySquare(expr); + } else { + expr = applySqrt(expr); } + return expr; + } - // 生æˆé«˜ä¸­é¢˜ï¼šè‡³å°‘åŒ…å« sin/cos/tan - private String genHigh(int operands) { - String expr = genPrimary(operands); - expr = applyTrig(expr); - return expr; - } + // 生æˆé«˜ä¸­é¢˜ï¼šè‡³å°‘åŒ…å« sin/cos/tan + public String genHigh(int operands) { + String expr = genPrimary(operands); + expr = applyTrig(expr); + return expr; + } - // 把表达å¼ä¸­æŸä¸ªæ•°å­—替æ¢ä¸º (x)^2 - private String applySquare(String expr) { - // 寻找所有数字的片段 - List spans = findNumberSpans(expr); - if (spans.isEmpty()) { - return expr + "^2"; - } - int[] s = spans.get(RAND.nextInt(spans.size())); - String before = expr.substring(0, s[0]); - String num = expr.substring(s[0], s[1]); - String after = expr.substring(s[1]); - return before + "(" + num + ")^2" + after; + // 把表达å¼ä¸­æŸä¸ªæ•°å­—替æ¢ä¸º (x)^2 + public String applySquare(String expr) { + // 寻找所有数字的片段 + List spans = findNumberSpans(expr); + if (spans.isEmpty()) { + return expr + "^2"; } + int[] s = spans.get(RAND.nextInt(spans.size())); + String before = expr.substring(0, s[0]); + String num = expr.substring(s[0], s[1]); + String after = expr.substring(s[1]); + return before + "(" + num + ")^2" + after; + } - // 把表达å¼ä¸­æŸä¸ªæ•°å­—替æ¢ä¸º sqrt(x) - private String applySqrt(String expr) { - List spans = findNumberSpans(expr); - if (spans.isEmpty()) { - return "sqrt(" + expr + ")"; - } - int[] s = spans.get(RAND.nextInt(spans.size())); - String before = expr.substring(0, s[0]); - String num = expr.substring(s[0], s[1]); - String after = expr.substring(s[1]); - return before + "sqrt(" + num + ")" + after; + // 把表达å¼ä¸­æŸä¸ªæ•°å­—替æ¢ä¸º sqrt(x) + public String applySqrt(String expr) { + List spans = findNumberSpans(expr); + if (spans.isEmpty()) { + return "sqrt(" + expr + ")"; } + int[] s = spans.get(RAND.nextInt(spans.size())); + String before = expr.substring(0, s[0]); + String num = expr.substring(s[0], s[1]); + String after = expr.substring(s[1]); + return before + "sqrt(" + num + ")" + after; + } - // 把æŸä¸ªæ•°å­—或å­è¡¨è¾¾å¼æ›¿æ¢ä¸º sin(x)/cos(x)/tan(x) - private String applyTrig(String expr) { - List spans = findNumberSpans(expr); - String func = randomChoice(Arrays.asList("sin", "cos", "tan")); - if (spans.isEmpty()) { - return func + "(" + expr + ")"; - } - int[] s = spans.get(RAND.nextInt(spans.size())); - String before = expr.substring(0, s[0]); - String num = expr.substring(s[0], s[1]); - String after = expr.substring(s[1]); - return before + func + "(" + num + ")" + after; + // 把æŸä¸ªæ•°å­—或å­è¡¨è¾¾å¼æ›¿æ¢ä¸º sin(x)/cos(x)/tan(x) + public String applyTrig(String expr) { + List spans = findNumberSpans(expr); + String func = randomChoice(Arrays.asList("sin", "cos", "tan")); + if (spans.isEmpty()) { + return func + "(" + expr + ")"; } + int[] s = spans.get(RAND.nextInt(spans.size())); + String before = expr.substring(0, s[0]); + String num = expr.substring(s[0], s[1]); + String after = expr.substring(s[1]); + return before + func + "(" + num + ")" + after; + } - // 找出数字ä½ç½® - private List findNumberSpans(String expr) { - List spans = new ArrayList<>(); - char[] chs = expr.toCharArray(); - int i = 0, n = chs.length; - while (i < n) { - if (Character.isDigit(chs[i])) { - int j = i; - while (j < n && (Character.isDigit(chs[j]))) { - j++; - } - spans.add(new int[]{i, j}); - i = j; - } else { - i++; + // 找出数字ä½ç½® + public List findNumberSpans(String expr) { + List spans = new ArrayList<>(); + char[] chs = expr.toCharArray(); + int i = 0, n = chs.length; + while (i < n) { + if (Character.isDigit(chs[i])) { + int j = i; + while (j < n && (Character.isDigit(chs[j]))) { + j++; } + spans.add(new int[]{i, j}); + i = j; + } else { + i++; } - return spans; } + return spans; + } - //a..béšæœºæ•° - private int randInt(int a, int b) { - return RAND.nextInt(b - a + 1) + a; - } + //a..béšæœºæ•° + public int randInt(int a, int b) { + return RAND.nextInt(b - a + 1) + a; + } - //抽签功能 - private T randomChoice(List list) { - return list.get(RAND.nextInt(list.size())); - } + //抽签功能 + public T randomChoice(List list) { + return list.get(RAND.nextInt(list.size())); } } diff --git a/src/QuestionGenerator.java b/src/QuestionGenerator.java new file mode 100644 index 0000000..60a1918 --- /dev/null +++ b/src/QuestionGenerator.java @@ -0,0 +1,46 @@ +import java.util.List; + +public abstract class QuestionGenerator { + + + protected QuestionGenerator() { + } + + + public abstract List generatePaper(int n); + + //去空格 + public abstract String normalize(String s); + + // 生æˆå•题主逻辑 + public abstract String generateOneQuestion(); + + + // 生æˆå°å­¦é¢˜ï¼ˆåªæœ‰ + - * / 和括å·ï¼‰ + public abstract String genPrimary(int operands); + + // 生æˆåˆä¸­é¢˜ï¼šè‡³å°‘包å«ä¸€ä¸ª ^2 或 sqrt() + public abstract String genMiddle(int operands); + + // 生æˆé«˜ä¸­é¢˜ï¼šè‡³å°‘åŒ…å« sin/cos/tan + public abstract String genHigh(int operands); + + // 把表达å¼ä¸­æŸä¸ªæ•°å­—替æ¢ä¸º (x)^2 + public abstract String applySquare(String expr); + + // 把表达å¼ä¸­æŸä¸ªæ•°å­—替æ¢ä¸º sqrt(x) + public abstract String applySqrt(String expr); + + // 把æŸä¸ªæ•°å­—或å­è¡¨è¾¾å¼æ›¿æ¢ä¸º sin(x)/cos(x)/tan(x) + public abstract String applyTrig(String expr); + + // 找出数字ä½ç½® + public abstract List findNumberSpans(String expr); + + //a..béšæœºæ•° + public abstract int randInt(int a, int b); + + //抽签功能 + public abstract T randomChoice(List list); + +}