lol, day 17 is just spamming every possible arc
This commit is contained in:
parent
d1c2f5eb90
commit
3340be88a1
159
17/main.go
Normal file
159
17/main.go
Normal file
@ -0,0 +1,159 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
func mustAtoi(line string) int {
|
||||
i, _ := strconv.Atoi(line)
|
||||
return i
|
||||
}
|
||||
|
||||
func main() {
|
||||
start := time.Now()
|
||||
partOne()
|
||||
duration := time.Since(start)
|
||||
partTwo()
|
||||
duration2 := time.Since(start)
|
||||
fmt.Printf("p1: %s, p2: %s\n", duration, duration2-duration)
|
||||
}
|
||||
|
||||
func makeScanner(test bool) *bufio.Scanner {
|
||||
var f *os.File
|
||||
if test {
|
||||
f, _ = os.Open("inputs/testinput")
|
||||
} else {
|
||||
f, _ = os.Open("inputs/input")
|
||||
}
|
||||
reader := bufio.NewReader(f)
|
||||
return bufio.NewScanner(reader)
|
||||
}
|
||||
|
||||
type targetArea struct {
|
||||
startx int
|
||||
endx int
|
||||
starty int
|
||||
endy int
|
||||
}
|
||||
|
||||
func ParseInput(line string) targetArea {
|
||||
target := targetArea{}
|
||||
acc := ""
|
||||
for i := 0; i < len(line); i++ {
|
||||
switch line[i] {
|
||||
case '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-':
|
||||
acc += string(line[i])
|
||||
case '.':
|
||||
i++ // skip the second .
|
||||
if target.startx == 0 {
|
||||
target.startx = mustAtoi(acc)
|
||||
} else {
|
||||
target.starty = mustAtoi(acc)
|
||||
}
|
||||
acc = ""
|
||||
case ',':
|
||||
target.endx = mustAtoi(acc)
|
||||
acc = ""
|
||||
default: // all other characters do nothing
|
||||
}
|
||||
target.endy = mustAtoi(acc)
|
||||
}
|
||||
return target
|
||||
}
|
||||
|
||||
func InTarget(x, y int, target targetArea) bool {
|
||||
return x >= target.startx && x <= target.endx && y <= target.endy && y >= target.starty
|
||||
}
|
||||
|
||||
func BeyondTarget(x, y int, target targetArea) bool {
|
||||
return x > target.endx || y < target.starty
|
||||
}
|
||||
|
||||
type probe struct {
|
||||
xvelocity int
|
||||
yvelocity int
|
||||
x int
|
||||
y int
|
||||
maxy int
|
||||
}
|
||||
|
||||
func (p *probe) Step() {
|
||||
p.x += p.xvelocity
|
||||
p.y += p.yvelocity
|
||||
if p.xvelocity > 0 {
|
||||
p.xvelocity--
|
||||
} else if p.xvelocity < 0 {
|
||||
p.xvelocity++
|
||||
}
|
||||
p.yvelocity--
|
||||
if p.y > p.maxy {
|
||||
p.maxy = p.y
|
||||
}
|
||||
}
|
||||
|
||||
func partOne() {
|
||||
scanner := makeScanner(false)
|
||||
|
||||
// read line
|
||||
scanner.Scan()
|
||||
line := scanner.Text()
|
||||
target := ParseInput(line)
|
||||
highestArc := 0
|
||||
for j := 1; j < 50; j++ {
|
||||
for k := 1; k < 100; k++ {
|
||||
initx := j
|
||||
inity := k
|
||||
p := &probe{
|
||||
xvelocity: initx,
|
||||
yvelocity: inity,
|
||||
}
|
||||
for {
|
||||
p.Step()
|
||||
if InTarget(p.x, p.y, target) {
|
||||
if p.maxy > highestArc {
|
||||
highestArc = p.maxy
|
||||
}
|
||||
}
|
||||
if BeyondTarget(p.x, p.y, target) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Println(highestArc)
|
||||
}
|
||||
|
||||
func partTwo() {
|
||||
scanner := makeScanner(false)
|
||||
|
||||
// read line
|
||||
scanner.Scan()
|
||||
line := scanner.Text()
|
||||
target := ParseInput(line)
|
||||
hits := 0
|
||||
for j := 0; j < 1000; j++ {
|
||||
for k := -200; k < 1000; k++ {
|
||||
initx := j
|
||||
inity := k
|
||||
p := &probe{
|
||||
xvelocity: initx,
|
||||
yvelocity: inity,
|
||||
}
|
||||
for {
|
||||
p.Step()
|
||||
if InTarget(p.x, p.y, target) {
|
||||
hits++
|
||||
break
|
||||
}
|
||||
if BeyondTarget(p.x, p.y, target) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Println(hits)
|
||||
}
|
15
17/main_test.go
Normal file
15
17/main_test.go
Normal file
@ -0,0 +1,15 @@
|
||||
package main
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestInTarget(t *testing.T) {
|
||||
target := targetArea{
|
||||
startx: 20,
|
||||
endx: 30,
|
||||
starty: -10,
|
||||
endy: -5,
|
||||
}
|
||||
if !InTarget(28, -7, target) {
|
||||
t.Fail()
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user