package main import ( "bufio" "fmt" "log" "os" "strconv" "strings" ) var allBots []Bot var watch1, watch2 int //var outputBins map[int][]int func main() { input := stdinToStringSlice() watch1 = 61 watch2 = 17 //outputBins := make(map[int][]int) for i := range input { inst := strings.Fields(input[i]) if inst[0] == "bot" { // And instruction // make sure we have this bot botNum := inst[0] + inst[1] botIdx := findBotIdx(botNum) allBots[botIdx].giveLowTo = inst[5] + inst[6] allBots[botIdx].giveHighTo = inst[10] + inst[11] } } // Run sim for i := range input { inst := strings.Fields(input[i]) if inst[0] == "value" { val := atoi(inst[1]) botNum := inst[4] + inst[5] botIdx := findBotIdx(botNum) allBots[botIdx].chips = append(allBots[botIdx].chips, val) allBots[botIdx].Trigger() } } for i := range allBots { fmt.Println(allBots[i]) } } func findBotIdx(id string) int { fmt.Println("Find bot", id) for i := range allBots { if allBots[i].id == id { return i } } // We didn't find the bot b := new(Bot) b.id = id allBots = append(allBots, *b) return len(allBots) - 1 } type Bot struct { id string chips []int giveLowTo string giveHighTo string } func (b *Bot) Trigger() { if strings.HasPrefix(b.id, "output") { return } if len(b.chips) == 2 { low := b.chips[0] high := b.chips[1] if b.chips[0] > b.chips[1] { high = b.chips[0] low = b.chips[1] } giveLowIdx := findBotIdx(b.giveLowTo) allBots[giveLowIdx].chips = append(allBots[giveLowIdx].chips, low) giveHighIdx := findBotIdx(b.giveHighTo) allBots[giveHighIdx].chips = append(allBots[giveHighIdx].chips, high) allBots[giveLowIdx].Trigger() allBots[giveHighIdx].Trigger() } } func checkWatches(b *Bot) { if b.chips[0] == watch1 && b.chips[1] == watch2 || b.chips[0] == watch1 && b.chips[1] == watch2 { fmt.Println("Watch triggered:", b.id) } } func stdinToStringSlice() []string { var input []string scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { input = append(input, scanner.Text()) } return input } func itoa(i int) string { return strconv.Itoa(i) } func atoi(i string) int { var ret int var err error if ret, err = strconv.Atoi(i); err != nil { log.Fatal("Invalid Atoi") } return ret }