You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.0 KiB
135 lines
3.0 KiB
package fun
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/dustinpianalto/disgoman"
|
|
"github.com/dustinpianalto/rpnparse"
|
|
)
|
|
|
|
var InterleaveCommand = &disgoman.Command{
|
|
Name: "encode",
|
|
Aliases: []string{"e"},
|
|
Description: "Encode 2 numbers",
|
|
OwnerOnly: false,
|
|
Hidden: false,
|
|
RequiredPermissions: 0,
|
|
Invoke: interleaveFunc,
|
|
}
|
|
|
|
func interleaveFunc(ctx disgoman.Context, args []string) {
|
|
if len(args) == 2 {
|
|
x, err := strconv.ParseInt(args[0], 10, 64)
|
|
if err != nil {
|
|
return
|
|
}
|
|
y, err := strconv.ParseInt(args[1], 10, 64)
|
|
if err != nil {
|
|
return
|
|
}
|
|
var z = int64(0)
|
|
for i := 0; i < 64; i++ {
|
|
x_masked_i := x & (1 << i)
|
|
y_masked_i := y & (1 << i)
|
|
|
|
z |= x_masked_i << i
|
|
z |= y_masked_i << (i + 1)
|
|
}
|
|
ctx.Send(fmt.Sprintf("%v", z))
|
|
}
|
|
}
|
|
|
|
var DeinterleaveCommand = &disgoman.Command{
|
|
Name: "decode",
|
|
Aliases: []string{"d"},
|
|
Description: "Decode 1 number into 2",
|
|
OwnerOnly: false,
|
|
Hidden: false,
|
|
RequiredPermissions: 0,
|
|
Invoke: deinterleaveFunc,
|
|
}
|
|
|
|
func deinterleaveFunc(ctx disgoman.Context, args []string) {
|
|
if len(args) == 1 {
|
|
z, err := strconv.ParseInt(args[0], 10, 64)
|
|
if err != nil {
|
|
return
|
|
}
|
|
var x = int64(0)
|
|
var y = int64(0)
|
|
i := 0
|
|
for z > 0 {
|
|
x |= (z & 1) << i
|
|
z >>= 1
|
|
y |= (z & 1) << i
|
|
z >>= 1
|
|
i++
|
|
}
|
|
ctx.Send(fmt.Sprintf("(%v, %v)", x, y))
|
|
}
|
|
}
|
|
|
|
var GenerateRPNCommand = &disgoman.Command{
|
|
Name: "RPN",
|
|
Aliases: []string{"rpn"},
|
|
Description: "Convert infix to rpn",
|
|
OwnerOnly: false,
|
|
Hidden: false,
|
|
RequiredPermissions: 0,
|
|
Invoke: generateRPNFunc,
|
|
}
|
|
|
|
func generateRPNFunc(ctx disgoman.Context, args []string) {
|
|
rpn, err := rpnparse.GenerateRPN(args)
|
|
if err != nil {
|
|
ctx.Send(err.Error())
|
|
return
|
|
}
|
|
ctx.Send(rpn)
|
|
}
|
|
|
|
var ParseRPNCommand = &disgoman.Command{
|
|
Name: "ParseRPN",
|
|
Aliases: []string{"PRPN", "prpn"},
|
|
Description: "Parse RPN string and return the result",
|
|
OwnerOnly: false,
|
|
Hidden: false,
|
|
RequiredPermissions: 0,
|
|
Invoke: parseRPNFunc,
|
|
}
|
|
|
|
func parseRPNFunc(ctx disgoman.Context, args []string) {
|
|
res, err := rpnparse.ParseRPN(args)
|
|
if err != nil {
|
|
ctx.Send(err.Error())
|
|
return
|
|
}
|
|
ctx.Send(fmt.Sprintf("The result is: %v", res))
|
|
}
|
|
|
|
var SolveCommand = &disgoman.Command{
|
|
Name: "solve",
|
|
Aliases: []string{"math", "infix"},
|
|
Description: "Solve infix equation and return the result",
|
|
OwnerOnly: false,
|
|
Hidden: false,
|
|
RequiredPermissions: 0,
|
|
Invoke: solveFunc,
|
|
}
|
|
|
|
func solveFunc(ctx disgoman.Context, args []string) {
|
|
rpn, err := rpnparse.GenerateRPN(args)
|
|
if err != nil {
|
|
ctx.Send(err.Error())
|
|
return
|
|
}
|
|
res, err := rpnparse.ParseRPN(strings.Split(rpn, " "))
|
|
if err != nil {
|
|
ctx.Send(err.Error())
|
|
return
|
|
}
|
|
ctx.Send(fmt.Sprintf("The result is: %v", res))
|
|
}
|