2021 - Day 8
This commit is contained in:
parent
4d574e294f
commit
d504270908
9
2021/8/go.mod
Normal file
9
2021/8/go.mod
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
module AoC/2021/8
|
||||||
|
|
||||||
|
require AoC/2021/common v0.0.0
|
||||||
|
|
||||||
|
require github.com/joho/godotenv v1.4.0 // indirect
|
||||||
|
|
||||||
|
replace AoC/2021/common v0.0.0 => ../common
|
||||||
|
|
||||||
|
go 1.17
|
2
2021/8/go.sum
Normal file
2
2021/8/go.sum
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=
|
||||||
|
github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
212
2021/8/main.go
Normal file
212
2021/8/main.go
Normal file
|
@ -0,0 +1,212 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
aoc "AoC/2021/common"
|
||||||
|
"bufio"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func inSlice(a string, slice []string) bool {
|
||||||
|
for _, b := range slice {
|
||||||
|
if a == b {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns elements that are present in a or b
|
||||||
|
func union(a []string, b []string) []string {
|
||||||
|
for _, c := range b {
|
||||||
|
if !inSlice(c, a) {
|
||||||
|
a = append(a, c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return all elements that are present in a, but not in b
|
||||||
|
func complement(a []string, b []string) []string {
|
||||||
|
var temp []string
|
||||||
|
for _, c := range a {
|
||||||
|
if !inSlice(c, b) {
|
||||||
|
temp = append(temp, c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return temp
|
||||||
|
}
|
||||||
|
|
||||||
|
func match(a []string, b []string) bool {
|
||||||
|
if len(a) != len(b) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, s := range a {
|
||||||
|
if !inSlice(s, b) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
aoc := aoc.New(2021, 8)
|
||||||
|
|
||||||
|
aoc.Test(`acedgfb cdfbe gcdfa fbcad dab cefabd cdfgeb eafb cagedb ab | cdfeb fcadb cdfeb cdbaf`, []int{0, 5353})
|
||||||
|
|
||||||
|
aoc.Test(`be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe
|
||||||
|
edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc
|
||||||
|
fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg
|
||||||
|
fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb
|
||||||
|
aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea
|
||||||
|
fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb
|
||||||
|
dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe
|
||||||
|
bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef
|
||||||
|
egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb
|
||||||
|
gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce
|
||||||
|
`, []int{26, 61229})
|
||||||
|
|
||||||
|
aoc.Solution(1, func(input *bufio.Scanner) int {
|
||||||
|
count := 0
|
||||||
|
for input.Scan() {
|
||||||
|
line := input.Text()
|
||||||
|
lineOutput := strings.TrimSpace(strings.Split(line, "|")[1])
|
||||||
|
outputs := strings.Split(lineOutput, " ")
|
||||||
|
|
||||||
|
for _, output := range outputs {
|
||||||
|
// Detect unique digits 1, 4 ,7 and 8
|
||||||
|
if len(output) == 2 || len(output) == 3 || len(output) == 4 || len(output) == 7 {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return count
|
||||||
|
})
|
||||||
|
|
||||||
|
aoc.Solution(2, func(input *bufio.Scanner) int {
|
||||||
|
sum := 0
|
||||||
|
for input.Scan() {
|
||||||
|
line := input.Text()
|
||||||
|
parts := strings.Split(line, "|")
|
||||||
|
|
||||||
|
lineDigits := strings.TrimSpace(parts[0])
|
||||||
|
digits := strings.Split(lineDigits, " ")
|
||||||
|
|
||||||
|
mapping := make(map[int] []string)
|
||||||
|
count := make(map[string] int)
|
||||||
|
|
||||||
|
for _, digit := range digits {
|
||||||
|
// Determine part of the mappnig using unique characters
|
||||||
|
if len(digit) == 2 {
|
||||||
|
mapping[1] = strings.Split(digit, "")
|
||||||
|
} else if len(digit) == 3 {
|
||||||
|
mapping[7] = strings.Split(digit, "")
|
||||||
|
} else if len(digit) == 4 {
|
||||||
|
mapping[4] = strings.Split(digit, "")
|
||||||
|
} else if len(digit) == 7 {
|
||||||
|
mapping[8] = strings.Split(digit, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count how often each segment appears
|
||||||
|
for _, c := range digit {
|
||||||
|
count[string(c)]++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Figure out what some of the elements map to
|
||||||
|
{
|
||||||
|
// b is the only segments that appears 6 times
|
||||||
|
var b string
|
||||||
|
for k, v := range count {
|
||||||
|
if v == 6 {
|
||||||
|
b = k
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// e is the only segments that appears 4 times
|
||||||
|
var e string
|
||||||
|
for k, v := range count {
|
||||||
|
if v == 4 {
|
||||||
|
e = k
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// f is the only segment that appears 9 times
|
||||||
|
var f string
|
||||||
|
for k, v := range count {
|
||||||
|
if v == 9 {
|
||||||
|
f = k
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Both a and c appear 8 times, however using the known characters we can find a
|
||||||
|
a := complement(union(mapping[4], mapping[7]), mapping[4])[0]
|
||||||
|
|
||||||
|
// Both a and c appear 8 times, however since we know a we can find c
|
||||||
|
var c string
|
||||||
|
for k, v := range count {
|
||||||
|
if v == 8 && k != a {
|
||||||
|
c = k
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Both d and g apear 7 times, however using known characrers and the fact that we know e we can still find g
|
||||||
|
eg := complement(mapping[8], union(mapping[4], mapping[7]))
|
||||||
|
var g string
|
||||||
|
for _, c := range eg {
|
||||||
|
if c != e {
|
||||||
|
g = c
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Both d and g apear 7 times, however using known characrers and the fact that we know e we can still find d
|
||||||
|
bd := complement(mapping[4], mapping[1])
|
||||||
|
var d string
|
||||||
|
for _, c := range bd {
|
||||||
|
if c != b {
|
||||||
|
d = c
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// All segments are now known so we can fill in the rest of the map
|
||||||
|
mapping[0] = []string{a, b, c, e, f, g}
|
||||||
|
mapping[2] = []string{a, c, d, e, g}
|
||||||
|
mapping[3] = []string{a, c, d, f, g}
|
||||||
|
mapping[5] = []string{a, b, d, f, g}
|
||||||
|
mapping[6] = []string{a, b, d, e, f, g}
|
||||||
|
mapping[9] = []string{a, b, c, d, f, g}
|
||||||
|
}
|
||||||
|
|
||||||
|
lineOutput := strings.TrimSpace(parts[1])
|
||||||
|
outputs := strings.Split(lineOutput, " ")
|
||||||
|
|
||||||
|
// Using the completed mapping determine what the display is showing
|
||||||
|
display := 0
|
||||||
|
for _, output := range outputs {
|
||||||
|
for k, v := range mapping {
|
||||||
|
if !match(strings.Split(output, ""), v) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
display *= 10
|
||||||
|
display += k
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sum += display
|
||||||
|
}
|
||||||
|
|
||||||
|
return sum
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user