swlabr

joined 1 year ago
[–] [email protected] 1 points 1 week ago* (last edited 1 week ago)

code for day 5, written in dart to be short:

spoiler

void d5(bool isPart2) {
  Map<int, Set<int>> ordering = {};
  int comp(int a, int b) => ordering[a]?.contains(b) ?? false ? -1 : 1;

  List<String> lines = getLines();
  int rulesEnd = lines.indexWhere((line) => line.isEmpty);

  lines
      .sublist(0, rulesEnd)
      .map((line) => line.split('|').map((e) => int.parse(e)).toList())
      .forEach((rule) => ordering.putIfAbsent(rule[0], Set.new).add(rule[1]));

  print(lines
      .sublist(rulesEnd + 1)
      .map((line) => line.split(",").map((s) => int.parse(s)).toList())
      .fold<int>(
          0,
          (p, e) =>
              p +
              (e.isSorted(comp) != isPart2
                  ? e.sorted(comp)[e.length >> 1]
                  : 0)));
}

[–] [email protected] 1 points 1 week ago (2 children)

days 5 and 6.

5:

p1, p2:Initially, I was thrown for a loop. It wasn't apparent to me what data structure to use or the problem's properties. My first (and correct) instinct was to interpret the data as a directed graph, but then what? Try to find some total ordering, if such a thing was possible?

As it turns out, that instinct was also correct. By drawing the sample data (or counting or printing it out), I noticed that every page number had a defined relation with every other page number. This meant that a total ordering (rather than a lattice) existed, meaning it was possible to construct a comparison function.

So, the algorithm for part 1 was to check if a list was sorted, and part 2 was to sort the list. There's probably a 1-3 line solution for both parts a and b, but that's for Mr. The Reader.

6:

p1, p2as discussed in a different part of the thread, I consider the input size for square inputs to be N, the "side length" of the square.

Context: I participated (and completed!) in AoC last year and pragmatically wrote my code as a set of utility modules for solving these pathological problems. So, I had about 80% of the boilerplate for this problem written, waiting for me to read and relearn.

Anyway, the analysis: P1. was pretty straightforward. Just walk along the map, turn right if you hit an obstacle, and stop when you leave the map. I guessed that there may be a case where one needs to turn in place more than once to escape an obstacle, but I never checked if that was true. Either way, I got the answer out. This is a worst-case O(n^2^) solution, which was fast for n = 130.

P2. I chose to brute force this, and it was fine. I iterated through the grid, placing a wall if possible, and checked if this produced a loop using an explored set. This is worst case O(n^4^), which, for n=130, takes a few seconds to spit out the answer. It's parallelisable, though, so there's that. If a faster solution existed, I'd love to know.

[–] [email protected] 2 points 2 weeks ago

i am a simple manI see square input, i say n^2^

[–] [email protected] 11 points 2 weeks ago (1 children)

it's almost as if international trade of weapons creates perverse incentives

[–] [email protected] 5 points 2 weeks ago* (last edited 2 weeks ago) (1 children)

Or a secret, third option:

[–] [email protected] 2 points 2 weeks ago (2 children)

4:

4-1I tried something clever and was punished for my hubris, but it turned out ok.

I treated the input as a list of strings and searched for "XMAS" and "SAMX", rotating and transposing the list to scan for vertical and diagonal words.

In my arrogance, I thought I could do the diagonal rotation easily, but I was very wrong. I got it out in the end, though.

4-2this was easier than 4-1. An O(n^2^) solution just scanning for X-MAS was good enough. Maybe there was a more clever solution that used, i dunno, string hashing or something but whatever.

[–] [email protected] 11 points 2 weeks ago* (last edited 2 weeks ago)

Martial law and free speech restrictions are only bad if the bad guys do it, also we get to decide who the bad guys are

[–] [email protected] 13 points 2 weeks ago (5 children)

Ah, yes. In case you were wondering about said Swiss businessman and whether or not his actions in the DPRK were morally sound, once again, Wikipedia has something to say.

[–] [email protected] 17 points 2 weeks ago

Normal person: you should not be attracted to the mind or body of anyone under the age of consent, nor should you invent thought experiments to find loopholes.

Yud: i live to groom

[–] [email protected] 3 points 2 weeks ago

same

I got bit by the input being more than one line. Embarrasing.

[–] [email protected] 3 points 2 weeks ago* (last edited 2 weeks ago)

For 3: I made dart one-liners for both. Pasting the juicy parts.

3:1RegExp(r"mul\((\d*),(\d*)\)").allMatches(input).fold<int>( 0, (p, e) => p + e.groups([1, 2]).fold(1, (p, f) => p * int.parse(f!))));

3:2My original solution found do, don't and mul entries, then stepped through them to get the solve. I decided to try regex my way through it. What I realised was that you want to ignore strings starting with don't() and ending at the first do(). Some amount of trial and error later, I figured out the (ecma*) regex to do it, which I am proud of:

RegExp(r"(?:don\'t\(\)(?:.(?<!do\(\)))*do\(\))|(?:mul\((\d*),(\d*)\))") .allMatches(input) .fold<int>( 0, (p, e) => p + (e.group(0)![0] != 'd' ? e.groups([1, 2]).fold<int>(1, (p, f) => p * int.parse(f!)) : 0))

*ecma balls

[–] [email protected] 14 points 2 weeks ago

Article was short. I was pretty close!

view more: ‹ prev next ›