前言
所谓数学化学验证,就是两个简单的算法,灵感来源于QN的手性碳原子验证,于是就做了数学上的幂函数类型的求导带值的验证和甲烷同系物通过结构式写分子式的验证。
当然,我的技术有限,没办法做那么复杂,你可以在上面一段话中看到,这些题目是一个类型且有局限性,是众多类型中的一小个分支。
我们打算将这样的算法加入BILIBILI AS当缓存番剧的时候,就进行答题,当然你只需要答题一次,即可完成认证。
实现效果
导数
甲烷同系物
实现思路
首先你得会求导函数,和会认有机物化学结构式
求导
在这里我简单说一下求导的过程,如果你学了这个东西,会发现初期我们是给一个数一个增量,使之相减且除以这个增量。
对结果求极限,使得增量无限趋近于0,即视为0,最后的结果就是该函数在该点的导数。但是这样是非常麻烦的,随着学习推进,教科书给出了一些变化公式。
原函数 | 导函数 |
我想不难发现,我选的公式如果不刻意去改动n为分数,此时是不会产生分数,这样就方便计算机计算和用户的输入了。
我们来利用一个法则 Cf(x) 求导结果为 Cf'(x) 这样就能实现我上面展示的效果了,并且使用代码可以快速的写出来。
有机物结构简式
首先来说一下,怎么认吧?
C-C-C 假设题目是这样的,是甲烷的同系物,要求补全碳链的氢,然后写出分子式,这个实际上比数学求导简单了许多,因为这次算法是纯文字输出的,所以很难去让代码补全这些氢即使补全,也相当的难看,所以只给出C主链。
下面我大致画出了
那么结果是C3H8,用户不需要输入下标,直接写出即可,因为没有括号限制,所以简单许多。
代码部分
姑且将这个类称作VerificationUtils吧!
public class VerificationUtils {
// TODO 逻辑算法设计 哔哩哔哩:萌新杰少
static String[] POWER_LIST = new String[]{"²", "³", "⁴"};
/**
* 导函数代入值验证 目前只写了平方到4次方,再大用户就不好算了
* @return object 题目和答案的JSON
*/
public static JSONObject derivatives() {
Random rand = new Random();
JSONObject object = new JSONObject();
//次方数
int multiplier = rand.nextInt(3);
int multiplier_multiplicand = 0;
int cycles = 0;
//乘数
int multiplicand = rand.nextInt(10 - 1) + 1;
int value;
int derivativeValue = 0;
int derivatives = rand.nextInt(10 - 1) + 1;
if (multiplier == 0) {
multiplier_multiplicand = 2;
} else if (multiplier == 1) {
//循环一次是平方
cycles = 1;
multiplier_multiplicand = 3;
} else if (multiplier == 2) {
//平方的基础上再乘以这个数
cycles = 2;
multiplier_multiplicand = 4;
}
for (int i = 0; i < cycles; i++) {
//平方操作
if (derivativeValue == 0) {
derivativeValue = derivatives * derivatives;
} else {
derivativeValue = derivativeValue * derivatives;
}
}
if (cycles == 0) {
derivativeValue = derivatives;
}
int multiplicandValue = multiplier_multiplicand * multiplicand;
derivativeValue = multiplicandValue * derivativeValue;
value = derivativeValue;
try {
object.put("problem", "已知函数f(x)=" + multiplicand + "X" + POWER_LIST[multiplier] + ",求它的导函数f'(" + derivatives + ")时的值。");
object.put("answer", "" + value);
} catch (JSONException e) {
e.printStackTrace();
}
return object;
}
/**
* 甲烷同系物验证
* @return object 题目和答案的JSON
*/
public static JSONObject organicCompound() {
Random rand = new Random();
JSONObject object = new JSONObject();
int carbonNumber = rand.nextInt(6 - 1) + 1;
String structural = "";
for (int i = 0; i < carbonNumber; i++) {
if (i == carbonNumber - 1) {
structural = structural + "C";
} else {
structural = structural + "C-";
}
}
String value = null;
//减去两端的碳剩下的每个会连2个氢
if (carbonNumber == 1) {
value = "CH4";
} else if (carbonNumber == 2) {
value = "C2H6";
} else {
int value1 = carbonNumber - 2;
int value2 = 2 * 3;
value1 = value1 * 2;
value1 = value1 + value2;
value = "C" + carbonNumber + "H" + value1;
}
try {
object.put("problem", "已知某甲烷的同系物未补全的结构式为\n" + structural + "\n请补全碳链的氢,并且写出分子式");
object.put("answer", value);
} catch (JSONException e) {
e.printStackTrace();
}
return object;
}
}
文末
我们仍然需要一些简单的,类似于这样的,语文,生物,历史,政治算法,如果你有兴趣,欢迎帮助BILIBILI AS写这个算法。
发表回复