swlabr

joined 2 years ago
[–] swlabr@awful.systems 1 points 15 hours ago

I did end up writing a code solution.

algorithm descSo basically the problem boils down to this:

A 1 bit full adder circuit with carry in/out is described as follows:

S~i~ = X~i~ ^ Y~i~ ^ Cin~i~

Cout~i~ = (X~i~ && Y~i~) || (Cin~i~ && (X~i~ ^ Y~i~))

Where S is the output bit, X and Y are the input bits, and Cin~i~ is the carry out bit of bit i-1. For the first and last bits of the output, the circuits are slightly different due to carry in/out not mattering in the 0/last bit case.

Note that as said in the problem statement any input is correctly labelled, while outputs might be incorrect. You can then categorise each gate input/output as any of the elements in an adder circuit. You can then use set differences and intersections to determine the errors between categories. That's all you need to do!

For example, you might have something like:

X && Y = err

if this output was used correctly, it should show up as an operand to an OR gate. So if you did:

(Set of all outputs of and gates) - (Set of all inputs to or gates), if something appears, then you know one of the and gates is wrong.

Just exhaustively find all the relevant differences and intersections and you're done! To correct the circuit, you can then just brute force the 105 combinations of pair swaps to find what ends up correcting the circuit.

[–] swlabr@awful.systems 2 points 2 days ago (2 children)

25!

p1 tipsO(mn)/O(n^2^) is fast enough.

50 stars baby!https://imgur.com/a/hwEVy9H

[–] swlabr@awful.systems 2 points 3 days ago* (last edited 3 days ago)

I did part 2 manually! I will not bother writing a code solution unless I feel like it.

well well wellAoC, so you thought you could dredge up my trauma as an EE grad by making me debug a full-adder logic circuit? How dare you. You succeeded.

[–] swlabr@awful.systems 3 points 3 days ago

thanksI've probably learned that term at some point, so thanks for naming it. That made me realise my algorithm was too thicc and could just be greedy.

[–] swlabr@awful.systems 2 points 3 days ago

22

uhpretty straightforward. At least it's not a grid!

[–] swlabr@awful.systems 2 points 3 days ago* (last edited 3 days ago)

21!

Finally managed to beat this one into submission.

P1I created this disgusting mess of a recursive search that happened to work. This problem was really hard to think about due to the levels of indirection. It was also hard because of a bug I introduced into my code that would have been easy to debug with more print statements, but hubris.

P2Recursive solution from P1 was too slow, once I was at 7 robots it was taking minutes to run the code. It didn't take long to realise that you don't really care about where the robots other than the keypad robot and the one controlling the keypad robot are since the boundary of each state needs all the previous robots to be on the A button. So with memoisation, you can calculate all the shortest paths for a given robot to each of the directional inputs in constant time, so O(kn) all up where n is the number of robots (25) and k is the complexity of searching for a path over 5 or 11 nodes.

What helped was looking at the penultimate robot's button choices when moving the keypad robot. After the first one or two levels, the transitions settle into the table in the appendix. I will not explain the code.

appendix

  (P(0, 1), P(0, 1)): [],
  (P(0, 1), P(0, 2)): [btn.r],
  (P(0, 1), P(1, 0)): [btn.d, btn.l],
  (P(0, 1), P(1, 1)): [btn.d],
  (P(0, 1), P(1, 2)): [btn.d, btn.r],
  (P(0, 2), P(0, 1)): [btn.l],
  (P(0, 2), P(0, 2)): [],
  (P(0, 2), P(1, 0)): [btn.d, btn.l, btn.l],
  (P(0, 2), P(1, 1)): [btn.l, btn.d],
  (P(0, 2), P(1, 2)): [btn.d],
  (P(1, 0), P(0, 1)): [btn.r, btn.u],
  (P(1, 0), P(0, 2)): [btn.r, btn.r, btn.u],
  (P(1, 0), P(1, 0)): [],
  (P(1, 0), P(1, 1)): [btn.r],
  (P(1, 0), P(1, 2)): [btn.r, btn.r],
  (P(1, 1), P(0, 1)): [btn.u],
  (P(1, 1), P(0, 2)): [btn.u, btn.r],
  (P(1, 1), P(1, 0)): [btn.l],
  (P(1, 1), P(1, 1)): [],
  (P(1, 1), P(1, 2)): [btn.r],
  (P(1, 2), P(0, 1)): [btn.l, btn.u],
  (P(1, 2), P(0, 2)): [btn.u],
  (P(1, 2), P(1, 0)): [btn.l, btn.l],
  (P(1, 2), P(1, 1)): [btn.l],
  (P(1, 2), P(1, 2)): [],

[–] swlabr@awful.systems 2 points 6 days ago

21 (wip)

2 meme 2 memeious

[–] swlabr@awful.systems 3 points 1 week ago

Understandable, have a nice day

[–] swlabr@awful.systems 3 points 1 week ago

ok discoIt took me too long to read the prompt and see that without the shortcuts, it's a single path. I wasted too much time on search algorithms.

P1: Here's what I did: Walk the path. Every time you hit a new grid, check if the two shortcuts you can take will save you 100 ps.

To calculate the shortcut saving:

If you index every grid position on the main path from 0, then it takes X ps to reach position X, The time it takes to travel from start to X, then a shortcut to Y, then from Y to the end, is X + 1 + (main path length - Y). The time saved is then just Y - X - 1, modulo maybe like 5 fence post errors.

P2. The prompt wasn't really clear about whether or not cheating meant you can only travel through one set of walls before your cheat ends, or if it meant you could just move through walls for 20ps to wherever you could reach. Turns out, it's the latter.

The above formula is then a special case of Y - X - manhattan distance(X, Y).

[–] swlabr@awful.systems 3 points 1 week ago (3 children)

20: currently a WIP but:

memeWait, so it’s all grids? 🧑🏿‍🚀🔫🧑🏿‍🚀

[–] swlabr@awful.systems 3 points 1 week ago* (last edited 1 week ago)

Day 19! (the cuervo gold....)

disc and codeOk so my path to this answer was circuitous and I now hate myself a little.

P1: Ok, a repeated dfs on suffixes. that shouldn't be too hard. (it was not hard)

P2: Ok, a repeated dfs is a little too slow for me, I wonder how I can speed it up?

forgets about memoisation, a thing that you can do to speed this sort of thing up

I guess the problem is I'm doing an O(mn) match (where m is the number of towels, n is the max towel length) when I can do O(n). I'll build a prefix tree!

one prefix tree later

Ok that still seems to be quite slow. What am I doing wrong?

remembers that memoisation exists

Oh I just need to memoise my dp from part 1. Oops.

Anyway posting the code because I shrunk it down to like two semicolons worth of lines.

(

List<String> input = getLines();
Set<String> ts = Set.from(input.first.split(', '));
Map<String, int> dp = {};

int dpm(String s) => dp.putIfAbsent(
    s,
    () => s.isNotEmpty
        ? ts
            .where((t) => t.matchAsPrefix(s) != null)
            .map((t) => dpm(s.substring(t.length)))
            .fold(0, (a, b) => a + b)
        : 1);

void d19(bool sub) {
  print(input
      .skip(2)
      .map((s) => dpm(s))
      .map((i) => sub
          ? i
          : i > 0
              ? 1
              : 0)
      .reduce((a, b) => a + b));
}

[–] swlabr@awful.systems 6 points 1 week ago* (last edited 1 week ago)

gilding the lily a bit but

 

original link

“If all of this sounds like a libertarian fever dream, I hear you. But as these markets rise, legacy media will continue to slide into irrelevance.”

 

Abstracted abstract:

Frontier models are increasingly trained and deployed as autonomous agents, which significantly increases their potential for risks. One particular safety concern is that AI agents might covertly pursue misaligned goals, hiding their true capabilities and objectives – also known as scheming. We study whether models have the capability to scheme in pursuit of a goal that we provide in-context and instruct the model to strongly follow. We evaluate frontier models on a suite of six agentic evaluations where models are instructed to pursue goals and are placed in environments that incentivize scheming.

I saw this posted here a moment ago and reported it*, and it looks to have been purged. I am reposting it to allow us to sneer at it.

*

 

Didn’t see this news posted but please link previous correspondence if I missed it.

https://archive.is/XwbY0

 

Kind of sharing this because the headline is a little sensationalist and makes it sound like MS is hard right (they are, but not like this) and anti-EU.

I mean, they probably are! Especially if it means MS is barred from monopolies and vertical integration.

 

Uncritically sharing this article with naive hope. Is this just PR for a game? Probably. Indies deserve as much free press as possible though.

 

Followup to part 1, which now has a transcript!

As is tradition, I am posting this link without having listened to it. (too many podcasts)

 

Just a lil tidbit of news of some web3 based company going away.

view more: next ›