this post was submitted on 08 Dec 2024
23 points (96.0% liked)

Advent Of Code

999 readers
1 users here now

An unofficial home for the advent of code community on programming.dev!

Advent of Code is an annual Advent calendar of small programming puzzles for a variety of skill sets and skill levels that can be solved in any programming language you like.

AoC 2024

Solution Threads

M T W T F S S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25

Rules/Guidelines

Relevant Communities

Relevant Links

Credits

Icon base by Lorc under CC BY 3.0 with modifications to add a gradient

console.log('Hello World')

founded 1 year ago
MODERATORS
 

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

you are viewing a single comment's thread
view the rest of the comments
[โ€“] [email protected] 4 points 1 month ago

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();
  }
}