day20, modules state comparations
This commit is contained in:
parent
00e60657fa
commit
f538945dff
|
@ -27,6 +27,7 @@ type Signal struct {
|
||||||
type Module interface {
|
type Module interface {
|
||||||
Receive(s Signal) []Signal
|
Receive(s Signal) []Signal
|
||||||
Outputs() []string
|
Outputs() []string
|
||||||
|
StateSnapshot() string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Modules
|
// Modules
|
||||||
|
@ -71,6 +72,10 @@ func (ff *FlipFlop)String() string {
|
||||||
return fmt.Sprintf("[flip-flop '%s' (on: %t) -> %s]", ff.Name, ff.IsOn, ff.OutputNames)
|
return fmt.Sprintf("[flip-flop '%s' (on: %t) -> %s]", ff.Name, ff.IsOn, ff.OutputNames)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ff *FlipFlop)StateSnapshot() string {
|
||||||
|
return ff.String()
|
||||||
|
}
|
||||||
|
|
||||||
func IsLineFlipFlop(line string) bool {
|
func IsLineFlipFlop(line string) bool {
|
||||||
return strings.HasPrefix(line, "%")
|
return strings.HasPrefix(line, "%")
|
||||||
}
|
}
|
||||||
|
@ -108,6 +113,9 @@ func (b *Broadcast)Outputs() []string {
|
||||||
func (b *Broadcast)String() string {
|
func (b *Broadcast)String() string {
|
||||||
return fmt.Sprintf("[broadcast -> %+v]", b.OutputNames)
|
return fmt.Sprintf("[broadcast -> %+v]", b.OutputNames)
|
||||||
}
|
}
|
||||||
|
func (b *Broadcast)StateSnapshot() string {
|
||||||
|
return b.String()
|
||||||
|
}
|
||||||
|
|
||||||
func IsLineBroadcast(line string) bool {
|
func IsLineBroadcast(line string) bool {
|
||||||
return strings.HasPrefix(line, "broadcaster")
|
return strings.HasPrefix(line, "broadcaster")
|
||||||
|
@ -174,6 +182,10 @@ func (c *Conjunction)String() string {
|
||||||
return fmt.Sprintf("[conjunction '%s' -> %+v]", c.Name, c.OutputNames)
|
return fmt.Sprintf("[conjunction '%s' -> %+v]", c.Name, c.OutputNames)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Conjunction)StateSnapshot() string {
|
||||||
|
return fmt.Sprintf("[conjunction '%s' -> %+v]", c.Name, c.MostRecentPulseFromInputIsHigh)
|
||||||
|
}
|
||||||
|
|
||||||
func IsLineConjunction(line string) bool {
|
func IsLineConjunction(line string) bool {
|
||||||
return strings.HasPrefix(line, "&")
|
return strings.HasPrefix(line, "&")
|
||||||
}
|
}
|
||||||
|
@ -207,6 +219,10 @@ func (b *Button)String() string {
|
||||||
return "[button]"
|
return "[button]"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *Button)StateSnapshot() string {
|
||||||
|
return b.String()
|
||||||
|
}
|
||||||
|
|
||||||
type Output struct {}
|
type Output struct {}
|
||||||
|
|
||||||
func (o *Output)Receive(s Signal) []Signal {
|
func (o *Output)Receive(s Signal) []Signal {
|
||||||
|
@ -221,3 +237,7 @@ func (o *Output)Outputs() []string {
|
||||||
func (o *Output)String() string {
|
func (o *Output)String() string {
|
||||||
return "[output]"
|
return "[output]"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o *Output)StateSnapshot() string {
|
||||||
|
return o.String()
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package day20
|
package day20
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -41,6 +42,8 @@ func TestPropagateButtonPressExample2FourSteps(t *testing.T) {
|
||||||
t.Log("got modules:\n", modules)
|
t.Log("got modules:\n", modules)
|
||||||
InitStuffs(modules)
|
InitStuffs(modules)
|
||||||
|
|
||||||
|
initialModulesState := ModulesState(modules)
|
||||||
|
|
||||||
low, high := PropagateButtonPress(modules)
|
low, high := PropagateButtonPress(modules)
|
||||||
t.Logf("got low %d and high %d\n", low, high)
|
t.Logf("got low %d and high %d\n", low, high)
|
||||||
t.Log("#1 button press:\n", modules)
|
t.Log("#1 button press:\n", modules)
|
||||||
|
@ -56,6 +59,10 @@ func TestPropagateButtonPressExample2FourSteps(t *testing.T) {
|
||||||
if !success {
|
if !success {
|
||||||
t.Errorf("expected low 4 got %d, high 2 got %d", low, high)
|
t.Errorf("expected low 4 got %d, high 2 got %d", low, high)
|
||||||
}
|
}
|
||||||
|
secondState := ModulesState(modules)
|
||||||
|
if initialModulesState == secondState {
|
||||||
|
t.Error("initial state should be different from second")
|
||||||
|
}
|
||||||
|
|
||||||
low, high = PropagateButtonPress(modules)
|
low, high = PropagateButtonPress(modules)
|
||||||
t.Logf("got low %d and high %d\n", low, high)
|
t.Logf("got low %d and high %d\n", low, high)
|
||||||
|
@ -64,6 +71,10 @@ func TestPropagateButtonPressExample2FourSteps(t *testing.T) {
|
||||||
if !success {
|
if !success {
|
||||||
t.Errorf("expected low 5 got %d, high 3 got %d", low, high)
|
t.Errorf("expected low 5 got %d, high 3 got %d", low, high)
|
||||||
}
|
}
|
||||||
|
thirdState := ModulesState(modules)
|
||||||
|
if initialModulesState == thirdState {
|
||||||
|
t.Error("initial state should be different from third")
|
||||||
|
}
|
||||||
|
|
||||||
low, high = PropagateButtonPress(modules)
|
low, high = PropagateButtonPress(modules)
|
||||||
t.Logf("got low %d and high %d\n", low, high)
|
t.Logf("got low %d and high %d\n", low, high)
|
||||||
|
@ -73,4 +84,12 @@ func TestPropagateButtonPressExample2FourSteps(t *testing.T) {
|
||||||
t.Errorf("expected low 4 got %d, high 2 got %d", low, high)
|
t.Errorf("expected low 4 got %d, high 2 got %d", low, high)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lastState := ModulesState(modules)
|
||||||
|
|
||||||
|
log.Print("initial modules state:\n", initialModulesState)
|
||||||
|
log.Print("after 4 steps modules state:\n", lastState)
|
||||||
|
if initialModulesState != lastState {
|
||||||
|
t.Error("expected state to be same after 4 steps for example 2")
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ func Run() int {
|
||||||
|
|
||||||
filename := "day20/example2"
|
filename := "day20/example2"
|
||||||
modules := ReadModules(filename)
|
modules := ReadModules(filename)
|
||||||
|
InitStuffs(modules)
|
||||||
log.Print("got modules:\n", modules)
|
log.Print("got modules:\n", modules)
|
||||||
|
|
||||||
low, high := PropagateButtonPress(modules)
|
low, high := PropagateButtonPress(modules)
|
||||||
|
@ -97,3 +98,14 @@ func InitStuffs(allModules map[string]Module) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ModulesState(allModules map[string]Module) string {
|
||||||
|
// relying on printing of map values to be ordered by key
|
||||||
|
// https://stackoverflow.com/a/54524991/2788805
|
||||||
|
states := make(map[string]string)
|
||||||
|
for name, module := range allModules {
|
||||||
|
states[name] = module.StateSnapshot()
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprint(states)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue