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

  • hades@lemm.ee
    link
    fedilink
    arrow-up
    4
    ·
    20 days 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();
      }
    }