parent
44062e673a
commit
5ff952dbed
@ -0,0 +1,70 @@
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
* 负责添加三角函数
|
||||
*/
|
||||
public class TrigManager {
|
||||
private static final Random RANDOM = new Random();
|
||||
private static final String[] TRIG_FUNCTIONS = {"sin", "cos", "tan"};
|
||||
|
||||
//添加三角函数
|
||||
public String addTrigOperations(String expression, List<Integer> numPositions) {
|
||||
if (numPositions.isEmpty()) {
|
||||
return expression;
|
||||
}
|
||||
|
||||
String[] tokens = expression.split(" ");
|
||||
int targetIndex = chooseTargetIndex(numPositions, tokens);
|
||||
if (targetIndex == -1) {
|
||||
return expression;
|
||||
}
|
||||
|
||||
tokens[targetIndex] = applyTrig(tokens[targetIndex]);
|
||||
return String.join(" ", tokens);
|
||||
}
|
||||
|
||||
//随机函数种类
|
||||
private int chooseTargetIndex(List<Integer> numPositions, String[] tokens) {
|
||||
for (int tries = 0; tries < 50; tries++) {
|
||||
int idx = numPositions.get(RANDOM.nextInt(numPositions.size()));
|
||||
if (canApplyTrig(tokens, idx)) {
|
||||
return idx;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
//检测三角函数是否合法
|
||||
private boolean canApplyTrig(String[] tokens, int index) {
|
||||
if (!isNumber(tokens[index])) {
|
||||
return false;
|
||||
}
|
||||
int value = Integer.parseInt(tokens[index]);
|
||||
|
||||
// 防止 tan(90)
|
||||
if (value == 90 && RANDOM.nextInt(3) == 2) {
|
||||
return false;
|
||||
}
|
||||
// cos(90) 不加在除法右边
|
||||
if (index > 0 && tokens[index - 1].equals("/") && value == 90) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//添加操作
|
||||
private String applyTrig(String token) {
|
||||
String func = TRIG_FUNCTIONS[RANDOM.nextInt(TRIG_FUNCTIONS.length)];
|
||||
return func + "(" + token + ")";
|
||||
}
|
||||
|
||||
private boolean isNumber(String token) {
|
||||
try {
|
||||
Integer.parseInt(token);
|
||||
return true;
|
||||
} catch (NumberFormatException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue