advent of code day 3: i might be r-slurred edition

idk how to do multi line spoilers lol



letters = ['','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']

total_score = 0

team = []

for line in open("input.txt"):
    team.append(line.strip())

for i in range(2, len(team), 3):
    for letter in team[i]:
        if letter in team[i-2] and letter in team[i-1]:
            total_score += letters.index(letter)
            break

print(total_score)

some real caveman shit but it works

80
Jump in the discussion.

No email address required.

LONG POST ALERT, I'm actually kind of proud of the "contains" subfunction


package three

import (
	"bufio"
	"bytes"
	"fmt"
	"os"
)

func pos(ch byte) int {
	var alph string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

	return (bytes.IndexByte([]byte(alph), ch) + 1)
}

func One() int {
	var deliver int

	fp, _ := os.Open("three.txt")
	defer fp.Close()

	rd := bufio.NewScanner(fp)

	for rd.Scan() {
		line := rd.Text()
		item_len := len(line) / 2
		left := make([]byte, item_len)
		right := make([]byte, item_len)

		for i, v := range line {
			if i < item_len {
				left[i] = byte(v)
			} else {
				i %= item_len
				right[i] = byte(v)
			}
		}

		for i, v := range left {
			if bytes.ContainsRune(right, rune(v)) {
				deliver += pos(left[i])
				break
			}
		}
	}

	return deliver
}

func Two() int {
	var deliver int
	elf := make(map[int]string)

	fp, _ := os.Open("three.txt")
	defer fp.Close()

	rd := bufio.NewScanner(fp)

	for e := 0; rd.Scan(); e++ {
		elf[e] = rd.Text()
	}

	contains := func(a string, b string, c string) (byte, error) {
		var master string
		var children []string

		if len(a) > len(b) && len(a) > len(c) {
			master = a
			children = []string{b, c}
		} else if len(b) > len(a) && len(b) > len(c) {
			master = b
			children = []string{a, c}
		} else {
			master = c
			children = []string{a, b}
		}

		for _, v := range master {
			var a_common, b_common byte

			if bytes.ContainsRune([]byte(children[0]), v) {
				a_common = byte(v)
			}
			if bytes.ContainsRune([]byte(children[1]), v) {
				b_common = byte(v)
			}

			if a_common == b_common && a_common > 0 {
				return a_common, nil
			}
		}

		return 'a', fmt.Errorf("no common????")
	}

	var elf_head int

	for g := 0; g < (len(elf) / 3); g++ {

		common, err := contains(elf[elf_head], elf[elf_head+1], elf[elf_head+2])

		if err == nil {
			deliver += pos(common)
		}

		elf_head += 3
	}

	return deliver
}
Jump in the discussion.

No email address required.

Jesse what the frick are you talking about??

Jump in the discussion.

No email address required.

Link copied to clipboard
Action successful!
Error, please refresh the page and try again.