Last active
September 17, 2021 10:06
-
-
Save hsinjungwu/ae4cfcc62ca3387e6699ff1b8ce5b7a6 to your computer and use it in GitHub Desktop.
sol 1 2 3 4 5 6 7 8 9 = 100
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, "" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
型別改成 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