From 6b2023beded485c78f774ed04e12b127e3eaa303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AD=B1=E5=82=91?= Date: Fri, 17 Jun 2022 11:11:53 +0800 Subject: [PATCH] added >>, <<, &, | operators ban mod(%) --- src/main/kotlin/PluginMain.kt | 3 +-- src/main/kotlin/Point24.kt | 39 ++++++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/PluginMain.kt b/src/main/kotlin/PluginMain.kt index 5ca33b3..dc19093 100644 --- a/src/main/kotlin/PluginMain.kt +++ b/src/main/kotlin/PluginMain.kt @@ -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" + diff --git a/src/main/kotlin/Point24.kt b/src/main/kotlin/Point24.kt index 1581476..669fe9d 100644 --- a/src/main/kotlin/Point24.kt +++ b/src/main/kotlin/Point24.kt @@ -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 + init { + val m = mutableMapOf() + 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()