首页 » 技术分享 » 侦探调查罪案---采用程序计算

侦探调查罪案---采用程序计算

 

侦探调查了罪案的四位证人。从证人的话侦探得出的结论是:如果男管家说的是真话,那么厨师说的也是真话;厨师和园丁说的不可能都是真话;园丁和杂役不可能都在说谎;如果杂役说真话,那么厨师在说谎。侦探能判定这四位证人分别是在说谎还是在说真话吗?

package main

import (
	"fmt"
)

func main() {
	getBool := func(v int) bool {
		if v == 0 {
			return false
		}
		return true
	}

	for a := 0; a <= 1; a++ {
		for b := 0; b <= 1; b++ {
			for c := 0; c <= 1; c++ {
				for d := 0; d <= 1; d++ {
					err := logic(getBool(a), getBool(b), getBool(c), getBool(d))
					if err == nil {
						fmt.Printf("管家:%t, 厨师:%t, 园丁:%t, 杂役:%t\n", getBool(a), getBool(b), getBool(c), getBool(d))
					}
				}
			}
		}
	}
}


func logic(a /*管家*/, b /*厨师*/, c /*园丁*/, d /*杂役*/ bool) error {
	if a && !b {
		return fmt.Errorf("如果男管家[%t]说的是真话,那么厨师[%t]说的也是真话", a, b)
	}

	if b && c {
		return fmt.Errorf("厨师[%t]和园丁[%t]说的不可能都是真话", b, c)
	}

	if !c && !d {
		return fmt.Errorf("园丁[%t]和杂役[%t]不可能都在说谎", c, d)
	}

	if d && b {
		return fmt.Errorf("如果杂役[%t]说真话,那么厨师[%t]在说谎", d, b)
	}
	return nil
}
管家:false, 厨师:false, 园丁:false, 杂役:true
管家:false, 厨师:false, 园丁:true, 杂役:false
管家:false, 厨师:false, 园丁:true, 杂役:true

转载自原文链接, 如需删除请联系管理员。

原文链接:侦探调查罪案---采用程序计算,转载请注明来源!

1