为Wiki编写更简洁的解析函数:实现输入关卡输出所属区间的模板
问题背景
需要在游戏相关Wiki上制作一个模板,实现输入指定关卡数值即可返回其所属关卡区间的效果,例如输入"42"输出"1-50"。
目前通过多层嵌套的#ifexpr实现了功能,也尝试过使用#switch,但代码更冗余,想了解更简洁的实现方案,目的是进一步学习解析函数的相关用法。
现有模板代码如下:
{{#ifexpr:{{{1|}}}<=50|1-50|<!-- -->{{#ifexpr:{{{1|}}}<=95|51-95|<!-- -->{{#ifexpr:{{{1|}}}<=140|96-140|<!-- -->{{#ifexpr:{{{1|}}}<=185|141-185|<!-- -->{{#ifexpr:{{{1|}}}<=230|186-230|<!-- -->{{#ifexpr:{{{1|}}}<=275|231-275|<!-- -->{{#ifexpr:{{{1|}}}<=320|276-320|<!-- -->{{#ifexpr:{{{1|}}}<=365|321-365|<!-- -->{{#ifexpr:{{{1|}}}<=410|366-410|<!-- -->{{#ifexpr:{{{1|}}}<=455|411-455|<!-- -->{{#ifexpr:{{{1|}}}<=500|456-500|<!-- -->{{#ifexpr:{{{1|}}}<=545|501-545|<!-- -->{{#ifexpr:{{{1|}}}<=590|546-590|<!-- -->{{#ifexpr:{{{1|}}}<=620|591-620|<!-- -->{{#ifexpr:{{{1|}}}<=650|621-650|<!-- -->{{#ifexpr:{{{1|}}}<=680|651-680|<!-- -->{{#ifexpr:{{{1|}}}<=710|681-710|<!-- -->{{#ifexpr:{{{1|}}}<=740|711-740|<!-- -->{{#ifexpr:{{{1|}}}<=770|741-770|<!-- -->{{#ifexpr:{{{1|}}}<=800|771-800|<!-- -->{{#ifexpr:{{{1|}}}<=830|801-830|<!-- -->{{#ifexpr:{{{1|}}}<=860|831-860|<!-- -->{{#ifexpr:{{{1|}}}<=890|861-890|891-920}}}}}}}}}}}}}}}}}}}}}}}}
优化方案
观察区间规则可以发现明显的分段规律:
- 1~50为首个独立分段
- 51~590区间内每45关为一个分段
- 591~920区间内每30关为一个分段
可以用数学计算直接推导区间,无需多层嵌套判断,代码如下:
{{#ifexpr:{{{1|0}}} < 1 | 输入无效 | {{#ifexpr:{{{1|}}} <= 50 | 1-50 | {{#ifexpr:{{{1|}}} <= 590 | {{#expr: 51 + 45 * floor(({{{1|}}} - 51)/45) }}-{{#expr: 50 + 45 * (floor(({{{1|}}} - 51)/45) + 1) }} | {{#expr: 591 + 30 * floor(({{{1|}}} - 591)/30) }}-{{#expr: 590 + 30 * (floor(({{{1|}}} - 591)/30) + 1) }} }} }} }}
代码说明
- 先做输入合法性校验,小于1的输入直接返回无效提示,可根据需求修改提示内容或直接移除校验逻辑
- 首段特殊处理直接返回1-50
- 51到590段:通过
floor函数计算当前关卡属于第几个45关分段,直接推导首尾数值 - 590以上段:同理按30关的分段规则计算首尾数值
该方案代码量远低于嵌套#ifexpr的写法,后续如果区间规则调整,只需要修改对应分段的步长和阈值即可,维护成本更低。
内容的提问来源于stack exchange,提问作者oli_vi_er
相关产品推荐
相关产品推荐

