Add solutions up to day 7
This commit is contained in:
parent
a330f6baa2
commit
bd6707e814
19
day5/day4.go
19
day5/day4.go
|
|
@ -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
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
tzltzltthfthtdtstftbfbnffdjjvnvcccnznpndppsvvlnvlnvndntnllwffvwwcpwccssqbqnbbwzbwwfjjscspspfsfvvzjvvmjvjwjljbbbqtbbcqbccdqcdcpddnvnjvvqwwbrbggjllhbbzlblrrrcwwrfrmffgddfsddnqnqpnnmzzwlzwzqwqgqnngnfnvnhvvfnvvszzrbrqbqnbbrsbsvssgngwgqwqbqsbsvbbdvdfvdvbbqlqdlqdllnppwcclwlvwlwjlwwdjjjcschhhmrrnnrznzlnnwmnwnfngghngnpggmrrzrttdbdtddjhdhrrqddnhnjjntjtbtmtffwcfcnfcnfnjjfnjfjjhrhhgfgttgmttltfllfqfnqqcbbrlblrbrcrssrllhddmnddmcdddvttfdfqfmqqcncggczczdccvhcvcjvvgnnqttltcchzhjjwmmqvqtqnqbbhddcqdccnwccttgwwzssncncjjprjjpbprrndnrnrhnhrnhngnhhbjbccpmpmrppjvpjpqjjsvjjhttcclmmqzzlggtqqqgdqqbhhtmmqfmqmwmjwmjmmnsmsvsrrvpvhhtshhhmqmdqqqqlfffwgwhwjjrfjfmfrmffgzzjvzznqqwggcvcnvvcpvpjpjbpbrpbrrzhhcffqqlzzrmzrmzmzrrqdqrqnqrnrnqnrnsrrnjrrgllgqlljldjjmvvqbqhhsmsmddsfdddcmmphhtjhjzhjjjhcjjzppwhwvvdnvnvpnvnlnvnffrjjtzzdqzzngzgqghhmvvgwwqhwhlhvvfzzdpzddtbdtbtvtlvlqlllvvdvsdsslccbscsbbcggldlvvdccdscdsdzsddpggcfggnffpjpnpcncfcqqlvvszzbpbqbcqczcqzcqzqqlrlwwbgglrrbgbhhlbbsffrprtpppdwdhwhbbpssvbvnntbbfnfddmmfcfcjfftbfbdbccngcgjcjtjftjffrwwtwlwddczcnzczpzcpccrqcrczrzcrzzhnntgtqgtgztgzzcpphshwswfwqqnzngzzbpzzpqpzqznzdzmzqqjzzhnhvnnqjnnrdrcctdtppsffzvvwvbbpttsrsspsddfvvfllrtlljpjlplcctthbbgbqgbgmmpwpvvghvhfhwfwcwvwrvwrvvcgccdncddbmbmfmlffgqggrzgzhhzfzdfzfhhzdhzhjzjhhbffrtrjtthssbpspddpttrggdndsnnjwwzrwrvvmqvmvdvhvjvnnqmmhrhrzzzwttnftfddsdfsfjsjcccvhvgvgzvgzvzbvvhwhbbpccfjfllgmlggtbggdsgsmmmnznqnhqhrqhrrtthwhqqvzqvvvqgqffpvptvpvwvbvsscsnnhlnhhzrzjrjrllcffpqpbpsbbflblppqffbqqpttccdgcgdgfdfgdgjddjljpljppdspddflftllhchmcmwcwddrqqsdsswwmwwwjdjvdvwwcgcddmhhqtqvqmvvnffqppnvpphpnnshsmhmdhmdddlnlmnmsnnpttlfttnqnhqnqrnrddplplbpbdpdhppccbnbwwpwzwgwdgdnggcmmtnmnznmzmwmrmtrrjppjgjmggndgnnjzzrczzftztzgzvgvddgmdgmgpmmgjmmnrrmvmnvvhqqggsnnplnlnbbrcbbpphssnqsnspnncfchhvjjdjvjfjddbjbddhlllpdnrhtzhqpphzfbjclncdlrbtzhcwslpnstdvjslnzfrvfdlmpgpfhrqtjvqvjlqgdcjrbjtjrgvbfwjzsvrbmffnhvjqnshvdjbgwmpwlfjznngzpqbvlztnvgvjsnwvhpfwbhfsmjgwwjdrrwbtvpwtzvjfhwrmnrhdsvgpgdsfgndmffqfplsgjrsvztzlznqsrbldbmmhqmjtrzscrbwlpgztlrvllprnhzsvtnvwzmjwqhqpjqhntcrscwcdnwzpvbdczzcmzrmdwthdtszqzftcsfbwfqggpcntfrgwpmjpdzjnczwcjmdjnrqjfwqbznznmcdvzqlpqschnmcfqjjrjwfmqqftfdhdzffvshqbmrgrpvlgqcgsbsngttvcpjswdgrhbblrhjllfbzngqjzzbdwtnlnrbpftvwbmrhvcnntdrbvtrtpcsqdsrvpsgggfpwcbzhwhwmmmmmgjzgdtwnzjdwjfljghbjvjnsgshmdpztnbbrnwfvzhtzqpzttftdmcmqzlnrgncwwtpwqrgmpmwwchwhbbbblcndbsrrqtnztcmqhvdwfcswnswvhqdtqfdrhjgczqvrzqczmnpcgbwntjvlsfrzrrjtsvfzfmbwwsftwqvttpjvbggrlcspnfhwwmrhdbbhdcjvmrhppvcmtmfhszjlcjjsdqfvjttcmffwzfpmjmjzhcrqmhhwzhjlnwphvvhmrbllsvpjljthjndffrdbmdjncnmdtcwfwjdwnrdlvqsbzczlhwrtpnzfwzzwbrqpglgvrjsnsprvwszmlrjcdgzwchmcqrjdlzqfvqwwfszpptprhcfsdfcrnhvhgvcdwgnqzjtmgznltbjjqwzlljrqcmpdncshzvsmvjwlmvtwbtjcgmqfslvwcfqpljzdjmdvqjlztbsbshcwhlvzcmzljvrrhrbzwvthgtnszpcrrdwcmtdncdzlbdscfbhrlqttcfshqrsgvzhlcnvfhppdqvblsznmctftmnslwgbmbgshgwvmzpdnmqmjgqnvrwprmbzrdprrbcwnslczvzgnssjqqzdrlntrnsrgbjjcpqvnqwvnwgslchqzbphcqsbvgvwzlnsndfrhqjvtlnqpcsgswzfvhjmfgwgfvhjgzntdbztmjsbmtwlfmvvgvztvwwmqclcgctqbvljgfngcvfqlmmvqmbtrnnbhqjjndzqhvvdztjgvwgrtltfrlzrjcpgwvpqwmcwmqccjtjhhbrrqphlpljvhjzpdfcdsgzfpnzdzhfdqjsnrvmwstrmmwmlhbvrjbtnmvwcqnzqzzpwzjdnfhqwwlsvgnnjgffzcnrtbjfwllnrgppchqwnfpwpgnfbvwcbjrlscnwlswjmnrcrhtdhgpzvgtfcqzgqtwvlhrgbmjvvzhrlzfvmrdjjctvfwsgmjwbqslhmjlcvlwrdqfmbhcfrmrvqtslplwpsgrfmntmtvmvqttbspmftgqdzlcfplcvvfmmjttwqjpdtjzzsfjcprvbwdvfrpzddhwrlmsnpjzqgdlfdzvdjnjtgtfflzzvjlmnnvmglrptsnppwscznltcvzfjmwshnsqsvsjpqwsqlbwzslhgrdcbbvcjspqfntbcpwwrphgpmwbpqdcfvvtlsgpfshtcrdftsltwnbnmzfwcwlmrhlntmmnnpsdchvntcwbnmjdgwcmzzvbrhbdbmlgwppzwsqvcccdbfzfsfhtmbppnwbtjvrvjtmddhmrjdqgnmrnjjpqsgtbgcvtclzzstlpldtqbnnvqjfbjcfzblvcwhjphzcgwfljjhzzmwdcrzsssznztcwpjlbcffnlmsfjbmtvhhcljmtqdprdmdgwgpnnlmhgwpsgprfqnspmntrdjwjmrflsbfpqhzswbsrdbdhjmvtwmjjnmpllgfllzgwwmswjcmggbrvsbbhjmsdzzpbhbrlphwdsmjdzsqjfrmdmpljnwscjrhdvzqbhhvpmhwqfrrhzlncrrrzhmjdwqjcbsqjbhbdbjzpslrnnbzctnnlhqmqqbdzfbrpfgwsrdglnplpspnnqhtbhzhzgtchcbqcmmcmvlllczqbtmbstzmnlhhhbmmbtjwnbgwjbfhgvfhqlsgdnnrsgghjzjlqfwbbgztdqzbhhwhcwtjwsgstjpzcjjvqbpfpvlqfqshvfzbwmfcwfgqvgmbppfvzgzznzhsqbvzlztsnmnrbgqzbmbhlvqhfncdfcpttgzpvvzdbhvqdtqsblqvrsrnmsfbqhrpvlzffdzptzghvmbmdzjrsqzhqddqm
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
mjqjpqmgbljsphdztnvjfqwrcgsmlb
|
||||||
|
|
@ -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 (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
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -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
|
||||||
6
main.go
6
main.go
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue