advent-20/solutions/day02.go

94 lines
2.0 KiB
Go

package solutions
import (
"strconv"
"strings"
)
func passwordPolicy1(input string) bool {
dashPosition := strings.Index(input, "-")
spacePosition := strings.Index(input, " ")
colonPosition := strings.Index(input, ":")
amountMin, err := strconv.Atoi(input[:dashPosition])
if err != nil {
panic("Error converting to int")
}
amountMax, err := strconv.Atoi(input[dashPosition+1 : spacePosition])
if err != nil {
panic("Error converting to int")
}
letter := input[spacePosition+1 : colonPosition]
rest := input[colonPosition+2:]
charMap := make(map[string]int)
for _, char := range strings.Split(rest, "") {
if _, ok := charMap[char]; ok {
charMap[char] += 1
} else {
charMap[char] = 1
}
}
charAmount := charMap[letter]
if charAmount >= amountMin && charAmount <= amountMax {
return true
}
return false
}
func Day02Part01(isTest bool) int {
input := ReadInput("02", isTest)
values := strings.Split(input, "\n")
correctPasswords := 0
for _, i := range values {
if passwordPolicy1(i) {
correctPasswords += 1
}
}
return correctPasswords
}
func passwordPolicy2(input string) bool {
dashPosition := strings.Index(input, "-")
spacePosition := strings.Index(input, " ")
colonPosition := strings.Index(input, ":")
firstIdx, err := strconv.Atoi(input[:dashPosition])
if err != nil {
panic("Error converting to int")
}
firstIdx -= 1
secondIdx, err := strconv.Atoi(input[dashPosition+1 : spacePosition])
if err != nil {
panic("Error converting to int")
}
secondIdx -= 1
letter := input[spacePosition+1 : colonPosition]
rest := input[colonPosition+2:]
firstIdxIsTrue := string(rest[firstIdx]) == letter
secondIdxIsTrue := string(rest[secondIdx]) == letter
return (firstIdxIsTrue && !secondIdxIsTrue) || (!firstIdxIsTrue && secondIdxIsTrue)
}
func Day02Part02(isTest bool) int {
input := ReadInput("02", isTest)
values := strings.Split(input, "\n")
correctPasswords := 0
for _, i := range values {
if passwordPolicy2(i) {
correctPasswords += 1
}
}
return correctPasswords
}