-
Notifications
You must be signed in to change notification settings - Fork 16
/
LuauChallenge.go
81 lines (70 loc) · 1.48 KB
/
LuauChallenge.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package peer
import (
"math"
"strconv"
)
var luauOps = []byte{8, 5, 7, 1, 6, 3, 4, 2}
func luaLikeMod(x, y float64) float64 {
if x >= 0 {
return math.Mod(x, y)
}
q := math.Floor(-x / y)
m := y*q + y
return math.Mod(x+m, y)
}
func floatToString(f float64) string {
s := strconv.FormatFloat(f, 'f', 0, 64)
return s
}
// ResolveLuaChallenge implements the Luau callback challenge algorithm
func ResolveLuaChallenge(arg1, arg2 int32) int32 {
a1 := float64(arg1)
a2 := float64(arg2)
var a float64 = 0x189
var c float64 = 1
var err error
for i := 0; i < 16; i++ {
e := luaLikeMod(math.Abs(a2+a+c), 8)
var f float64
op1 := a + a1
op2 := a2
switch luauOps[int(e)] - 1 {
case 0:
f = op1 + op2
case 1:
f = op1 - op2
case 2:
f = op2 - op1
case 3:
f, err = strconv.ParseFloat(
floatToString(luaLikeMod(op2, 1000))+
floatToString(
math.Abs(luaLikeMod(op1, 1000))), 64)
if err != nil {
panic(err)
}
case 4:
f, err = strconv.ParseFloat(
floatToString(luaLikeMod(op2, 1337))+
floatToString(
math.Abs(luaLikeMod(op1, 1337))), 64)
if err != nil {
panic(err)
}
case 5:
f = luaLikeMod(op1, 1000) * luaLikeMod(op2, 1000)
case 6:
f = luaLikeMod(op1, 1337) * luaLikeMod(op2, 1337)
case 7:
oldOp1 := op1
op1 = op1 + op2
op2 = oldOp1 - op2
f = luaLikeMod(op1, 1000) * luaLikeMod(op2, 1000)
default:
panic("bad luauchallenge op")
}
a = luaLikeMod((a + f), 10000000)
c++
}
return int32(a)
}