108 lines
1.8 KiB
Go
108 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"time"
|
|
)
|
|
|
|
func main() {
|
|
|
|
fmt.Println("Day 5")
|
|
start := time.Now()
|
|
|
|
dat, err := ioutil.ReadFile("day5.txt")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
lines := bytes.Split(dat, []byte("\n"))
|
|
part1 := 0
|
|
part2 := 0
|
|
|
|
for _, value := range lines {
|
|
|
|
vowels := 0
|
|
twiceInARow := false
|
|
forbiddenPhrases := false
|
|
|
|
for i := 0; i < len(value); i++ {
|
|
current := value[i]
|
|
if current == []byte("a")[0] || current == []byte("e")[0] || current == []byte("i")[0] || current == []byte("o")[0] || current == []byte("u")[0] {
|
|
vowels++
|
|
}
|
|
|
|
if i != 0 {
|
|
if value[i-1] == value[i] {
|
|
twiceInARow = true
|
|
}
|
|
|
|
last2 := []byte{value[i-1], value[i]}
|
|
if compare(last2, []byte("ab")) || compare(last2, []byte("cd")) || compare(last2, []byte("pq")) || compare(last2, []byte("xy")) {
|
|
forbiddenPhrases = true
|
|
break
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if !forbiddenPhrases {
|
|
if twiceInARow && vowels >= 3 {
|
|
part1++
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
elapsed := time.Since(start)
|
|
fmt.Printf("Part 1: %v %v \n", part1, elapsed)
|
|
|
|
start = time.Now()
|
|
|
|
for _, value := range lines {
|
|
|
|
repeatedPair := false
|
|
repeatedLetterWithGap := false
|
|
|
|
var pairs [][]byte
|
|
for i := 0; i < len(value)-1; i++ {
|
|
pairs = append(pairs, value[i:i+2])
|
|
}
|
|
|
|
for i := 0; i < len(pairs)-1; i++ {
|
|
for j := i + 2; j < len(pairs); j++ {
|
|
if compare(pairs[i], pairs[j]) {
|
|
repeatedPair = true
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
for i := 0; i < len(value)-2; i++ {
|
|
if value[i] == value[i+2] {
|
|
repeatedLetterWithGap = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if repeatedLetterWithGap && repeatedPair {
|
|
part2++
|
|
}
|
|
}
|
|
|
|
elapsed = time.Since(start)
|
|
fmt.Printf("Part 2: %v %v", part2, elapsed)
|
|
|
|
}
|
|
|
|
func compare(slice1 []byte, slice2 []byte) bool {
|
|
for i := 0; i < len(slice1) && i < len(slice2); i++ {
|
|
if slice1[i] != slice2[i] {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|