aoc2015/day11/day.go
2020-12-26 11:07:04 +01:00

69 lines
1.4 KiB
Go

package day11
import (
"fmt"
"tools"
)
func incrementPassword(password []byte) {
allFine := false
index := len(password) - 1
for !allFine {
password[index]++
if password[index] > 122 {
password[index] = 'a'
index--
} else {
allFine = true
}
}
}
func checkPasswordValid(password []byte) bool {
ascendingTripple := false
firstDouble := 0
doubleDouble := false
for i := 0; i < len(password); i++ {
if password[i] == 'i' || password[i] == 'o' || password[i] == 'l' {
return false
}
if !ascendingTripple && i < len(password)-3 {
if password[i] == password[i+1]-1 && password[i+1] == password[i+2]-1 {
ascendingTripple = true
}
}
if !doubleDouble && i > 0 {
if password[i] == password[i-1] {
if firstDouble > 0 && firstDouble+2 < i {
doubleDouble = true
} else {
firstDouble = i
}
}
}
}
return ascendingTripple && doubleDouble
}
func Part1(puzzle tools.AoCPuzzle) interface{} {
currentPassword := []byte(puzzle.GetInputArray()[0])
for !checkPasswordValid(currentPassword) {
incrementPassword(currentPassword)
}
return fmt.Sprintf("%s", string(currentPassword))
}
func Part2(puzzle tools.AoCPuzzle) interface{} {
currentPassword := []byte(Part1(puzzle).(string))
incrementPassword(currentPassword)
for !checkPasswordValid(currentPassword) {
incrementPassword(currentPassword)
}
return fmt.Sprintf("%s", string(currentPassword))
}