12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- package main
- import (
- "fmt"
- "io/ioutil"
- "log"
- "os"
- "strings"
- )
- func readInput(file string) (map[string]int, map[string][]string) {
- content, err := ioutil.ReadFile(file)
- if err != nil {
- log.Fatal(err)
- }
- lines := strings.Split(string(content), "\n")
- template := make(map[string]int)
- input := make(map[string][]string)
- readingTemplate := true
- for _, line := range lines {
- if line == "" {
- readingTemplate = false
- continue
- }
- if readingTemplate {
- for i := 0; i < len(line)-1; i++ {
- template[string(line[i:i+2])] += 1
- }
- continue
- }
- parts := strings.Split(line, " -> ")
- if len(parts) != 2 {
- log.Fatal("Invalid line: ", line)
- }
- input[parts[0]] = []string{fmt.Sprintf("%s%s", parts[0][0], parts[1]), fmt.Sprintf("%s%s", parts[0][1], parts[1])}
- }
- return template, input
- }
- func countElements(template map[string]int) (int, int) {
- counts := make(map[byte]int)
- for k, v := range template {
- counts[k[0]] += v
- counts[k[1]] += v
- }
- smallest := counts['N']
- largest := counts['N']
- for _, c := range counts {
- if c < smallest {
- smallest = c
- }
- if c > largest {
- largest = c
- }
- }
- return smallest, largest
- }
- func part1(template map[string]int, input map[string][]string) (map[string]int, int) {
- for i := 0; i < 10; i++ {
- for k, v1 := range template {
- for _, v2 := range input[k] {
- template[v2] += v1
- }
- }
- }
- smallest, largest := countElements(template)
- fmt.Println(smallest, largest)
- return template, largest - smallest
- }
- func main() {
- if len(os.Args) < 2 {
- log.Fatal("Please provide a file name as argument")
- }
- template, input := readInput(os.Args[1])
- var diff int
- _, diff = part1(template, input)
- fmt.Println("Part1:", diff)
- //fmt.Println("Part1:", part2(template, input))
- }
|