package main

import (
	"fmt"
	"strconv"
	"strings"

	helpers "git.bullercodeworks.com/brian/adventofcode/helpers"
)

func main() {
	inp := helpers.StdinToStringSlice()
	part1(inp)
	fmt.Println()
	part2(inp)
}

func part1(inp []string) {
	var total int
	for i := range inp {
		r, pts := parse(inp[i])
		subs := []int{pts[0]}
		for _, o := range pts[1:] {
			var nxSubs []int
			for _, s := range subs {
				nxSubs = append(nxSubs, s+o)
				if s == 0 {
					s = 1
				}
				nxSubs = append(nxSubs, s*o)
			}
			subs = nxSubs
		}
		for _, s := range subs {
			if s == r {
				total += s
				break
			}
		}
	}
	fmt.Println("# Part 1")
	fmt.Println(total)
}

func part2(inp []string) {
	var total int
	for i := range inp {
		r, pts := parse(inp[i])
		subs := []int{pts[0]}
		for _, o := range pts[1:] {
			var nxSubs []int
			for _, s := range subs {
				nxSubs = append(nxSubs, s+o)
				if s == 0 {
					s = 1
				}
				nxSubs = append(nxSubs, s*o)
				ni, _ := strconv.Atoi(fmt.Sprintf("%d%d", s, o))
				nxSubs = append(nxSubs, ni)
			}
			subs = nxSubs
		}
		for _, s := range subs {
			if s == r {
				total += s
				break
			}
		}
	}
	fmt.Println("# Part 2")
	fmt.Println(total)
}

func parse(inp string) (int, []int) {
	var res int
	var rem string
	var pts []int
	var err error

	ptsStr := strings.Split(inp, ":")
	if res, err = strconv.Atoi(ptsStr[0]); err != nil {
		panic(err)
	}
	rem = ptsStr[1]
	ptsStr = strings.Split(rem, " ")
	for _, s := range ptsStr {
		p, err := strconv.Atoi(s)
		if err != nil {
			continue
		}
		pts = append(pts, p)
	}
	return res, pts
}