Add solutions up to day 7

This commit is contained in:
Stanislav Nikolov 2022-12-07 13:55:13 +02:00
parent a330f6baa2
commit a251968f48
9 changed files with 1394 additions and 20 deletions

View File

@ -1,19 +0,0 @@
package day5
type Solver struct {
}
func (s *Solver) ParseInput(input []string) {
}
func (s *Solver) SolvePart1() any {
var total int
return total
}
func (s *Solver) SolvePart2() any {
var total int
return total
}

112
day5/day5.go Normal file
View File

@ -0,0 +1,112 @@
package day5
import (
"strconv"
"strings"
)
type Solver struct {
instructions []Instruction
stacks []Stack
}
type Instruction struct {
count, from, to int
}
type Stack struct {
containers []string
}
func (s *Stack) putAtBottom(container string) {
s.containers = append([]string{container}, s.containers...)
}
func (s *Stack) putAtTop(container string) {
s.containers = append(s.containers, container)
}
func (s *Stack) putNAtTop(containers []string) {
s.containers = append(s.containers, containers...)
}
func (s *Stack) popFromTop() string {
c := s.containers[len(s.containers)-1]
s.containers = s.containers[:len(s.containers)-1]
return c
}
func (s *Stack) popNFromTop(n int) []string {
// a b c d; n == 2; len() = 4; indexes = len() - n, :
c := s.containers[len(s.containers)-n:]
s.containers = s.containers[:len(s.containers)-n]
return c
}
func (s *Stack) peekTop() string {
return s.containers[len(s.containers)-1]
}
func (s *Solver) ParseInput(input []string) {
var containerList []string
var instructionsLineIndex int
for i, line := range input {
if line == "" {
instructionsLineIndex = i + 1
break
}
containerList = append(containerList, line)
}
stackCountLine := []byte(containerList[len(containerList)-1])
numStacks, _ := strconv.Atoi(string(stackCountLine[len(stackCountLine)-2]))
s.stacks = make([]Stack, numStacks)
for i := 0; i < len(containerList)-1; i++ {
for _s := 0; _s < numStacks; _s += 1 {
// 0 -> 1; 1 -> 5; 2 -> 9
c := string([]byte(containerList[i])[4*_s+1])
if c != " " {
s.stacks[_s].putAtBottom(c)
}
}
}
for _, line := range input[instructionsLineIndex:] {
tokens := strings.Split(line, " ")
count, _ := strconv.Atoi(tokens[1])
from, _ := strconv.Atoi(tokens[3])
to, _ := strconv.Atoi(tokens[5])
s.instructions = append(s.instructions, Instruction{count, from, to})
}
}
func (s *Solver) SolvePart1() any {
for _, instr := range s.instructions {
for c := 0; c < instr.count; c += 1 {
x := s.stacks[instr.from-1].popFromTop()
s.stacks[instr.to-1].putAtTop(x)
}
}
var r string
for _, s := range s.stacks {
r += s.peekTop()
}
return r
}
func (s *Solver) SolvePart2() any {
for _, instr := range s.instructions {
x := s.stacks[instr.from-1].popNFromTop(instr.count)
s.stacks[instr.to-1].putNAtTop(x)
}
var r string
for _, s := range s.stacks {
r += s.peekTop()
}
return r
}

39
day6/day7.go Normal file
View File

@ -0,0 +1,39 @@
package day6
import "math/bits"
type Solver struct {
inputLine []byte
}
func (s *Solver) ParseInput(input []string) {
s.inputLine = []byte(input[0])
}
func (s *Solver) solve(numNeeded int) any {
for i := numNeeded - 1; i < len(s.inputLine); i++ {
var seenMap uint32
for j := i - numNeeded + 1; j <= i; j++ {
bitValue := uint32(1 << (s.inputLine[j] - 'a'))
if seenMap&bitValue > 0 {
break
}
seenMap |= bitValue
}
if bits.OnesCount32(seenMap) == numNeeded {
return i + 1
}
}
return -1
}
func (s *Solver) SolvePart1() any {
return s.solve(4)
}
func (s *Solver) SolvePart2() any {
return s.solve(14)
}

1
day6/prod.in.txt Normal file
View File

@ -0,0 +1 @@
tzltzltthfthtdtstftbfbnffdjjvnvcccnznpndppsvvlnvlnvndntnllwffvwwcpwccssqbqnbbwzbwwfjjscspspfsfvvzjvvmjvjwjljbbbqtbbcqbccdqcdcpddnvnjvvqwwbrbggjllhbbzlblrrrcwwrfrmffgddfsddnqnqpnnmzzwlzwzqwqgqnngnfnvnhvvfnvvszzrbrqbqnbbrsbsvssgngwgqwqbqsbsvbbdvdfvdvbbqlqdlqdllnppwcclwlvwlwjlwwdjjjcschhhmrrnnrznzlnnwmnwnfngghngnpggmrrzrttdbdtddjhdhrrqddnhnjjntjtbtmtffwcfcnfcnfnjjfnjfjjhrhhgfgttgmttltfllfqfnqqcbbrlblrbrcrssrllhddmnddmcdddvttfdfqfmqqcncggczczdccvhcvcjvvgnnqttltcchzhjjwmmqvqtqnqbbhddcqdccnwccttgwwzssncncjjprjjpbprrndnrnrhnhrnhngnhhbjbccpmpmrppjvpjpqjjsvjjhttcclmmqzzlggtqqqgdqqbhhtmmqfmqmwmjwmjmmnsmsvsrrvpvhhtshhhmqmdqqqqlfffwgwhwjjrfjfmfrmffgzzjvzznqqwggcvcnvvcpvpjpjbpbrpbrrzhhcffqqlzzrmzrmzmzrrqdqrqnqrnrnqnrnsrrnjrrgllgqlljldjjmvvqbqhhsmsmddsfdddcmmphhtjhjzhjjjhcjjzppwhwvvdnvnvpnvnlnvnffrjjtzzdqzzngzgqghhmvvgwwqhwhlhvvfzzdpzddtbdtbtvtlvlqlllvvdvsdsslccbscsbbcggldlvvdccdscdsdzsddpggcfggnffpjpnpcncfcqqlvvszzbpbqbcqczcqzcqzqqlrlwwbgglrrbgbhhlbbsffrprtpppdwdhwhbbpssvbvnntbbfnfddmmfcfcjfftbfbdbccngcgjcjtjftjffrwwtwlwddczcnzczpzcpccrqcrczrzcrzzhnntgtqgtgztgzzcpphshwswfwqqnzngzzbpzzpqpzqznzdzmzqqjzzhnhvnnqjnnrdrcctdtppsffzvvwvbbpttsrsspsddfvvfllrtlljpjlplcctthbbgbqgbgmmpwpvvghvhfhwfwcwvwrvwrvvcgccdncddbmbmfmlffgqggrzgzhhzfzdfzfhhzdhzhjzjhhbffrtrjtthssbpspddpttrggdndsnnjwwzrwrvvmqvmvdvhvjvnnqmmhrhrzzzwttnftfddsdfsfjsjcccvhvgvgzvgzvzbvvhwhbbpccfjfllgmlggtbggdsgsmmmnznqnhqhrqhrrtthwhqqvzqvvvqgqffpvptvpvwvbvsscsnnhlnhhzrzjrjrllcffpqpbpsbbflblppqffbqqpttccdgcgdgfdfgdgjddjljpljppdspddflftllhchmcmwcwddrqqsdsswwmwwwjdjvdvwwcgcddmhhqtqvqmvvnffqppnvpphpnnshsmhmdhmdddlnlmnmsnnpttlfttnqnhqnqrnrddplplbpbdpdhppccbnbwwpwzwgwdgdnggcmmtnmnznmzmwmrmtrrjppjgjmggndgnnjzzrczzftztzgzvgvddgmdgmgpmmgjmmnrrmvmnvvhqqggsnnplnlnbbrcbbpphssnqsnspnncfchhvjjdjvjfjddbjbddhlllpdnrhtzhqpphzfbjclncdlrbtzhcwslpnstdvjslnzfrvfdlmpgpfhrqtjvqvjlqgdcjrbjtjrgvbfwjzsvrbmffnhvjqnshvdjbgwmpwlfjznngzpqbvlztnvgvjsnwvhpfwbhfsmjgwwjdrrwbtvpwtzvjfhwrmnrhdsvgpgdsfgndmffqfplsgjrsvztzlznqsrbldbmmhqmjtrzscrbwlpgztlrvllprnhzsvtnvwzmjwqhqpjqhntcrscwcdnwzpvbdczzcmzrmdwthdtszqzftcsfbwfqggpcntfrgwpmjpdzjnczwcjmdjnrqjfwqbznznmcdvzqlpqschnmcfqjjrjwfmqqftfdhdzffvshqbmrgrpvlgqcgsbsngttvcpjswdgrhbblrhjllfbzngqjzzbdwtnlnrbpftvwbmrhvcnntdrbvtrtpcsqdsrvpsgggfpwcbzhwhwmmmmmgjzgdtwnzjdwjfljghbjvjnsgshmdpztnbbrnwfvzhtzqpzttftdmcmqzlnrgncwwtpwqrgmpmwwchwhbbbblcndbsrrqtnztcmqhvdwfcswnswvhqdtqfdrhjgczqvrzqczmnpcgbwntjvlsfrzrrjtsvfzfmbwwsftwqvttpjvbggrlcspnfhwwmrhdbbhdcjvmrhppvcmtmfhszjlcjjsdqfvjttcmffwzfpmjmjzhcrqmhhwzhjlnwphvvhmrbllsvpjljthjndffrdbmdjncnmdtcwfwjdwnrdlvqsbzczlhwrtpnzfwzzwbrqpglgvrjsnsprvwszmlrjcdgzwchmcqrjdlzqfvqwwfszpptprhcfsdfcrnhvhgvcdwgnqzjtmgznltbjjqwzlljrqcmpdncshzvsmvjwlmvtwbtjcgmqfslvwcfqpljzdjmdvqjlztbsbshcwhlvzcmzljvrrhrbzwvthgtnszpcrrdwcmtdncdzlbdscfbhrlqttcfshqrsgvzhlcnvfhppdqvblsznmctftmnslwgbmbgshgwvmzpdnmqmjgqnvrwprmbzrdprrbcwnslczvzgnssjqqzdrlntrnsrgbjjcpqvnqwvnwgslchqzbphcqsbvgvwzlnsndfrhqjvtlnqpcsgswzfvhjmfgwgfvhjgzntdbztmjsbmtwlfmvvgvztvwwmqclcgctqbvljgfngcvfqlmmvqmbtrnnbhqjjndzqhvvdztjgvwgrtltfrlzrjcpgwvpqwmcwmqccjtjhhbrrqphlpljvhjzpdfcdsgzfpnzdzhfdqjsnrvmwstrmmwmlhbvrjbtnmvwcqnzqzzpwzjdnfhqwwlsvgnnjgffzcnrtbjfwllnrgppchqwnfpwpgnfbvwcbjrlscnwlswjmnrcrhtdhgpzvgtfcqzgqtwvlhrgbmjvvzhrlzfvmrdjjctvfwsgmjwbqslhmjlcvlwrdqfmbhcfrmrvqtslplwpsgrfmntmtvmvqttbspmftgqdzlcfplcvvfmmjttwqjpdtjzzsfjcprvbwdvfrpzddhwrlmsnpjzqgdlfdzvdjnjtgtfflzzvjlmnnvmglrptsnppwscznltcvzfjmwshnsqsvsjpqwsqlbwzslhgrdcbbvcjspqfntbcpwwrphgpmwbpqdcfvvtlsgpfshtcrdftsltwnbnmzfwcwlmrhlntmmnnpsdchvntcwbnmjdgwcmzzvbrhbdbmlgwppzwsqvcccdbfzfsfhtmbppnwbtjvrvjtmddhmrjdqgnmrnjjpqsgtbgcvtclzzstlpldtqbnnvqjfbjcfzblvcwhjphzcgwfljjhzzmwdcrzsssznztcwpjlbcffnlmsfjbmtvhhcljmtqdprdmdgwgpnnlmhgwpsgprfqnspmntrdjwjmrflsbfpqhzswbsrdbdhjmvtwmjjnmpllgfllzgwwmswjcmggbrvsbbhjmsdzzpbhbrlphwdsmjdzsqjfrmdmpljnwscjrhdvzqbhhvpmhwqfrrhzlncrrrzhmjdwqjcbsqjbhbdbjzpslrnnbzctnnlhqmqqbdzfbrpfgwsrdglnplpspnnqhtbhzhzgtchcbqcmmcmvlllczqbtmbstzmnlhhhbmmbtjwnbgwjbfhgvfhqlsgdnnrsgghjzjlqfwbbgztdqzbhhwhcwtjwsgstjpzcjjvqbpfpvlqfqshvfzbwmfcwfgqvgmbppfvzgzznzhsqbvzlztsnmnrbgqzbmbhlvqhfncdfcpttgzpvvzdbhvqdtqsblqvrsrnmsfbqhrpvlzffdzptzghvmbmdzjrsqzhqddqm

1
day6/test.in.txt Normal file
View File

@ -0,0 +1 @@
mjqjpqmgbljsphdztnvjfqwrcgsmlb

124
day7/day7.go Normal file
View File

@ -0,0 +1,124 @@
package day7
import (
"fmt"
"path/filepath"
"strconv"
"strings"
)
type Solver struct {
dirCache map[string]*Dir
}
type Sizable interface {
Size() int
fmt.Stringer
}
type Dir struct {
name string
contents []Sizable
}
func (d *Dir) Size() int {
total := 0
for _, c := range d.contents {
total += c.Size()
}
return total
}
func (d *Dir) String() string {
return fmt.Sprintf("%s (dir, size=%d) (%s)", d.name, d.Size(), d.contents)
}
type File struct {
name string
size int
}
func (f *File) Size() int {
return f.size
}
func (f *File) String() string {
return fmt.Sprintf("%s (file, size=%d)", f.name, f.Size())
}
func (s *Solver) ParseInput(input []string) {
s.dirCache = make(map[string]*Dir)
location := ""
var currentDir *Dir
for _, line := range input {
tokens := strings.Split(line, " ")
if tokens[0] == "$" {
switch tokens[1] {
case "cd":
location = filepath.Clean(filepath.Join(location, tokens[2]))
case "ls":
if _, ok := s.dirCache[location]; !ok {
s.dirCache[location] = &Dir{name: filepath.Base(location)}
}
currentDir, _ = s.dirCache[location]
}
} else {
if tokens[0] == "dir" {
name := tokens[1]
dir := &Dir{name: name}
s.dirCache[filepath.Join(location, name)] = dir
currentDir.contents = append(currentDir.contents, dir)
} else {
size, _ := strconv.Atoi(tokens[0])
currentDir.contents = append(currentDir.contents, &File{tokens[1], size})
}
}
}
}
func (s *Solver) SolvePart1() any {
const cutoffSize = 100000
rootDir := s.dirCache["/"]
dirsAtSize := getDirectoriesAtSize(rootDir, 0, cutoffSize)
var total int
for _, d := range dirsAtSize {
total += d.Size()
}
return total
}
func getDirectoriesAtSize(dir *Dir, minSize, maxSize int) []*Dir {
dirs := make([]*Dir, 0)
if (minSize == 0 || dir.Size() >= minSize) && (maxSize == 0 || dir.Size() <= maxSize) {
dirs = append(dirs, dir)
}
for _, c := range dir.contents {
if d, ok := c.(*Dir); ok {
dirs = append(dirs, getDirectoriesAtSize(d, minSize, maxSize)...)
}
}
return dirs
}
func (s *Solver) SolvePart2() any {
const totalSpace = 70000000
const neededFreeSpace = 30000000
rootDir := s.dirCache["/"]
additionalSpaceToFree := neededFreeSpace - (totalSpace - rootDir.Size())
dirsAtSize := getDirectoriesAtSize(rootDir, additionalSpaceToFree, 0)
minSize := totalSpace
for _, d := range dirsAtSize {
if d.Size() < minSize {
minSize = d.Size()
}
}
return minSize
}

1089
day7/prod.in.txt Normal file

File diff suppressed because it is too large Load Diff

23
day7/test.in.txt Normal file
View File

@ -0,0 +1,23 @@
$ cd /
$ ls
dir a
14848514 b.txt
8504156 c.dat
dir d
$ cd a
$ ls
dir e
29116 f
2557 g
62596 h.lst
$ cd e
$ ls
584 i
$ cd ..
$ cd ..
$ cd d
$ ls
4060174 j
8033020 d.log
5626152 d.ext
7214296 k

View File

@ -11,6 +11,8 @@ import (
"snikolov.me/aoc2022/day3" "snikolov.me/aoc2022/day3"
"snikolov.me/aoc2022/day4" "snikolov.me/aoc2022/day4"
"snikolov.me/aoc2022/day5" "snikolov.me/aoc2022/day5"
"snikolov.me/aoc2022/day6"
"snikolov.me/aoc2022/day7"
"snikolov.me/aoc2022/utils" "snikolov.me/aoc2022/utils"
) )
@ -50,6 +52,8 @@ func solve(args Args, inputFileName string) {
3: &day3.Solver{}, 3: &day3.Solver{},
4: &day4.Solver{}, 4: &day4.Solver{},
5: &day5.Solver{}, 5: &day5.Solver{},
6: &day6.Solver{},
7: &day7.Solver{},
} }
solver, ok := solvers[args.DayNumber] solver, ok := solvers[args.DayNumber]
if !ok { if !ok {
@ -75,5 +79,5 @@ func solve(args Args, inputFileName string) {
return return
} }
fmt.Printf("%s: %d\n", time.Now().Sub(startTime), solution) fmt.Printf("%s: %v\n", time.Now().Sub(startTime), solution)
} }