parent
4a0846a625
commit
8b771666f3
@ -0,0 +1,95 @@ |
||||
import "aoc" for AoC |
||||
|
||||
class Pos { |
||||
construct new() { |
||||
_x = 0 |
||||
_y = 0 |
||||
} |
||||
|
||||
x { _x } |
||||
y { _y } |
||||
|
||||
touches(other) { |
||||
var dx = (_x - other.x).abs |
||||
var dy = (_y - other.y).abs |
||||
|
||||
return dx <= 1 && dy <= 1 |
||||
} |
||||
|
||||
static movement(h, t) { |
||||
if(h.touches(t)) { |
||||
return "" |
||||
} |
||||
|
||||
var dx = h.x - t.x |
||||
var dy = h.y - t.y |
||||
|
||||
if(dx < 0 && dy < 0) { |
||||
return "LD" |
||||
} |
||||
if(dx < 0 && dy > 0) { |
||||
return "LU" |
||||
} |
||||
if(dx > 0 && dy < 0) { |
||||
return "RD" |
||||
} |
||||
if(dx > 0 && dy > 0) { |
||||
return "RU" |
||||
} |
||||
if(dx < 0 ) { |
||||
return "L" |
||||
} |
||||
if(dx > 0 ) { |
||||
return "R" |
||||
} |
||||
if(dy < 0 ) { |
||||
return "D" |
||||
} |
||||
if(dy > 0 ) { |
||||
return "U" |
||||
} |
||||
} |
||||
|
||||
u() { _y = _y + 1 } |
||||
d() { _y = _y - 1 } |
||||
l() { _x = _x - 1 } |
||||
r() { _x = _x + 1 } |
||||
|
||||
move(direction) { |
||||
for(c in direction) { |
||||
if(c == "U") this.u() |
||||
if(c == "D") this.d() |
||||
if(c == "L") this.l() |
||||
if(c == "R") this.r() |
||||
} |
||||
} |
||||
|
||||
xy { _x.toString + "," + _y.toString } |
||||
} |
||||
|
||||
var h = Pos.new() |
||||
var t = Pos.new() |
||||
|
||||
var rope = [] |
||||
for(i in 0...10) { rope.add(Pos.new()) } |
||||
|
||||
var seen_p1 = {} |
||||
var seen_p2 = {} |
||||
|
||||
for(line in AoC.input.split("\n").where {|l| l != ""}) { |
||||
var split = line.split(" ") |
||||
var direction = split[0] |
||||
var count = Num.fromString(split[1]) |
||||
for(i in 0...count) { |
||||
h.move(direction) |
||||
t.move(Pos.movement(h, t)) |
||||
seen_p1[t.xy] = true |
||||
|
||||
rope[0].move(direction) |
||||
for(i in 1...10) { rope[i].move(Pos.movement(rope[i-1], rope[i])) } |
||||
seen_p2[rope[9].xy] = true |
||||
} |
||||
} |
||||
|
||||
System.print(seen_p1.count) |
||||
System.print(seen_p2.count) |
Loading…
Reference in new issue