added >>, <<, &, | operators

ban mod(%)
This commit is contained in:
2022-06-17 11:11:53 +08:00
parent 13bc96b11b
commit 6b2023bede
2 changed files with 39 additions and 3 deletions

View File

@ -20,10 +20,9 @@ object PluginMain : KotlinPlugin(
override fun onEnable() {
logger.info { "Plugin loaded" }
//配置文件目录 "${dataFolder.absolutePath}/"
val eventChannel = GlobalEventChannel.parentScope(this)
eventChannel.subscribeMessages {
contains("24点") quoteReply {
startsWith("24点") quoteReply {
val game = Point24()
games[this.sender.id] = game
"你抽到了 [${game.points[0]}] [${game.points[1]}] [${game.points[2]}] [${game.points[3]}]\n" +

View File

@ -1,12 +1,45 @@
package top.jie65535.j24
import net.objecthunter.exp4j.ExpressionBuilder
import net.objecthunter.exp4j.operator.Operator
import net.objecthunter.exp4j.shuntingyard.ShuntingYard
import net.objecthunter.exp4j.tokenizer.NumberToken
import net.objecthunter.exp4j.tokenizer.Token
import kotlin.random.Random
class Point24 {
companion object {
val myOperators = listOf(
object : Operator(">>", 2, true, Operator.PRECEDENCE_ADDITION - 1) {
override fun apply(vararg args: Double): Double {
return (args[0].toInt() shr args[1].toInt()).toDouble()
}
},
object : Operator("<<", 2, true, Operator.PRECEDENCE_ADDITION - 1) {
override fun apply(vararg args: Double): Double {
return (args[0].toInt() shl args[1].toInt()).toDouble()
}
},
object : Operator("&", 2, true, Operator.PRECEDENCE_ADDITION - 2) {
override fun apply(vararg args: Double): Double {
return (args[0].toInt() and args[1].toInt()).toDouble()
}
},
object : Operator("|", 2, true, Operator.PRECEDENCE_ADDITION - 3) {
override fun apply(vararg args: Double): Double {
return (args[0].toInt() or args[1].toInt()).toDouble()
}
},
)
private val myOperatorMap: Map<String, Operator>
init {
val m = mutableMapOf<String, Operator>()
for (opt in myOperators)
m[opt.symbol] = opt
myOperatorMap = m
}
}
var points = genPoints()
fun regenPoints() {
@ -23,10 +56,13 @@ class Point24 {
fun evaluate(expression: String): Double {
val expr = expression.replace('', '(').replace('', ')')
if (expr.contains('%'))
throw IllegalArgumentException("禁止使用%运算符")
val tokens = ShuntingYard.convertToRPN(
expr,
null,
mapOf(),
myOperatorMap,
null,
false
)
@ -52,6 +88,7 @@ class Point24 {
throw IllegalArgumentException("必须使用所有数值")
return ExpressionBuilder(expr)
.operator(myOperators)
.implicitMultiplication(false)
.build()
.evaluate()