This commit is contained in:
Gregory 2022-02-09 21:03:38 +02:00
parent 4285976d91
commit a9d9d67a46
3 changed files with 61 additions and 0 deletions

View file

@ -36,3 +36,45 @@ func D3(input string) int64 {
return gammaNum * epsilonNum return gammaNum * epsilonNum
} }
func rating(binaries []string, position int, path func([]string, []string) []string) string {
if len(binaries) == 1 {
return binaries[0]
}
ones := make([]string, 0, len(binaries)/2) // allocate at least half original slice
zeroes := make([]string, 0, len(binaries)/2)
for _, binary := range binaries {
if binary[position] == '1' {
ones = append(ones, binary)
} else {
zeroes = append(zeroes, binary)
}
}
return rating(path(ones, zeroes), position+1, path)
}
func D3P2(input string) int64 {
binaries := strings.Split(strings.TrimSpace(input), "\n")
o2predicate := func(ones, zeroes []string) []string {
if len(ones) == len(zeroes) || len(ones) > len(zeroes) {
return ones
}
return zeroes
}
co2predicate := func(ones, zeroes []string) []string {
if len(ones) == len(zeroes) || len(ones) > len(zeroes) {
return zeroes
}
return ones
}
o2rating, _ := strconv.ParseInt(rating(binaries, 0, o2predicate), 2, 64)
co2rating, _ := strconv.ParseInt(rating(binaries, 0, co2predicate), 2, 64)
return o2rating * co2rating
}

View file

@ -23,3 +23,21 @@ func TestD3(t *testing.T) {
assert.EqualValues(t, 198, D3(input)) assert.EqualValues(t, 198, D3(input))
} }
func TestD3P2(t *testing.T) {
input := `
00100
11110
10110
10111
10101
01111
00111
11100
10000
11001
00010
01010`
assert.EqualValues(t, 230, D3P2(input))
}

View file

@ -27,5 +27,6 @@ func main() {
fmt.Printf("day 2: %v\n", d2.D2(client.Day(2))) fmt.Printf("day 2: %v\n", d2.D2(client.Day(2)))
fmt.Printf("day 2 part 2: %v\n", d2.D2P2(client.Day(2))) fmt.Printf("day 2 part 2: %v\n", d2.D2P2(client.Day(2)))
fmt.Printf("day 3: %v\n", d3.D3(client.Day(3))) fmt.Printf("day 3: %v\n", d3.D3(client.Day(3)))
fmt.Printf("day 3 part 2: %v\n", d3.D3P2(client.Day(3)))
} }