95 lines
1.6 KiB
Go
95 lines
1.6 KiB
Go
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
|
|
}
|