如何获得 "sum" 个真布尔值
How to get "sum" of true bools
在这种情况下,我有 3 个布尔变量(已设置为 true
或 false
)
此处的目标是确定是否有多个布尔变量设置为 true
现在我写了以下内容,它确实有效:
boolval := 0
if *firstbool {
boolval++
}
if *secondbool {
boolval++
}
if *thirdbool {
boolval++
}
if boolval > 1 {
// More than 1 of the bool vars are true
}
如果我正在写连续的 if{}
语句,我总是会标记我的逻辑,所以我想我会问问你们这些天才如何完成这个。
identify if more than one of the set of bool vars are set to true
比如写一个set函数:
package main
import "fmt"
func nTrue(b ...bool) int {
n := 0
for _, v := range b {
if v {
n++
}
}
return n
}
func main() {
v1, v2, v3 := true, false, true
fmt.Println(nTrue(v1, v2, v3))
if nTrue(v1, v2, v3) > 1 {
// . . .
}
// Or
if n := nTrue(v1, v2, v3); n > 1 {
// . . .
}
// Or
n := nTrue(v1, v2, v3)
if n > 1 {
// . . .
}
}
游乐场:https://play.golang.org/p/g3WCN6BgGly
输出:
2
例如范围超过集合,
package main
import "fmt"
func main() {
v1, v2, v3 := true, false, true
boolval := 0
for _, v := range []bool{v1, v2, v3} {
if v {
boolval++
}
}
if boolval > 1 {
// . . .
}
fmt.Println(boolval > 1, boolval)
}
游乐场:https://play.golang.org/p/R6UGb8YYEFw
输出:
true 2
取决于您如何获取 firstbool
等的值。 al,您应该在这里采用更惯用的方法。考虑通道和 goroutines 可以在后台处理会计工作。如果你的布尔值是一些更重的操作的结果,那么做这样的事情可能是有意义的:
package main
import "fmt"
func firstFunc(ch chan bool) {
// assume this works, true!
ch <- true
}
func secondFunc(ch chan bool) {
// assume this fails, false!
ch <- false
}
func thirdFunc(ch chan bool) {
// assume this works, true!
ch <- true
}
func listener(ch chan bool, numCallers int) <-chan bool {
outch := make(chan bool)
THRESHOLD := 2
go func(outch chan<- bool) {
count := 0
trues := 0
for count < numCallers && trues < THRESHOLD {
val := <-ch
if val {
trues++
}
count++
}
outch <- trues >= THRESHOLD
}(outch)
return outch
}
func main() {
ch := make(chan bool)
resultch := listener(ch, 3)
go firstFunc(ch)
go secondFunc(ch)
go thirdFunc(ch)
if <-resultch {
fmt.Println("Two or more processes succeeded")
}
}
然而,这是方式过度设计的简单需求,因此仅当此模式适合您的应用程序的较大设计时才考虑此模式。
也许我误会了什么,但这个问题看起来像是布尔代数的练习。
首先:让我们弄清楚"sum"是什么意思
The goal here is to identify if more than one of the set of bool vars are set to true
所以"sum"实际上意味着:"more than once or "两倍或更多
其二:我们直接写"More than Once"
func MoreThanOnce(a, b, c bool) bool {
return (
a&&(b||c)) ||
(a||b)&&c ||
(a||c)&&b
}
第三:简化
func MoreThanOnce(a, b, c bool) bool { return a&&b || a&&c || b&&c}
结果
一行,没有if
s,没有频道,没有指针。
这是想要的吗?
更新
来自@peterSO 评论:
In the example, there are three successive if statements. Perhaps there are four, or seven, or forty-two successive if statements. How would you sum those examples?
概括
func MoreThanOnce(vs...bool) (result bool){
for i:=0; i<len(vs); i++{
for j:=i+1; j<len(vs); j++{
if i!=j{ // this `if` could be omitted
result = result || vs[i] && vs[j]
}
}
}
return
}
这是问的吗?
在这种情况下,我有 3 个布尔变量(已设置为 true
或 false
)
此处的目标是确定是否有多个布尔变量设置为 true
现在我写了以下内容,它确实有效:
boolval := 0
if *firstbool {
boolval++
}
if *secondbool {
boolval++
}
if *thirdbool {
boolval++
}
if boolval > 1 {
// More than 1 of the bool vars are true
}
如果我正在写连续的 if{}
语句,我总是会标记我的逻辑,所以我想我会问问你们这些天才如何完成这个。
identify if more than one of the set of bool vars are set to true
比如写一个set函数:
package main
import "fmt"
func nTrue(b ...bool) int {
n := 0
for _, v := range b {
if v {
n++
}
}
return n
}
func main() {
v1, v2, v3 := true, false, true
fmt.Println(nTrue(v1, v2, v3))
if nTrue(v1, v2, v3) > 1 {
// . . .
}
// Or
if n := nTrue(v1, v2, v3); n > 1 {
// . . .
}
// Or
n := nTrue(v1, v2, v3)
if n > 1 {
// . . .
}
}
游乐场:https://play.golang.org/p/g3WCN6BgGly
输出:
2
例如范围超过集合,
package main
import "fmt"
func main() {
v1, v2, v3 := true, false, true
boolval := 0
for _, v := range []bool{v1, v2, v3} {
if v {
boolval++
}
}
if boolval > 1 {
// . . .
}
fmt.Println(boolval > 1, boolval)
}
游乐场:https://play.golang.org/p/R6UGb8YYEFw
输出:
true 2
取决于您如何获取 firstbool
等的值。 al,您应该在这里采用更惯用的方法。考虑通道和 goroutines 可以在后台处理会计工作。如果你的布尔值是一些更重的操作的结果,那么做这样的事情可能是有意义的:
package main
import "fmt"
func firstFunc(ch chan bool) {
// assume this works, true!
ch <- true
}
func secondFunc(ch chan bool) {
// assume this fails, false!
ch <- false
}
func thirdFunc(ch chan bool) {
// assume this works, true!
ch <- true
}
func listener(ch chan bool, numCallers int) <-chan bool {
outch := make(chan bool)
THRESHOLD := 2
go func(outch chan<- bool) {
count := 0
trues := 0
for count < numCallers && trues < THRESHOLD {
val := <-ch
if val {
trues++
}
count++
}
outch <- trues >= THRESHOLD
}(outch)
return outch
}
func main() {
ch := make(chan bool)
resultch := listener(ch, 3)
go firstFunc(ch)
go secondFunc(ch)
go thirdFunc(ch)
if <-resultch {
fmt.Println("Two or more processes succeeded")
}
}
然而,这是方式过度设计的简单需求,因此仅当此模式适合您的应用程序的较大设计时才考虑此模式。
也许我误会了什么,但这个问题看起来像是布尔代数的练习。
首先:让我们弄清楚"sum"是什么意思
The goal here is to identify if more than one of the set of bool vars are set to true
所以"sum"实际上意味着:"more than once or "两倍或更多
其二:我们直接写"More than Once"
func MoreThanOnce(a, b, c bool) bool {
return (
a&&(b||c)) ||
(a||b)&&c ||
(a||c)&&b
}
第三:简化
func MoreThanOnce(a, b, c bool) bool { return a&&b || a&&c || b&&c}
结果
一行,没有if
s,没有频道,没有指针。
这是想要的吗?
更新
来自@peterSO 评论:
In the example, there are three successive if statements. Perhaps there are four, or seven, or forty-two successive if statements. How would you sum those examples?
概括
func MoreThanOnce(vs...bool) (result bool){
for i:=0; i<len(vs); i++{
for j:=i+1; j<len(vs); j++{
if i!=j{ // this `if` could be omitted
result = result || vs[i] && vs[j]
}
}
}
return
}
这是问的吗?