Skip to content

Instantly share code, notes, and snippets.

@hsinjungwu
Last active September 17, 2021 10:06
Show Gist options
  • Save hsinjungwu/ae4cfcc62ca3387e6699ff1b8ce5b7a6 to your computer and use it in GitHub Desktop.
Save hsinjungwu/ae4cfcc62ca3387e6699ff1b8ce5b7a6 to your computer and use it in GitHub Desktop.
sol 1 2 3 4 5 6 7 8 9 = 100
package main
import (
"fmt"
)
func main() {
sol()
}
type op struct {
fn func(a, b float64) (float64, bool)
order int
symbol string
}
func sol() {
opA := &op{
fn: func(a, b float64) (float64, bool) {
return a + b, true
},
order: 3,
symbol: "+",
}
opS := &op{
fn: func(a, b float64) (float64, bool) {
return a - b, true
},
order: 3,
symbol: "-",
}
opM := &op{
fn: func(a, b float64) (float64, bool) {
return a * b, true
},
order: 2,
symbol: "*",
}
opD := &op{
fn: func(a, b float64) (float64, bool) {
return a / b, true
},
order: 2,
symbol: "/",
}
opC := &op{
fn: func(a, b float64) (float64, bool) {
return 10*a + b, a > 0
},
order: 1,
symbol: "",
}
opArr := []*op{opC, opM, opD, opA, opS}
cnt := 0
for i0 := 0; i0 < len(opArr); i0++ {
for i1 := 0; i1 < len(opArr); i1++ {
for i2 := 0; i2 < len(opArr); i2++ {
for i3 := 0; i3 < len(opArr); i3++ {
for i4 := 0; i4 < len(opArr); i4++ {
for i5 := 0; i5 < len(opArr); i5++ {
for i6 := 0; i6 < len(opArr); i6++ {
for i7 := 0; i7 < len(opArr); i7++ {
myops := []*op{opArr[i0], opArr[i1], opArr[i2], opArr[i3], opArr[i4], opArr[i5], opArr[i6], opArr[i7]}
if b, c := calc(myops, 100); b {
cnt++
fmt.Printf("%d. %s\n", cnt, c)
}
}
}
}
}
}
}
}
}
}
func calc(myops []*op, target float64) (bool, string) {
cnt := 0
for _, o := range myops {
if o.order > 1 {
cnt++
}
}
dgs := []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}
txt := "1"
for i, o := range myops {
txt = fmt.Sprintf("%s%s%.0f", txt, o.symbol, dgs[i+1])
}
for n := 1; n <= 3; n++ {
i := 0
for i < len(myops) {
to := myops[i]
if to.order == n {
if v, b := to.fn(dgs[i], dgs[i+1]); b {
myops = append(myops[:i], myops[i+1:]...)
dgs[i] = v
dgs = append(dgs[:i+1], dgs[i+2:]...)
} else {
return false, ""
}
} else {
i++
}
}
}
if dgs[0] == target {
return true, fmt.Sprintf("使用%d種運算子,有效結果=%s=%.0f", cnt, txt, target)
}
return false, ""
}
@hsinjungwu
Copy link
Author

型別改成 float64 找到漏網之魚

  • 1*2/3+4*5/6+7+89=100
  • 1/2*34-5+6-7+89=100
  • 1/2*3/4*56+7+8*9=100
  • 1/2/3*456+7+8+9=10

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment