diff options
author | Julien Dessaux | 2021-12-14 19:36:39 +0100 |
---|---|---|
committer | Julien Dessaux | 2021-12-14 19:36:39 +0100 |
commit | 408f4a856c876ef3f59fc43f424ab8b647cc3e7a (patch) | |
tree | 0620564071a0b48b6b619f026dea1222aa3da7ca /2021/14/first.go | |
parent | Added solutions for 13th day: Transparent Origami (diff) | |
download | advent-of-code-408f4a856c876ef3f59fc43f424ab8b647cc3e7a.tar.gz advent-of-code-408f4a856c876ef3f59fc43f424ab8b647cc3e7a.tar.bz2 advent-of-code-408f4a856c876ef3f59fc43f424ab8b647cc3e7a.zip |
Added solutions for 14th day: Extended Polymerization
Diffstat (limited to '2021/14/first.go')
-rw-r--r-- | 2021/14/first.go | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/2021/14/first.go b/2021/14/first.go new file mode 100644 index 0000000..e6256ac --- /dev/null +++ b/2021/14/first.go @@ -0,0 +1,94 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "sort" + "strings" +) + +type transform struct { + first byte + second byte + res byte + count int +} + +type letter struct { + value byte + count int +} + +var ( + pairs []transform + letters []letter +) + +func main() { + scanner := bufio.NewScanner(os.Stdin) + + scanner.Scan() + polymer := scanner.Text() +out: + for i := 0; i < len(polymer); i++ { + for j := range letters { + if letters[j].value == polymer[i] { + letters[j].count++ + continue out + } + } + letters = append(letters, letter{polymer[i], 1}) + } + scanner.Scan() + + for scanner.Scan() { + line := strings.Split(scanner.Text(), " -> ") + pairs = append(pairs, transform{line[0][0], line[0][1], line[1][0], 0}) + } + for i := 0; i < len(polymer)-1; i++ { + for j, v := range pairs { + if v.first == polymer[i] && v.second == polymer[i+1] { + pairs[j].count++ + } + } + } + newPairs := make([]transform, len(pairs)) + copy(newPairs, pairs) + for s := 1; s < 10; s++ { + for j := range newPairs { + newPairs[j].count = 0 + } + for _, a := range pairs { + if a.count > 0 { + for j, b := range pairs { + if b.first == a.first && b.second == a.res { + newPairs[j].count += a.count + break + } + } + for j, b := range pairs { + if b.first == a.res && b.second == a.second { + newPairs[j].count += a.count + break + } + } + } + } + copy(pairs, newPairs) + out2: + for _, v := range pairs { + for j := range letters { + if letters[j].value == v.res { + letters[j].count += v.count + continue out2 + } + } + letters = append(letters, letter{v.res, v.count}) + } + } + sort.Slice(letters, func(i, j int) bool { + return letters[i].count < letters[j].count + }) + fmt.Println(letters[len(letters)-1].count - letters[0].count) +} |