This commit is contained in:
Andrew Lalis 2022-12-09 07:19:01 +01:00
parent 28dd0d4cf5
commit aa8a3d5600
4 changed files with 2102 additions and 1 deletions

2000
input/9.txt Normal file

File diff suppressed because it is too large Load Diff

49
src/s9a.d Normal file
View File

@ -0,0 +1,49 @@
module s9a;
import util;
struct Vec2 {
int x;
int y;
}
void main() {
string[] commands = readText("input/9.txt").strip.splitter("\n").array;
Vec2 head;
Vec2 tail;
Set!Vec2 visited = Set!Vec2([]);
foreach (command; commands) {
char direction;
int amount;
formattedRead(command, "%c %d", direction, amount);
Vec2 dirVec;
if (direction == 'U') {
dirVec = Vec2(0, 1);
} else if (direction == 'D') {
dirVec = Vec2(0, -1);
} else if (direction == 'R') {
dirVec = Vec2(1, 0);
} else {
dirVec = Vec2(-1, 0);
}
for (int i = 0; i < amount; i++) {
Vec2 prevHeadPos = head;
head.x += dirVec.x;
head.y += dirVec.y;
int distX = abs(head.x - tail.x);
int distY = abs(head.y - tail.y);
if (distX > 1 || distY > 1) {
if (distX == 0 || distY == 0) {
if (head.x > tail.x) tail.x++;
if (head.x < tail.x) tail.x--;
if (head.y > tail.y) tail.y++;
if (head.y < tail.y) tail.y--;
} else {
tail.x = prevHeadPos.x;
tail.y = prevHeadPos.y;
}
}
visited.add(tail);
}
}
writeln(visited.items.length);
}

51
src/s9b.d Normal file
View File

@ -0,0 +1,51 @@
module s9b;
import util;
struct Vec2 {
int x;
int y;
}
void main() {
string[] commands = readText("input/9.txt").strip.splitter("\n").array;
Set!Vec2 visited = Set!Vec2([]);
Vec2[10] rope;
foreach (command; commands) {
char direction;
int amount;
formattedRead(command, "%c %d", direction, amount);
Vec2 dirVec;
if (direction == 'U') {
dirVec = Vec2(0, 1);
} else if (direction == 'D') {
dirVec = Vec2(0, -1);
} else if (direction == 'R') {
dirVec = Vec2(1, 0);
} else {
dirVec = Vec2(-1, 0);
}
for (int i = 0; i < amount; i++) {
rope[0].x += dirVec.x;
rope[0].y += dirVec.y;
for (int r = 0; r + 1 < rope.length; r++) {
Vec2* head = &rope[r];
Vec2* tail = &rope[r + 1];
int distX = head.x - tail.x;
int distY = head.y - tail.y;
if (abs(distX) > 1 || abs(distY) > 1) {
if (distX == 0 || distY == 0) {
if (head.x > tail.x) tail.x++;
if (head.x < tail.x) tail.x--;
if (head.y > tail.y) tail.y++;
if (head.y < tail.y) tail.y--;
} else {
tail.x += distX > 0 ? 1 : -1;
tail.y += distY > 0 ? 1 : -1;
}
}
if (r + 2 == rope.length) visited.add(*tail);
}
}
}
writeln(visited.items.length);
}

View File

@ -12,6 +12,7 @@ public import std.path;
public import std.uni; public import std.uni;
public import std.array; public import std.array;
public import std.format; public import std.format;
public import std.math;
/** /**
* Simple set implementation since the stdlib doesn't really have a good one. * Simple set implementation since the stdlib doesn't really have a good one.
@ -38,7 +39,7 @@ struct Set(T) {
bool remove(T element) { bool remove(T element) {
size_t[] indexes; size_t[] indexes;
foreach (e, i; this.items) { foreach (i, e; this.items) {
if (e == element) indexes ~= i; if (e == element) indexes ~= i;
} }
this.items = this.items.remove(indexes); this.items = this.items.remove(indexes);