package main import ( "fmt" "balhau.net/tinker/hall" ) func main() { iterations := 1000 type SolutionCounter struct { Conservative int ChangerBefore int ChangerAfter int } counter := SolutionCounter{0, 0, 0} for i := 0; i < iterations; i++ { montyOne := hall.MontyHall{} montyTwo := hall.MontyHall{} conservative := hall.ConservativePlayer{} changer := hall.ChangerPlayer{} montyOne.SelectDoor() conservative.SelectDoor() montyTwo.SelectDoor() changer.SelectDoor() changerBefore := changer.GetDoor() conservativeBefore := conservative.GetDoor() openPortConservative := montyOne.OpenDoor(conservativeBefore) openPortChanger := montyTwo.OpenDoor(changerBefore) conservative.ChangeDoor(openPortConservative) changer.ChangeDoor(openPortChanger) if conservative.GetDoor() == montyOne.GetDoor() { counter.Conservative += 1 } if changer.GetDoor() == montyTwo.GetDoor() { counter.ChangerAfter += 1 } if changerBefore == montyTwo.GetDoor() { counter.ChangerBefore += 1 } conservSol := "x" changerSol := "x" if conservative.GetDoor() == montyOne.GetDoor() { conservSol = "o" } if changer.GetDoor() == montyTwo.GetDoor() { changerSol = "o" } fmt.Println(fmt.Sprintf("[Conservative: s=%d,p=%d,b=%d,a=%d] -- %s", montyOne.GetDoor(), openPortConservative, conservativeBefore, conservative.GetDoor(), conservSol)) fmt.Println(fmt.Sprintf("[Changer: s=%d,p=%d,b=%d,a=%d] -- %s", montyTwo.GetDoor(), openPortChanger, changerBefore, changer.GetDoor(), changerSol)) fmt.Println() } conservative_accuracy := (float32(counter.Conservative) / float32(iterations)) * 100 changer_before_accuracy := (float32(counter.ChangerBefore) / float32(iterations)) * 100 changer_after_accuracy := (float32(counter.ChangerAfter) / float32(iterations)) * 100 fmt.Printf(fmt.Sprintf("[Conservative: %d/%f, ChangerBefore: %d/%f, ChangerAfter: %d/%f]\n", counter.Conservative, conservative_accuracy, counter.ChangerBefore, changer_before_accuracy, counter.ChangerAfter, changer_after_accuracy)) }