Untitled

 avatar
unknown
golang
2 years ago
1.4 kB
75
Indexable
func Run() {
	lines := util.MustReadLines(4)
	fmt.Printf("PART ONE: %d\n", ptOne(lines))
	fmt.Printf("PART TWO: %d\n", ptTwo(lines))
}

func countMatches(line string) int {
	ls := strings.Split(
		strings.Split(line, "|")[0],
		":")[1]
	rs := strings.Split(line, "|")[1]

	left := toInts(ls)
	right := toInts(rs)

	matches := 0
	nums := map[int]bool{}
	for _, i := range left {
		nums[i] = true
	}
	for _, i := range right {
		if _, ok := nums[i]; ok {
			matches++
		}
	}
	return matches
}

func toInts(s string) []int {
	l := strings.Fields(s)
	ints := make([]int, len(l))
	for i, v := range l {
		if v == "" {
			continue
		}
		ints[i] = util.MustParseInt(v)
	}
	return ints
}

func calculateScore(numMatches int) int {
	score := 0
	for i := 0; i < numMatches; i++ {
		if score == 0 {
			score = 1
		} else {
			score *= 2
		}
	}
	return score
}

func ptOne(lines []string) int {
	total := 0
	for _, line := range lines {
		numMatches := countMatches(line)
		total += calculateScore(numMatches)
	}
	return total
}

func ptTwo(lines []string) int {
	cardsCollected := map[int]int{}
	for i := 1; i <= len(lines); i++ {
		cardsCollected[i] = 1
	}

	for i, line := range lines {
		cardNum := i + 1
		numMatches := countMatches(line)
		for j := 0; j < numMatches; j++ {
			newCardNum := cardNum + j + 1
			cardsCollected[newCardNum] += cardsCollected[cardNum]
		}
	}
	retval := 0
	for _, v := range cardsCollected {
		retval += v
	}
	return retval
}
Editor is loading...
Leave a Comment