You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
2.7 KiB
Go
126 lines
2.7 KiB
Go
package day20
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"gitea.paas.celticinfo.fr/oabrivard/aoc2023/utils"
|
|
)
|
|
|
|
func TestParseModule(t *testing.T) {
|
|
lines := []string{
|
|
`broadcaster -> a, b, c`,
|
|
`%a -> b`,
|
|
`%b -> c`,
|
|
`%c -> inv`,
|
|
`&inv -> a`,
|
|
}
|
|
|
|
result := parseModules(lines)
|
|
|
|
if len(result) != 5 {
|
|
t.Fatalf("expected 5, got %d", len(result))
|
|
}
|
|
}
|
|
|
|
func Test1Part1(t *testing.T) {
|
|
lines := []string{
|
|
`broadcaster -> a, b, c`,
|
|
`%a -> b`,
|
|
`%b -> c`,
|
|
`%c -> inv`,
|
|
`&inv -> a`,
|
|
}
|
|
|
|
result, count := Part1(lines, 1)
|
|
|
|
if count != 32 {
|
|
t.Fatalf("expected 32, got %d", count)
|
|
}
|
|
|
|
if result["a"].status || result["b"].status || result["c"].status {
|
|
t.Fatalf("expected flip-flop a, b and c to be off, got %v %v %v", result["a"].status, result["b"].status, result["c"].status)
|
|
}
|
|
}
|
|
|
|
func Test2Part1(t *testing.T) {
|
|
lines := []string{
|
|
`broadcaster -> a, b, c`,
|
|
`%a -> b`,
|
|
`%b -> c`,
|
|
`%c -> inv`,
|
|
`&inv -> a`,
|
|
}
|
|
|
|
_, count := Part1(lines, 1000)
|
|
|
|
if count != 32000000 {
|
|
t.Fatalf("expected 32000000, got %d", count)
|
|
}
|
|
}
|
|
|
|
func Test3Part1(t *testing.T) {
|
|
lines := []string{
|
|
"broadcaster -> a",
|
|
"%a -> inv, con",
|
|
"&inv -> b",
|
|
"%b -> con",
|
|
"&con -> output",
|
|
}
|
|
|
|
result, _ := Part1(lines, 3)
|
|
|
|
if !result["output"].status || !result["a"].status || result["b"].status {
|
|
t.Fatalf("expected flip-flop a to be on, b to be off and output to be on, got %v %v %v", result["a"].status, result["b"].status, result["output"].status)
|
|
}
|
|
|
|
result, _ = Part1(lines, 4)
|
|
|
|
if !result["output"].status || result["a"].status || result["b"].status {
|
|
t.Fatalf("expected flip-flop a and b to be off and output to be on, got %v %v %v", result["a"].status, result["b"].status, result["output"].status)
|
|
}
|
|
}
|
|
|
|
func Test4Part1(t *testing.T) {
|
|
lines := []string{
|
|
"broadcaster -> a",
|
|
"%a -> inv, con",
|
|
"&inv -> b",
|
|
"%b -> con",
|
|
"&con -> output",
|
|
}
|
|
|
|
_, count := Part1(lines, 1000)
|
|
|
|
if count != 11687500 {
|
|
t.Fatalf("expected 11687500, got %d", count)
|
|
}
|
|
}
|
|
|
|
func TestPart1WithInput(t *testing.T) {
|
|
lines := utils.ReadLines("input.txt")
|
|
|
|
_, count := Part1(lines, 1000)
|
|
|
|
if count != 925955316 {
|
|
t.Fatalf("expected 925955316, got %d", count)
|
|
}
|
|
}
|
|
|
|
func TestPart2WithInput(t *testing.T) {
|
|
lines := utils.ReadLines("input.txt")
|
|
|
|
Part2(lines, 5000)
|
|
|
|
// use firt four different values printed during simulation that starts with "qn from"
|
|
// then find the LCM of the values. The LCM is the solution to this problem.
|
|
// Found it thanks to explanation from jwezorek and JuniorBirdman1115 on
|
|
// https://www.reddit.com/r/adventofcode/comments/18mmfxb/2023_day_20_solutions/
|
|
/*
|
|
qn from jx : 3907
|
|
qn from qz : 3911
|
|
qn from tt : 3931
|
|
qn from cq : 4021
|
|
LCM is 241528477694627 (computed it with https://www.calculatorsoup.com/calculators/math/lcm.php)
|
|
*/
|
|
}
|