Bootstrap and day 1 solution
This commit is contained in:
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
*.exe
|
||||
__debug_bin
|
||||
aoc2019
|
||||
debug.test
|
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
9
.idea/aoc2019.iml
generated
Normal file
9
.idea/aoc2019.iml
generated
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="WEB_MODULE" version="4">
|
||||
<component name="Go" enabled="true" />
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/aoc2019.iml" filepath="$PROJECT_DIR$/.idea/aoc2019.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
18
.vscode/launch.json
vendored
Normal file
18
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Launch",
|
||||
"type": "go",
|
||||
"request": "launch",
|
||||
"buildFlags": "",
|
||||
"mode": "auto",
|
||||
"program": "${workspaceFolder}",
|
||||
"env": {},
|
||||
"args": ["1"]
|
||||
}
|
||||
]
|
||||
}
|
47
days/01.go
Normal file
47
days/01.go
Normal file
@ -0,0 +1,47 @@
|
||||
package days
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"time"
|
||||
|
||||
"parnic.com/aoc2019/utilities"
|
||||
)
|
||||
|
||||
type Day01 struct {
|
||||
nums []int64
|
||||
}
|
||||
|
||||
func (d *Day01) Parse() {
|
||||
d.nums = utilities.GetIntLines("01p")
|
||||
time.Sleep(time.Microsecond * 500)
|
||||
}
|
||||
|
||||
func (d *Day01) calcFuel(mass int64) int64 {
|
||||
return int64(math.Floor(float64(mass)/3)) - 2
|
||||
}
|
||||
|
||||
func (d *Day01) Part1() string {
|
||||
var totalFuel int64
|
||||
for _, mass := range d.nums {
|
||||
fuel := d.calcFuel(mass)
|
||||
totalFuel += fuel
|
||||
}
|
||||
|
||||
return fmt.Sprintf("Fuel required: %s%d%s", utilities.TextBold, totalFuel, utilities.TextReset)
|
||||
}
|
||||
|
||||
func (d *Day01) Part2() string {
|
||||
var totalFuel int64
|
||||
for _, mass := range d.nums {
|
||||
for mass > 0 {
|
||||
fuel := d.calcFuel(mass)
|
||||
if fuel > 0 {
|
||||
totalFuel += fuel
|
||||
}
|
||||
mass = fuel
|
||||
}
|
||||
}
|
||||
|
||||
return fmt.Sprintf("Fuel required: %s%d%s", utilities.TextBold, totalFuel, utilities.TextReset)
|
||||
}
|
100
inputs/01p.txt
Normal file
100
inputs/01p.txt
Normal file
@ -0,0 +1,100 @@
|
||||
85644
|
||||
52584
|
||||
72349
|
||||
83834
|
||||
56593
|
||||
108492
|
||||
94585
|
||||
97733
|
||||
62732
|
||||
103113
|
||||
133259
|
||||
132647
|
||||
52460
|
||||
51299
|
||||
115749
|
||||
121047
|
||||
69451
|
||||
54737
|
||||
62738
|
||||
116686
|
||||
57293
|
||||
97273
|
||||
128287
|
||||
139440
|
||||
97583
|
||||
130263
|
||||
79307
|
||||
118198
|
||||
82514
|
||||
70679
|
||||
64485
|
||||
119346
|
||||
136281
|
||||
114724
|
||||
73580
|
||||
76314
|
||||
126198
|
||||
97635
|
||||
114655
|
||||
104195
|
||||
99469
|
||||
70251
|
||||
82815
|
||||
79531
|
||||
58135
|
||||
80625
|
||||
73106
|
||||
139806
|
||||
138478
|
||||
136605
|
||||
111472
|
||||
149915
|
||||
95928
|
||||
126905
|
||||
70496
|
||||
147999
|
||||
148501
|
||||
114025
|
||||
75716
|
||||
113473
|
||||
95390
|
||||
104466
|
||||
138715
|
||||
53053
|
||||
79502
|
||||
98601
|
||||
115139
|
||||
122315
|
||||
88402
|
||||
124332
|
||||
140107
|
||||
50912
|
||||
104885
|
||||
142005
|
||||
145938
|
||||
118556
|
||||
101858
|
||||
51142
|
||||
94100
|
||||
99421
|
||||
84544
|
||||
137234
|
||||
126374
|
||||
107333
|
||||
82439
|
||||
125373
|
||||
51212
|
||||
99358
|
||||
82821
|
||||
89913
|
||||
67513
|
||||
136907
|
||||
133707
|
||||
139988
|
||||
96914
|
||||
130672
|
||||
66474
|
||||
120729
|
||||
50131
|
||||
67475
|
6
inputs/inputs.go
Normal file
6
inputs/inputs.go
Normal file
@ -0,0 +1,6 @@
|
||||
package inputs
|
||||
|
||||
import "embed"
|
||||
|
||||
//go:embed *
|
||||
var Sets embed.FS
|
75
main.go
Normal file
75
main.go
Normal file
@ -0,0 +1,75 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"parnic.com/aoc2019/days"
|
||||
"parnic.com/aoc2019/utilities"
|
||||
)
|
||||
|
||||
type day interface {
|
||||
Parse()
|
||||
Part1() string
|
||||
Part2() string
|
||||
}
|
||||
|
||||
var dayMap = map[int]day{
|
||||
1: &days.Day01{},
|
||||
}
|
||||
|
||||
func main() {
|
||||
arg := "1"
|
||||
if len(os.Args) > 1 {
|
||||
arg = os.Args[1]
|
||||
}
|
||||
if strings.ToLower(arg) == "all" {
|
||||
for _, v := range dayMap {
|
||||
solve(v)
|
||||
}
|
||||
} else {
|
||||
iArg, err := strconv.Atoi(arg)
|
||||
if err != nil {
|
||||
log.Fatalf("Invalid day " + utilities.ColorCyan + arg + utilities.TextReset)
|
||||
}
|
||||
|
||||
p, ok := dayMap[iArg]
|
||||
if !ok {
|
||||
log.Fatalf("Unknown day " + utilities.ColorCyan + arg + utilities.TextReset)
|
||||
}
|
||||
|
||||
solve(p)
|
||||
}
|
||||
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
func solve(d day) {
|
||||
fmt.Println(utilities.ColorCyan + "Day 01" + utilities.TextReset)
|
||||
|
||||
parseStart := time.Now()
|
||||
d.Parse()
|
||||
parseTime := time.Since(parseStart)
|
||||
|
||||
part1Start := time.Now()
|
||||
part1 := d.Part1()
|
||||
part1Time := time.Since(part1Start)
|
||||
|
||||
part2Start := time.Now()
|
||||
part2 := d.Part2()
|
||||
part2Time := time.Since(part2Start)
|
||||
|
||||
fmt.Println(utilities.ColorGreen + "Part1:" + utilities.TextReset)
|
||||
fmt.Println(part1)
|
||||
fmt.Println(utilities.ColorGreen + "Part2:" + utilities.TextReset)
|
||||
fmt.Println(part2)
|
||||
fmt.Print(utilities.ColorBrightBlack)
|
||||
fmt.Printf("Parsed in %s\n", parseTime)
|
||||
fmt.Printf("Part01 in %s\n", part1Time)
|
||||
fmt.Printf("Part02 in %s\n", part2Time)
|
||||
fmt.Println(utilities.TextReset)
|
||||
}
|
44
utilities/colors.go
Normal file
44
utilities/colors.go
Normal file
@ -0,0 +1,44 @@
|
||||
package utilities
|
||||
|
||||
const (
|
||||
ColorBlack = "\u001b[30m"
|
||||
ColorRed = "\u001b[31m"
|
||||
ColorGreen = "\u001b[32m"
|
||||
ColorYellow = "\u001b[33m"
|
||||
ColorBlue = "\u001b[34m"
|
||||
ColorMagenta = "\u001b[35m"
|
||||
ColorCyan = "\u001b[36m"
|
||||
ColorWhite = "\u001b[37m"
|
||||
|
||||
ColorBrightBlack = "\u001b[30;1m"
|
||||
ColorBrightRed = "\u001b[31;1m"
|
||||
ColorBrightGreen = "\u001b[32;1m"
|
||||
ColorBrightYellow = "\u001b[33;1m"
|
||||
ColorBrightBlue = "\u001b[34;1m"
|
||||
ColorBrightMagenta = "\u001b[35;1m"
|
||||
ColorBrightCyan = "\u001b[36;1m"
|
||||
ColorBrightWhite = "\u001b[37;1m"
|
||||
|
||||
BackgroundBlack = "\u001b[40m"
|
||||
BackgroundRed = "\u001b[41m"
|
||||
BackgroundGreen = "\u001b[42m"
|
||||
BackgroundYellow = "\u001b[43m"
|
||||
BackgroundBlue = "\u001b[44m"
|
||||
BackgroundMagenta = "\u001b[45m"
|
||||
BackgroundCyan = "\u001b[46m"
|
||||
BackgroundWhite = "\u001b[47m"
|
||||
|
||||
BackgroundBrightBlack = "\u001b[40;1m"
|
||||
BackgroundBrightRed = "\u001b[41;1m"
|
||||
BackgroundBrightGreen = "\u001b[42;1m"
|
||||
BackgroundBrightYellow = "\u001b[43;1m"
|
||||
BackgroundBrightBlue = "\u001b[44;1m"
|
||||
BackgroundBrightMagenta = "\u001b[45;1m"
|
||||
BackgroundBrightCyan = "\u001b[46;1m"
|
||||
BackgroundBrightWhite = "\u001b[47;1m"
|
||||
|
||||
TextReset = "\u001b[0m"
|
||||
TextBold = "\u001b[1m"
|
||||
TextUnderline = "\u001b[4m"
|
||||
TextReverse = "\u001b[7m"
|
||||
)
|
45
utilities/parsing.go
Normal file
45
utilities/parsing.go
Normal file
@ -0,0 +1,45 @@
|
||||
package utilities
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"strconv"
|
||||
|
||||
"parnic.com/aoc2019/inputs"
|
||||
)
|
||||
|
||||
func getData(filename string, lineHandler func(line string)) {
|
||||
file, err := inputs.Sets.Open(fmt.Sprintf("%s.txt", filename))
|
||||
// version that doesn't use embedded files:
|
||||
// file, err := os.Open(fmt.Sprintf("inputs/%s.txt", filename))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
scanner.Split(bufio.ScanLines)
|
||||
for scanner.Scan() {
|
||||
lineHandler(scanner.Text())
|
||||
}
|
||||
}
|
||||
|
||||
func GetStringLines(filename string) []string {
|
||||
retval := make([]string, 0)
|
||||
getData(filename, func(line string) {
|
||||
retval = append(retval, line)
|
||||
})
|
||||
return retval
|
||||
}
|
||||
|
||||
func GetIntLines(filename string) []int64 {
|
||||
retval := make([]int64, 0)
|
||||
getData(filename, func(line string) {
|
||||
val, err := strconv.ParseInt(line, 10, 64)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
retval = append(retval, val)
|
||||
})
|
||||
return retval
|
||||
}
|
Reference in New Issue
Block a user