day20, example 2 first four steps pass

This commit is contained in:
efim
2023-12-20 09:45:52 +00:00
parent 1d7a0ef7b8
commit 00e60657fa
3 changed files with 131 additions and 0 deletions

View File

@@ -10,8 +10,50 @@ import (
func Run() int {
fmt.Println("hello from dya 20")
filename := "day20/example2"
modules := ReadModules(filename)
log.Print("got modules:\n", modules)
low, high := PropagateButtonPress(modules)
log.Printf("got low %d and high %d\n", low, high)
log.Print("modules after single button press:\n", modules)
return 0
}
func PropagateButtonPress(modules map[string]Module) (lowSignalsCount, highSignalsCount int) {
signals := []Signal{{From: "button", To: "broadcast", PulseType: LowPulse}}
lowSignalsCount += 1
for len(signals) > 0 {
curSignal := signals[0]
signals = signals[1:]
log.Printf("%s -%s-> %s", curSignal.From, curSignal.PulseType, curSignal.To)
receivingModule, found := modules[curSignal.To]
if !found {
panic(fmt.Sprintf("signal %+v can't find it's recepient\n", curSignal))
}
newSignals := receivingModule.Receive(curSignal)
// all newSignals will have same type
newSignalsAmount := len(newSignals)
if newSignalsAmount > 0 {
signals = append(signals, newSignals...)
someNewSignal := newSignals[0]
if someNewSignal.PulseType == HighPulse {
highSignalsCount += newSignalsAmount
} else {
lowSignalsCount += newSignalsAmount
}
}
}
return
}
// process sends single `low pulse` directly to "broadcast"
func ReadModules(filename string) map[string]Module {
@@ -46,3 +88,12 @@ func ReadModules(filename string) map[string]Module {
return result
}
func InitStuffs(allModules map[string]Module) {
for _, module := range allModules {
if conjunction, ok := module.(*Conjunction); ok {
conjunction.RegisterInputs(allModules)
}
}
}