Day 8: Resonant Collinearity
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
You are viewing a single thread.
View all comments 4 points
C#
public class Day08 : Solver
{
private ImmutableArray<string> data;
private int width, height;
public void Presolve(string input) {
data = input.Trim().Split("\n").ToImmutableArray();
width = data[0].Length;
height = data.Length;
}
public string SolveFirst() {
Dictionary<char, List<(int, int)>> antennae = [];
HashSet<(int, int)> antinodes = [];
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
if ('.' == data[j][i]) continue;
antennae.TryAdd(data[j][i], []);
foreach (var (oi, oj) in antennae[data[j][i]]) {
int di = i - oi;
int dj = j - oj;
int ai = i + di;
int aj = j + dj;
if (ai >= 0 && aj >= 0 && ai < width && aj < height) {
antinodes.Add((ai, aj));
}
ai = oi - di;
aj = oj - dj;
if (ai >= 0 && aj >= 0 && ai < width && aj < height) {
antinodes.Add((ai, aj));
}
}
antennae[data[j][i]].Add((i, j));
}
}
return antinodes.Count.ToString();
}
public string SolveSecond() {
Dictionary<char, List<(int, int)>> antennae = [];
HashSet<(int, int)> antinodes = [];
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
if ('.' == data[j][i]) continue;
antennae.TryAdd(data[j][i], []);
foreach (var (oi, oj) in antennae[data[j][i]]) {
int di = i - oi;
int dj = j - oj;
for (int ai = i, aj = j;
ai >= 0 && aj >= 0 && ai < width && aj < height;
ai += di, aj +=dj) {
antinodes.Add((ai, aj));
}
for (int ai = oi, aj = oj;
ai >= 0 && aj >= 0 && ai < width && aj < height;
ai -= di, aj -=dj) {
antinodes.Add((ai, aj));
}
}
antennae[data[j][i]].Add((i, j));
}
}
return antinodes.Count.ToString();
}
}