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/day4"
|
||||
"snikolov.me/aoc2022/day5"
|
||||
"snikolov.me/aoc2022/day6"
|
||||
"snikolov.me/aoc2022/day7"
|
||||
|
||||
"snikolov.me/aoc2022/utils"
|
||||
)
|
||||
|
|
@ -50,6 +52,8 @@ func solve(args Args, inputFileName string) {
|
|||
3: &day3.Solver{},
|
||||
4: &day4.Solver{},
|
||||
5: &day5.Solver{},
|
||||
6: &day6.Solver{},
|
||||
7: &day7.Solver{},
|
||||
}
|
||||
solver, ok := solvers[args.DayNumber]
|
||||
if !ok {
|
||||
|
|
@ -75,5 +79,5 @@ func solve(args Args, inputFileName string) {
|
|||
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