距离上一次发【试卷类场景 这次有点儿更彻底】已是一年多一点点了,前些时间对【多功能函数】再次发起了次探索,偶得【多功能云函数在BOM汇总计算中的应用】一文,遂想,要不要将试卷类场景再做一次,毕竟上一次单独建立云函数,是堆了一堆代码。
为什么对多功能函数情有独钟,或许是因为它更便于我“懒”吧,毕竟不用再像过去,每当处理一个场景就需要单独再建立一个云函数,现在这样挺好,放在前端,在简道云中拼接好需要处理的命令即可,再者,复用起来是不是也会更为的方便。
体验链接
https://tnvew1vqtq.jiandaoyun.com/f/62a01da07e76d20007c943e0
参考资料
帮助文档 — 前端事件
https://hc.jiandaoyun.com/open/12115
快速搞定百度云函数 每月100万次免费调用
https://bbs.fanruan.com/thread-139916-1-1.html
核心功能概述
如何随机抽题
1、命令原型
list(range(1,6))
random.sample(range(1,6),5)
2、命令解析
1-5的正序序列 ,1-5的随机序列
3、函数命令
dict(zip(['s','r'],[list(range(1,6)),random.sample(range(1,6),5)]))
4、返回结果
{
"release": {
"s": [
1,
2,
3,
4,
5
],
"r": [
5,
3,
4,
2,
1
]
},
"string": "{'s': [1, 2, 3, 4, 5], 'r': [5, 3, 4, 2, 1]}"
}
如何随机选项
1、命令原型
' \n'.join([ '. '.join(i) for i in list(zip(list('ABCD'),random.sample([i for i in '浅###硬###软###深###'.split('###') if i != ''] ,4))) if i !=''])
2、命令解析
将提供的选项进行随即排列并在前面自动添加“A.B.C.D.”
3、函数命令
' \n'.join([ '. '.join(i) for i in list(zip(list('ABCD'),random.sample([i for i in '浅###硬###软###深###'.split('###') if i != ''] ,4))) if i !='']),' \n'.join([ '. '.join(i) for i in list(zip(list('ABCD'),random.sample([i for i in '黄果树瀑布###壶口瀑布###吊水楼瀑布###三叠泉瀑布###'.split('###') if i != ''] ,4))) if i !='']),' \n'.join([ '. '.join(i) for i in list(zip(list('ABC'),random.sample([i for i in '婚否###禁戒###富贵###'.split('###') if i != ''] ,3))) if i !='']),' \n'.join([ '. '.join(i) for i in list(zip(list('ABC'),random.sample([i for i in '合欢花###夜来香###夕颜###'.split('###') if i != ''] ,3))) if i !='']),' \n'.join([ '. '.join(i) for i in list(zip(list('ABC'),random.sample([i for i in '胎儿期和婴儿期###婴儿期和儿童期###青春期和婴儿期###'.split('###') if i != ''] ,3))) if i !=''])
4、返回结果
{
"release": [
"A. 软 \nB. 深 \nC. 浅 \nD. 硬",
"A. 黄果树瀑布 \nB. 三叠泉瀑布 \nC. 吊水楼瀑布 \nD. 壶口瀑布",
"A. 富贵 \nB. 禁戒 \nC. 婚否",
"A. 夕颜 \nB. 合欢花 \nC. 夜来香",
"A. 青春期和婴儿期 \nB. 胎儿期和婴儿期 \nC. 婴儿期和儿童期"
],
"string": "('A. 软 \\nB. 深 \\nC. 浅 \\nD. 硬', 'A. 黄果树瀑布 \\nB. 三叠泉瀑布 \\nC. 吊水楼瀑布 \\nD. 壶口瀑布', 'A. 富贵 \\nB. 禁戒 \\nC. 婚否', 'A. 夕颜 \\nB. 合欢花 \\nC. 夜来香', 'A. 青春期和婴儿期 \\nB. 胎儿期和婴儿期 \\nC. 婴儿期和儿童期')"
}
如何解析答案
1、命令原型
'###'.join([ h[3:] for h in [('A. 浅 B. 硬 C. 深 D. 软').split(' ')[k-1] for k in [ord(i)-64 for i in list('D')]]])
2、命令解析
跟据已选择的选项将本选项所代表的具体内容解析出来
3、函数命令
'&&&'.join(['###'.join([ h[3:] for h in [('A. 浅 B. 硬 C. 深 D. 软').split(' ')[k-1] for k in [ord(i)-64 for i in list('D')]]]),'###'.join([ h[3:] for h in [('A. 壶口瀑布 B. 黄果树瀑布 C. 三叠泉瀑布 D. 吊水楼瀑布').split(' ')[k-1] for k in [ord(i)-64 for i in list('ABD')]]]),'###'.join([ h[3:] for h in [('A. 禁戒 B. 婚否 C. 富贵').split(' ')[k-1] for k in [ord(i)-64 for i in list('A')]]]),'###'.join([ h[3:] for h in [('A. 夕颜 B. 夜来香 C. 合欢花').split(' ')[k-1] for k in [ord(i)-64 for i in list('C')]]]),'###'.join([ h[3:] for h in [('A. 婴儿期和儿童期 B. 胎儿期和婴儿期 C. 青春期和婴儿期').split(' ')[k-1] for k in [ord(i)-64 for i in list('B')]]])])
4、返回结果
{
"release": "软&&&壶口瀑布###黄果树瀑布###吊水楼瀑布&&&禁戒&&&合欢花&&&胎儿期和婴儿期",
"string": "软&&&壶口瀑布###黄果树瀑布###吊水楼瀑布&&&禁戒&&&合欢花&&&胎儿期和婴儿期"
}
如何比对答案
1、计算逻辑
(1) 已选择的选项数量与答案的数量一致
(2) 已选择的选项与答案合并去重后与答案的数量一致
2、计算公式
IFS(NOT(ISEMPTY(试卷.答题)),IF(AND(NOT(ISEMPTY(试卷.答题解析)),COUNT(试卷.答题)==试卷.答案数量,COUNT(UNION(SPLIT(试卷.原始答案,试卷.答题解析),"###")))==试卷.答案数量),"正确","错误"))
温馨提示
1、自行搭建或测试中,可以不用管命令的具体含义,拿来拆解下直接用即可,就像吃馒头不一定要非得会种麦子。
2、文中的【函数命令】,说白了就是通过一堆函数的嵌套来实现某个功能,需耐心些、细心些,拼接命令中的固定内容和动态内容。
3、最终通过前端事件前,所有的命令都存在一个【单行文本】中,有些是把子表单中的命令进行了二次拼接,所以看起来可能会很长。
4、测试中,在添加至80道题左右时,云函数不能够正常处理,猜测可能是因为请求类型为get,命令长度超过了限制或返回数据超过了限制,可以用一题一解析的方式处理。
5、特别提示:注意其中的标点符号,也需仅仅只是一个空格,也在起着决定性的作用,上手测吧,从搭建一个【多功能函数】开始。
更多内容
更多沟通交流可添加微信(zmlnow)
添加时请备注:简道云
都看到这里了
如果您觉得有用
赞一个呗
赏一个呗
偶会更有动力哈
|