package main
import (
"bytes"
"fmt"
)
func main() {
CountdownSolver(Pop([]int{1, 3, 7, 6, 8, 3, 250}))
CountdownSolver(Pop([]int{25, 100, 9, 7, 3, 7, 881}))
CountdownSolver(Pop([]int{6, 75, 3, 25, 50, 100, 952}))
}
func CountdownSolver(s int, a []int) {
c := make([]int, len(a))
m := make(map[string]bool)
for i := 0; i < len(a); {
if i == 0 {
if _, ok := m[AToS(a)]; !ok {
m[AToS(a)] = true
if eq, ok := Solve(s, a); ok {
fmt.Println(eq, "=", s)
}
}
}
if c[i] < i {
if i%2 == 0 {
a[0], a[i] = a[i], a[0]
} else {
a[i], a[c[i]] = a[c[i]], a[i]
}
c[i]++
i = 0
} else {
c[i] = 0
i++
}
}
}
func AToS(v []int) string {
var buffer bytes.Buffer
for _, e := range v {
buffer.WriteString(fmt.Sprint(e, ","))
}
return buffer.String()
}
func Solve(s int, p []int) (string, bool) {
ops := GetOperators()
for _, op := range ops {
if ApplyOps(p, op) == s {
return GetEq(p, op), true
}
}
return "", false
}
func GetOperators() [][]int {
var res [][]int
for i := 0; i < 4; i++ {
for j := 0; j < 4; j++ {
for k := 0; k < 4; k++ {
for l := 0; l < 4; l++ {
for m := 0; m < 4; m++ {
res = append(res, []int{i, j, k, l, m})
}
}
}
}
}
return res
}
func ApplyOps(p []int, op []int) int {
s := p[0]
for i := 1; i < len(p); i++ {
s = ApplyOp(s, p[i], op[i-1])
}
return s
}
func ApplyOp(a int, b int, op int) int {
switch op {
case 0:
return a + b
case 1:
return a - b
case 2:
return a * b
case 3:
return a / b
}
return 0
}
func GetEq(p []int, op []int) string {
var buffer bytes.Buffer
buffer.WriteString(fmt.Sprint(p[0]))
for i := 1; i < len(p); i++ {
buffer.WriteString(fmt.Sprint(" ", GetOp(op[i-1]), " ", p[i]))
}
return buffer.String()
}
func GetOp(op int) string {
switch op {
case 0:
return "+"
case 1:
return "-"
case 2:
return "*"
case 3:
return "/"
}
return ""
}
func Pop(a []int) (int, []int) {
return a[len(a)-1], a[:len(a)-1]
}
cGFja2FnZSBtYWluCgoJaW1wb3J0ICgKCQkiYnl0ZXMiCgkJImZtdCIKCSkKCglmdW5jIG1haW4oKSB7CgkJQ291bnRkb3duU29sdmVyKFBvcChbXWludHsxLCAzLCA3LCA2LCA4LCAzLCAyNTB9KSkKCQlDb3VudGRvd25Tb2x2ZXIoUG9wKFtdaW50ezI1LCAxMDAsIDksIDcsIDMsIDcsIDg4MX0pKQoJCUNvdW50ZG93blNvbHZlcihQb3AoW11pbnR7NiwgNzUsIDMsIDI1LCA1MCwgMTAwLCA5NTJ9KSkKCX0KCglmdW5jIENvdW50ZG93blNvbHZlcihzIGludCwgYSBbXWludCkgewoJCWMgOj0gbWFrZShbXWludCwgbGVuKGEpKQoJCW0gOj0gbWFrZShtYXBbc3RyaW5nXWJvb2wpCgoJCWZvciBpIDo9IDA7IGkgPCBsZW4oYSk7IHsKCQkJaWYgaSA9PSAwIHsKCQkJCWlmIF8sIG9rIDo9IG1bQVRvUyhhKV07ICFvayB7CgkJCQkJbVtBVG9TKGEpXSA9IHRydWUKCQkJCQlpZiBlcSwgb2sgOj0gU29sdmUocywgYSk7IG9rIHsKCQkJCQkJZm10LlByaW50bG4oZXEsICI9IiwgcykKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWlmIGNbaV0gPCBpIHsKCQkJCWlmIGklMiA9PSAwIHsKCQkJCQlhWzBdLCBhW2ldID0gYVtpXSwgYVswXQoJCQkJfSBlbHNlIHsKCQkJCQlhW2ldLCBhW2NbaV1dID0gYVtjW2ldXSwgYVtpXQoJCQkJfQoKCQkJCWNbaV0rKwoJCQkJaSA9IDAKCQkJfSBlbHNlIHsKCQkJCWNbaV0gPSAwCgkJCQlpKysKCQkJfQoJCX0KCX0KCglmdW5jIEFUb1ModiBbXWludCkgc3RyaW5nIHsKCQl2YXIgYnVmZmVyIGJ5dGVzLkJ1ZmZlcgoKCQlmb3IgXywgZSA6PSByYW5nZSB2IHsKCQkJYnVmZmVyLldyaXRlU3RyaW5nKGZtdC5TcHJpbnQoZSwgIiwiKSkKCQl9CgoJCXJldHVybiBidWZmZXIuU3RyaW5nKCkKCX0KCglmdW5jIFNvbHZlKHMgaW50LCBwIFtdaW50KSAoc3RyaW5nLCBib29sKSB7CgkJb3BzIDo9IEdldE9wZXJhdG9ycygpCgoJCWZvciBfLCBvcCA6PSByYW5nZSBvcHMgewoJCQlpZiBBcHBseU9wcyhwLCBvcCkgPT0gcyB7CgkJCQlyZXR1cm4gR2V0RXEocCwgb3ApLCB0cnVlCgkJCX0KCQl9CgkJcmV0dXJuICIiLCBmYWxzZQoJfQoKCWZ1bmMgR2V0T3BlcmF0b3JzKCkgW11bXWludCB7CgkJdmFyIHJlcyBbXVtdaW50CgkJZm9yIGkgOj0gMDsgaSA8IDQ7IGkrKyB7CgkJCWZvciBqIDo9IDA7IGogPCA0OyBqKysgewoJCQkJZm9yIGsgOj0gMDsgayA8IDQ7IGsrKyB7CgkJCQkJZm9yIGwgOj0gMDsgbCA8IDQ7IGwrKyB7CgkJCQkJCWZvciBtIDo9IDA7IG0gPCA0OyBtKysgewoJCQkJCQkJcmVzID0gYXBwZW5kKHJlcywgW11pbnR7aSwgaiwgaywgbCwgbX0pCgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIHJlcwoJfQoKCWZ1bmMgQXBwbHlPcHMocCBbXWludCwgb3AgW11pbnQpIGludCB7CgkJcyA6PSBwWzBdCgkJZm9yIGkgOj0gMTsgaSA8IGxlbihwKTsgaSsrIHsKCQkJcyA9IEFwcGx5T3AocywgcFtpXSwgb3BbaS0xXSkKCQl9CgkJcmV0dXJuIHMKCX0KCglmdW5jIEFwcGx5T3AoYSBpbnQsIGIgaW50LCBvcCBpbnQpIGludCB7CgkJc3dpdGNoIG9wIHsKCQljYXNlIDA6CgkJCXJldHVybiBhICsgYgoJCWNhc2UgMToKCQkJcmV0dXJuIGEgLSBiCgkJY2FzZSAyOgoJCQlyZXR1cm4gYSAqIGIKCQljYXNlIDM6CgkJCXJldHVybiBhIC8gYgoJCX0KCQlyZXR1cm4gMAoJfQoKCWZ1bmMgR2V0RXEocCBbXWludCwgb3AgW11pbnQpIHN0cmluZyB7CgkJdmFyIGJ1ZmZlciBieXRlcy5CdWZmZXIKCgkJYnVmZmVyLldyaXRlU3RyaW5nKGZtdC5TcHJpbnQocFswXSkpCgoJCWZvciBpIDo9IDE7IGkgPCBsZW4ocCk7IGkrKyB7CgkJCWJ1ZmZlci5Xcml0ZVN0cmluZyhmbXQuU3ByaW50KCIgIiwgR2V0T3Aob3BbaS0xXSksICIgIiwgcFtpXSkpCgkJfQoKCQlyZXR1cm4gYnVmZmVyLlN0cmluZygpCgl9CgoJZnVuYyBHZXRPcChvcCBpbnQpIHN0cmluZyB7CgkJc3dpdGNoIG9wIHsKCQljYXNlIDA6CgkJCXJldHVybiAiKyIKCQljYXNlIDE6CgkJCXJldHVybiAiLSIKCQljYXNlIDI6CgkJCXJldHVybiAiKiIKCQljYXNlIDM6CgkJCXJldHVybiAiLyIKCQl9CgkJcmV0dXJuICIiCgoJfQoKCWZ1bmMgUG9wKGEgW11pbnQpIChpbnQsIFtdaW50KSB7CgkJcmV0dXJuIGFbbGVuKGEpLTFdLCBhWzpsZW4oYSktMV0KCX0=