sundries

Assorted little morsels for your enjoyment

git clone https://code.pdelong.com/sundries.git

 1package main
 2
 3import (
 4	"fmt"
 5	"math/big"
 6	"sync"
 7)
 8
 9const (
10	NONE = iota
11	DARK = iota
12	MILK = iota
13)
14
15const (
16	maxDark         = 8
17	maxMilk         = 2
18	totalChocolates = maxDark + maxMilk
19)
20
21var ansChan chan *big.Rat
22
23func recurse(milkEaten, darkEaten int64, prob *big.Rat, cur int, str string) {
24	if milkEaten == maxMilk && darkEaten == maxDark {
25		fmt.Println(str)
26		if cur == MILK {
27			ansChan <- prob
28		}
29		return
30	}
31
32	if darkEaten < maxDark {
33		newProb := new(big.Rat)
34		newProb.Mul(prob, big.NewRat(maxDark-darkEaten, totalChocolates-darkEaten-milkEaten))
35		switch cur {
36		case NONE:
37			fallthrough
38		case DARK:
39			recurse(milkEaten, darkEaten+1, newProb, DARK, str+"D")
40		case MILK:
41			recurse(milkEaten, darkEaten, newProb, NONE, str+"d")
42		}
43	}
44
45	if milkEaten < maxMilk {
46		newProb := new(big.Rat)
47		newProb.Mul(prob, big.NewRat(maxMilk-milkEaten, totalChocolates-darkEaten-milkEaten))
48		switch cur {
49		case NONE:
50			fallthrough
51		case MILK:
52			recurse(milkEaten+1, darkEaten, newProb, MILK, str+"M")
53		case DARK:
54			recurse(milkEaten, darkEaten, newProb, NONE, str+"m")
55		}
56	}
57
58}
59
60func main() {
61	ansChan = make(chan *big.Rat)
62	var wg sync.WaitGroup
63	wg.Add(1)
64	go func() {
65		total := big.NewRat(0, 1)
66		for ans := range ansChan {
67			total.Add(total, ans)
68		}
69		fmt.Printf("%d/%d\n", total.Num(), total.Denom())
70		wg.Done()
71	}()
72
73	recurse(0, 0, big.NewRat(1, 1), NONE, "")
74	close(ansChan)
75	wg.Wait()
76}