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() { override fun onEnable() {
logger.info { "Plugin loaded" } logger.info { "Plugin loaded" }
//配置文件目录 "${dataFolder.absolutePath}/"
val eventChannel = GlobalEventChannel.parentScope(this) val eventChannel = GlobalEventChannel.parentScope(this)
eventChannel.subscribeMessages { eventChannel.subscribeMessages {
contains("24点") quoteReply { startsWith("24点") quoteReply {
val game = Point24() val game = Point24()
games[this.sender.id] = game games[this.sender.id] = game
"你抽到了 [${game.points[0]}] [${game.points[1]}] [${game.points[2]}] [${game.points[3]}]\n" + "你抽到了 [${game.points[0]}] [${game.points[1]}] [${game.points[2]}] [${game.points[3]}]\n" +

View File

@ -1,12 +1,45 @@
package top.jie65535.j24 package top.jie65535.j24
import net.objecthunter.exp4j.ExpressionBuilder import net.objecthunter.exp4j.ExpressionBuilder
import net.objecthunter.exp4j.operator.Operator
import net.objecthunter.exp4j.shuntingyard.ShuntingYard import net.objecthunter.exp4j.shuntingyard.ShuntingYard
import net.objecthunter.exp4j.tokenizer.NumberToken import net.objecthunter.exp4j.tokenizer.NumberToken
import net.objecthunter.exp4j.tokenizer.Token import net.objecthunter.exp4j.tokenizer.Token
import kotlin.random.Random import kotlin.random.Random
class Point24 { 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() var points = genPoints()
fun regenPoints() { fun regenPoints() {
@ -23,10 +56,13 @@ class Point24 {
fun evaluate(expression: String): Double { fun evaluate(expression: String): Double {
val expr = expression.replace('', '(').replace('', ')') val expr = expression.replace('', '(').replace('', ')')
if (expr.contains('%'))
throw IllegalArgumentException("禁止使用%运算符")
val tokens = ShuntingYard.convertToRPN( val tokens = ShuntingYard.convertToRPN(
expr, expr,
null, null,
mapOf(), myOperatorMap,
null, null,
false false
) )
@ -52,6 +88,7 @@ class Point24 {
throw IllegalArgumentException("必须使用所有数值") throw IllegalArgumentException("必须使用所有数值")
return ExpressionBuilder(expr) return ExpressionBuilder(expr)
.operator(myOperators)
.implicitMultiplication(false) .implicitMultiplication(false)
.build() .build()
.evaluate() .evaluate()