Big update: Adding all advent of codes to same repo
This commit is contained in:
140
AdventOfCode2020/day21/day21.go
Normal file
140
AdventOfCode2020/day21/day21.go
Normal file
@@ -0,0 +1,140 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"slices"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func contains(arr []string, search string) bool {
|
||||
for _, val := range arr {
|
||||
if val == search {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func remove(arr []string, item string) []string {
|
||||
newThing := make([]string, 0)
|
||||
for _, val := range arr {
|
||||
if val != item {
|
||||
newThing = append(newThing, val)
|
||||
}
|
||||
}
|
||||
return newThing
|
||||
}
|
||||
|
||||
func mergeSets(set1 []string, set2 []string) []string {
|
||||
merged := make([]string, 0)
|
||||
for _, val := range set1 {
|
||||
if (contains(set2, val)) {
|
||||
merged = append(merged, val)
|
||||
}
|
||||
}
|
||||
|
||||
return merged
|
||||
}
|
||||
|
||||
func isMapSingleValue(myMap map[string][]string) bool {
|
||||
for _, v := range myMap {
|
||||
if len(v) > 1 {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func main() {
|
||||
content, err := os.ReadFile("./input.txt")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
_lines := strings.Split(string(content), "\n")
|
||||
lines := _lines[:len(_lines) - 1]
|
||||
|
||||
myMap := make(map[string][]string)
|
||||
|
||||
totalIngredients := make([]string, 0)
|
||||
|
||||
for _, line := range lines {
|
||||
split := strings.Split(line, " (contains ")
|
||||
if (len(split) == 0) {
|
||||
continue
|
||||
}
|
||||
|
||||
ingredients := strings.Split(split[0], " ")
|
||||
for _, i := range ingredients {
|
||||
totalIngredients = append(totalIngredients, i)
|
||||
}
|
||||
|
||||
formatted := strings.Split(strings.TrimSuffix(split[1], ")"), ", ")
|
||||
for _, v := range formatted {
|
||||
val, exists := myMap[v]
|
||||
if !exists {
|
||||
myMap[v] = ingredients
|
||||
continue
|
||||
}
|
||||
|
||||
newSets := mergeSets(val, ingredients)
|
||||
myMap[v] = newSets
|
||||
|
||||
if (len(newSets) == 1) {
|
||||
found := newSets[0]
|
||||
for key, mapVal := range myMap {
|
||||
if key == v {
|
||||
continue
|
||||
}
|
||||
if (contains(mapVal, found)) {
|
||||
myMap[key] = remove(mapVal, found)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for !isMapSingleValue(myMap) {
|
||||
for firstK, v := range myMap {
|
||||
if len(v) == 1 {
|
||||
for k, i := range myMap {
|
||||
if k == firstK {
|
||||
continue
|
||||
}
|
||||
myMap[k] = remove(i, v[0])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
allMapValues := make([]string, 0)
|
||||
for _, v := range myMap {
|
||||
for _, j := range v {
|
||||
if (!contains(allMapValues, j)) {
|
||||
allMapValues = append(allMapValues, j)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Printf("%+v\n", myMap)
|
||||
|
||||
for _, v := range allMapValues {
|
||||
totalIngredients = remove(totalIngredients, v)
|
||||
}
|
||||
|
||||
myIngredientList := make([]string, 0)
|
||||
for k := range myMap {
|
||||
myIngredientList = append(myIngredientList, k)
|
||||
}
|
||||
slices.Sort(myIngredientList)
|
||||
|
||||
part2 := ""
|
||||
for _, v := range myIngredientList {
|
||||
part2 += myMap[v][0] + ","
|
||||
}
|
||||
part2 = strings.TrimSuffix(part2, ",")
|
||||
|
||||
fmt.Println(len(totalIngredients))
|
||||
fmt.Println(part2)
|
||||
}
|
||||
Reference in New Issue
Block a user