Big update: Adding all advent of codes to same repo
This commit is contained in:
107
AdventOfCode2015/day5/day5.go
Normal file
107
AdventOfCode2015/day5/day5.go
Normal file
@@ -0,0 +1,107 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user