Only Bayes Can Judge Me

  • 17 Posts
  • 600 Comments
Joined 1 year ago
cake
Cake day: July 4th, 2023

help-circle



  • 17!

    p1 discussion

    Simultaneously very fun and also the fucking worst.

    Fun: Ooooh, I get to simulate a computer, exciting!

    Worst: Literally 8 edge cases where fucking up even just one can fuck up your hour.

    p2 discussion

    I did this by hand. sort of. I mean I didn’t code up something that found the answer.

    Basically I looked at the program in the input and wrote it out, and realised that A was essentially a loop variable, where the number of iterations was the number of octal digits A would take to represent. The most significant octal digits (octits?) would determine the tail end of the output sequence, so to find the smallest A you can do a DFS starting from the MS octit. I did this by hand.

    EDIT: code. Not gonna explain any of it.
    class Comp {
      List<int> reg;
      List<int> prog;
      int ip = 0;
    
      List<int> output = [];
      late List<(int, bool) Function()> ops;
    
      int get combo => prog[ip + 1] < 4 ? prog[ip + 1] : reg[prog[ip + 1] - 4];
    
      Comp(this.reg, this.prog) {
        ops = [
          () => (reg[0] = (reg[0] >> combo), false),
          () => (reg[1] ^= prog[ip + 1], false),
          () => (reg[1] = combo % 8, false),
          () => (reg[0] != 0) ? (ip = prog[ip + 1], true) : (0, false),
          () => (reg[1] ^= reg[2], false),
          () {
            output.add(combo % 8);
            return (0, false);
          },
          () => (reg[1] = (reg[0] >> combo), false),
          () => (reg[2] = (reg[0] >> combo), false)
        ];
      }
    
      compute() {
        output.clear();
        while (ip < prog.length) {
          if (!ops[prog[ip]]().$2) {
            ip += 2;
          }
        }
      }
    
      reset(int A) {
        ip = 0;
        reg[0] = A;
        reg[1] = 0;
        reg[2] = 0;
      }
    }
    
    void d17(bool sub) {
      List<String> input = getLines();
      Comp c = Comp(
          input.take(3).map((s) => s.split(" ").last).map(int.parse).toList(),
          input.last.split(" ").last.split(",").map(int.parse).toList())
        ..compute();
      print("Part a: ${c.output.join(",")}");
    
      if (!sub) return;
    
      List<int> sols = [];
      bool dfs(int cur) {
        bool found = false;
        sols.add(cur);
        int sol = sols.reduce((a, b) => 8 * a + b);
        c..reset(sol)..compute();
        if (c.prog
            .whereIndexed((i, e) => i >= c.prog.length - c.output.length)
            .foldIndexed(true, (i, p, e) => p && c.output[i] == e)) {
          if (found = c.output.length == c.prog.length) {
            print("Part b: $sol");
          } else {
            for (int i = 0; i < 8 && !(found = found || dfs(i)); i++) {}
          }
        }
    
        sols.removeLast();
        return found;
      }
    
      for (int a = 0; a < 8 && !dfs(a); a++) {}
    }
    
    













  • Day 13, day 13 of shirking other responsibilities.

    p1

    Ok. So, I overthought this a little. Ultimately, this problem boils down to solving a system of 2 linear equations aka inverting a matrix.

    Of course, anyone who has done undergraduate linear algebra knows to look to the determinant in case some shit goes down. For the general problem space, a zero determinant means that one equation is just a multiple of the other. A solution could still exist in this case. Consider:

    a => x+1, y+1
    b => x+2, y+2
    x = 4, y = 4 (answer: 2 tokens)
    

    The following has no solution:

    a => x+2, y+2
    b => x+4, y+4
    x = 3, y = 3
    

    I thought of all this, and instead of coding the solution, I just checked if any such cases were in my input. There weren’t, and I was home free.

    p2

    No real changes to the solution to p1 aside from the new targets. I wasn’t sure if 64 bit ints were big enough to fit the numbers so I changed my code to use big ints.

    I’m looking at my code again and I’m pretty sure that was all unnecessary.


  • Oh yeah, haha. I often face the dilemma dilemma in which I have to choose between ignoring the 'incorrect" usage (i.e. not a choice between two things that are difficult to choose between) and seethe OR mention the correct usage and look like a pedant. Sometimes it’s a trilemma, and I’m all over the shop. But more seriously, I usually let it slide and let people use it to mean “a situation”.

    I doubt that Lorenz has a dilemma in line with the correct usage. I couldn’t fight the urge to steelman, spoilered below, which I suspect this is nothing near what Lorenz had in mind.

    exhausting Steelman within. I only tried to come up with something, it's not a good steelman. I'm so sorry about this.

    In the world that Lorenz posits, where prediction markets somehow represent accurate news reporting, either a journalist participates in the market whilst reporting news (conflict of interest), or they don’t, and they are bad at their job (and not performing at your job is unethical, I guess?)