package main import ( "fmt" "strings" h "git.bullercodeworks.com/brian/adventofcode/helpers" ) func main() { inp := h.StdinToStringSlice() validate(inp, h.OptArgNumber(1, "1")) } func validate(input []string, p string) { policy := h.Atoi(p) var good, bad []string for _, v := range input { if policy == 1 { if validSledRentalPolicy(v) { good = append(good, v) } else { bad = append(bad, v) } } else { if validTobogganPolicy(v) { good = append(good, v) } else { bad = append(bad, v) } } } fmt.Printf("There are %d valid passwords\n", len(good)) } func validSledRentalPolicy(line string) bool { min := -1 max := -1 req := "" var buff string for i := 0; i < len(line); i++ { if req != "" { buff = buff + string(line[i]) continue } switch line[i] { case '-': min = h.Atoi(buff) buff = "" case ' ': if max == -1 { max = h.Atoi(buff) buff = "" } case ':': req = buff buff = "" default: buff = buff + string(line[i]) } } reqCount := strings.Count(buff, req) return reqCount >= min && reqCount <= max } func validTobogganPolicy(line string) bool { idx1 := -1 idx2 := -1 req := byte(' ') var buff string for i := 0; i < len(line); i++ { if req != ' ' && line[i] != ' ' { buff = buff + string(line[i]) continue } switch line[i] { case '-': idx1 = h.Atoi(buff) buff = "" case ' ': if idx2 == -1 { idx2 = h.Atoi(buff) buff = "" } case ':': req = line[i-1] buff = "" default: buff = buff + string(line[i]) } } match1, match2 := buff[idx1-1] == req, buff[idx2-1] == req return match1 != match2 }