12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package main
- import (
- "fmt"
- "io/ioutil"
- "log"
- "os"
- "strings"
- )
- func readInput(file string) (string, map[string]string) {
- content, err := ioutil.ReadFile(file)
- if err != nil {
- log.Fatal(err)
- }
- lines := strings.Split(string(content), "\n")
- var template string
- input := make(map[string]string)
- readingTemplate := true
- for _, line := range lines {
- if line == "" {
- readingTemplate = false
- continue
- }
- if readingTemplate {
- template = line
- continue
- }
- parts := strings.Split(line, " -> ")
- if len(parts) != 2 {
- log.Fatal("Invalid line: ", line)
- }
- input[parts[0]] = parts[1]
- }
- return template, input
- }
- func process(template string, input map[string]string) string {
- var result []string
- for i := 0; i < len(template)-1; i++ {
- insert := input[template[i:i+2]]
- result = append(result, string(template[i]))
- result = append(result, insert)
- if i == len(template)-2 {
- result = append(result, string(template[i+1]))
- }
- }
- return strings.Join(result, "")
- }
- func countElements(template string) (int, int) {
- counts := make(map[rune]int)
- for _, c := range template {
- counts[c]++
- }
- 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 string, input map[string]string) int {
- result := template
- for i := 0; i < 10; i++ {
- result = process(result, input)
- }
- smallest, largest := countElements(result)
- return largest - smallest
- }
- func main() {
- if len(os.Args) < 2 {
- log.Fatal("Please provide a file name as argument")
- }
- template, input := readInput(os.Args[1])
- fmt.Println("Part1:", part1(template, input))
- }
|