Macil's recent activity

  1. Comment on OpenAI considers allowing users to create AI-generated pornography in ~tech

    Macil
    (edited )
    Link
    Regardless of whether you specifically want to do NSFW things with AI tools, this kind of policy change would also help prevent people from being incorrectly blocked from working on SFW things. I...

    Regardless of whether you specifically want to do NSFW things with AI tools, this kind of policy change would also help prevent people from being incorrectly blocked from working on SFW things. I think a lot of users of commercial AI tools (image or text generation) that aren't trying to make NSFW content have experienced the system overzealously blocking a request that it mistakenly identified as inappropriate. I've run into it and it's a common complaint I've seen in discussions.

    Imagine if Photoshop fully stopped working on a photo because it thought it was NSFW because it thought it showed too much skin. Tools shouldn't impose themselves on users like that, especially not for such prudish reasons by tools with fallible judgment that offer no override.

    5 votes
  2. Comment on Jack Dorsey quits Bluesky board and urges users to stay on Elon Musk's X in ~tech

    Macil
    Link
    As a casual Bluesky user I don't think this impacts Bluesky negatively at all. He hasn't been involved with Bluesky since before it got any popularity. He was pushing Nostr around the time Bluesky...

    As a casual Bluesky user I don't think this impacts Bluesky negatively at all. He hasn't been involved with Bluesky since before it got any popularity. He was pushing Nostr around the time Bluesky was getting popular iirc. I like his general argument that open protocols are important, though his spurning of Bluesky is disappointing and his defense of Elon and X is baffling. Does he think Elon is going to make X into an open protocol that's better than Bluesky? Is he just trying to get on the good side of a fellow rich person? Or does he think Elon has good politics and that's worth more for a social network than an open protocol? None of the possibilities are compelling.

    43 votes
  3. Comment on Project Zomboid - What compares for gameplay? in ~games

    Macil
    (edited )
    Link Parent
    This might be more different than you're expecting, but is RimWorld anything like what you're looking for? There are some big differences like that you're indirectly controlling a group instead of...

    This might be more different than you're expecting, but is RimWorld anything like what you're looking for? There are some big differences like that you're indirectly controlling a group instead of directly controlling a single person, and there's more emphasis on base building/management/defense than on exploration (though there is that too), but I think there's some overlap in the survival atmosphere and the roles of items/crafting/menus. RimWorld and Project Zomboid strike me as games I expect to have overlapping fanbases.

    6 votes
  4. Comment on React, Electron, and LLMs have a common purpose: the labour arbitrage theory of dev tool popularity in ~comp

    Macil
    (edited )
    Link
    I definitely agree with the article's point that systems being reusable/componentizable explains a lot of their popularity, but I disagree that this is inherently bad for software developers, that...

    I definitely agree with the article's point that systems being reusable/componentizable explains a lot of their popularity, but I disagree that this is inherently bad for software developers, that React is bad in an obvious way that makes its popularity a mystery, or that software built with some bespoke expert setup is better for that than something similar built with React. I can understand this attitude with Electron and ChatGPT-produced code to a degree (there are inherent compromises in each; Electron loosely approximates native app paradigms) but putting React in that bucket doesn't make me think someone understands much about its strengths and weaknesses. React is well-fit to server and client HTML rendering in a way that little else before it was.

    Separate from the argument about quality, I don't like the other argument the page seems to be pushing: "these tools make software development easier, which is bad because programmers will be paid less and have less job security". I don't like it partly because I don't think it's true (easier software development doesn't necessarily mean the same amount of software will be made with fewer people; if the market has appetite for more software then it can mean that much more software gets made with the same number of people), and partly because even if it's true, I think resisting making software development easier is a terrible route that will cause less software being made, less productivity across the population from that, and less people discovering the joy of making software. It's just gatekeeping. We'd still be programming in assembly without standardized operating systems/platforms and getting relatively little done today if people of the past thought that way.

    12 votes
  5. Comment on Super Mario 64's invisible walls explained once and for all in ~games

    Macil
    (edited )
    Link
    All the clips of players running into bugs right after he fully explained them are hilarious. I kind of want a highlight video of just these parts. One of my favorites is the first one at...

    All the clips of players running into bugs right after he fully explained them are hilarious. I kind of want a highlight video of just these parts. One of my favorites is the first one at 1:28:20-1:30:20 (https://youtu.be/YsXCVsDFiXA?t=5300). There's also a big series of clips from 2:08:48 to 2:14:06 (https://youtu.be/YsXCVsDFiXA?t=7728). And at 2:25:32 to 2:27:46 (https://youtu.be/YsXCVsDFiXA?t=8732). And at 2:28:45 to 2:29:17 (https://youtu.be/YsXCVsDFiXA?t=8925). And at 2:34:35 to 2:35:16 (https://youtu.be/YsXCVsDFiXA?t=9275). And at 2:41:11 to 2:41:55 (https://youtu.be/YsXCVsDFiXA?t=9671). And at 3:10:04 to 3:10:42 (https://youtu.be/YsXCVsDFiXA?t=11404). And at 3:17:20 to 3:17:50 (https://youtu.be/YsXCVsDFiXA?t=11840). And at 3:21:09 to 3:22:00 (https://youtu.be/YsXCVsDFiXA?t=12069). So many of them are a perfect comedy of errors of real player mistakes mixed with the player getting finished off by a bug we just saw the full explanation for, which from their perspective looks like they just got randomly smited by the game.

    I only just noticed that the video has the live chat replay available on the side. It's funny seeing everyone's reactions to these clips. "I would quit Mario and leave forever if that happened to me" "Miyamoto apologize to this man" "this explains everything" "these mushrooms ruined my childhood" "Nintendo owes us reparations" "this video premier is still going??" "I love how these super-detailed scientific explanations get paired with pure gamer rage" "​​jesus christ they are EVERYWHERE" "this is like a whole masters degree in mario"

    3 votes
  6. Comment on Super Mario 64's invisible walls explained once and for all in ~games

    Macil
    Link Parent
    Watching him show all of the invisible walls made me remember I actually had run into a few of them as a kid. I remember trying to jump over the sliding chest on the ship in Jolly Roger Bay and...

    Watching him show all of the invisible walls made me remember I actually had run into a few of them as a kid. I remember trying to jump over the sliding chest on the ship in Jolly Roger Bay and getting glitched downward into it once and damaged. I remember thinking some of the mushrooms on Tall Tall Mountain were off-limits because I bounced off the air above one once, and I was mildly confused later when I realized I did have to go to it and figured I must have been remembering a different off-limits mushroom or that maybe some of the mushrooms were off-limits during the early stars. I remember climbing the wire ceiling in Hazy Maze Cave and falling off just barely on the platform with the item box and assuming my held B button was registered as being up. I remember riding a turtle shell on Shifting Sand Land and bonking out of nowhere on the quicksand and dying in it. I remember having some brief unexplainable difficulty in doing the jump after the blowing wind at the top of Cool Cool Mountain and falling all the way down.

    I specifically remember having thoughts a couple times that I considered superstitious at the time like "I hit something I didn't see and fell down several times when I did an easy slow backflip or sideflip to try to get over, maybe I should try jumping at it directly with more speed to get through and spend less time in the problem area" which it turns out this video has explained was exactly right (you're more likely to collide with unit-wide ceiling hitboxes when your horizontal movement is slower). It's fascinating to understand the bug in detail now and to compare it to my previous understanding of it.

    3 votes
  7. Comment on Super Mario 64's invisible walls explained once and for all in ~games

    Macil
    (edited )
    Link Parent
    The really major detail is that the collision boxes of ceilings (downward facing surfaces) extend infinitely upwards until hitting a floor (upward facing surface) above it, in order to prevent the...

    The really major detail is that the collision boxes of ceilings (downward facing surfaces) extend infinitely upwards until hitting a floor (upward facing surface) above it, in order to prevent the player from ever getting inside of large objects, but walls (vertical surfaces but critically also nearly-vertical steep surfaces) do not block a ceiling's hitbox from extending upwards like floors do. Because of this oversight, anywhere in the game where you have a ceiling with a steep not-quite-vertical wall above it is likely to be leaking a thin strand of the ceiling's hitbox above it. There are about a half-dozen places in each level that do this. However, usually the leaked ceiling hitboxes are only a single unit (~1cm) wide with gaps, and the game's collision detection frequently fails to register collisions between the player and such a thin surface depending on the player's speed, so many invisible walls would only be hit at a fraction like 1/8 of passes. If you move slowly or along an invisible wall then it's much more likely for you to hit it.

    5 votes
  8. Comment on Energy as a conserved quantity (why it's a useful abstraction) in ~science

    Macil
    Link
    I remember as a kid being very confused whether potential energy was "real" and why it was treated as real by basically everyone despite being unobserved and seemingly unnecessary in a model of...

    I remember as a kid being very confused whether potential energy was "real" and why it was treated as real by basically everyone despite being unobserved and seemingly unnecessary in a model of physics. There are parts of science where things were proposed and then later were definitely directly observed and proven to be a thing in reality (like atoms), so I thought potential energy was supposed to fit the pattern too and I was confused that no one was concerned with directly observing potential energy.

    I like this essay for emphasizing at the end that the concept of energy (including potential energy) isn't necessarily meant to be a claim that that it exists as a fundamental entity in reality. Potential energy wouldn't be "wrong" if we found out the fundamental rules of reality didn't explicitly represent and track it, the same way negative numbers aren't "wrong" despite seemingly not existing directly in reality. (Though potential energy would be "wrong" in some way if we found that some calculations involving it gave the wrong answers.) They're both just mathematical tools that we've found help us simplify computing some results about reality.

    2 votes
  9. Comment on I’ve been at NPR for twenty-five years. Here’s how we lost America’s trust. in ~news

    Macil
    (edited )
    Link Parent
    I felt very similarly. I stopped listening to NPR regularly in 2016 when I thought it was weird how dismissively they talked about Bernie Sanders when I thought elements of his platform (universal...

    I felt very similarly. I stopped listening to NPR regularly in 2016 when I thought it was weird how dismissively they talked about Bernie Sanders when I thought elements of his platform (universal healthcare) were interesting and were the kind of thing I expected to get more discussion on NPR. I remember also thinking they were a bit too both-sidesy on other issues that didn't warrant it.

    And now this article is mostly just "Our mistakes were we focused too much on Mueller investigations and not enough on Hunter Biden's laptop, we were too mindful of gay and trans people, and said 'latinx' too often".

    Okay, the article might be pointing toward something real in that NPR re-imagined itself firstly as a political organization and then was awkward and uncompelling at that. I'm just very skeptical of the article's implied solutions of hiring more republicans and making sure to give air time to whatever nonsense republican media is going on about. It's possible that NPR would benefit from re-evaluating how exactly it chooses to portray and endorse political positions (including being against discrimination, which I think is great to endorse), without trying to shift right or otherwise away from its politics.

    15 votes
  10. Comment on What programming/technical projects have you been working on? in ~comp

    Macil
    Link
    I wrote a script that screenshots whatever game I'm playing every 2 minutes and then uses GPT-4 to say something about the screenshot. Its messages are pretty lame so far, but I'm impressed it...

    I wrote a script that screenshots whatever game I'm playing every 2 minutes and then uses GPT-4 to say something about the screenshot. Its messages are pretty lame so far, but I'm impressed it understands the games I'm playing this well (I queued for an Overwatch match, switched to play as the healer Mercy, etc). My goal is to make it work so I can use it while I'm streaming on Twitch and have it be interesting for me and chatters to interact with. (I don't regularly stream on Twitch, but I like the idea of doing it to push me to make presentable software like this.)

    I'm still experimenting in trying to make it say things that are more interesting. It sees its previous messages, a couple of the most recent screenshots, and my messages in the chat too when generating a message. At first I kept changing its hard-coded system prompt and restarting it to adjust its behavior, but then I finally realized I could just tell it in chat to act differently. As a lifelong programmer, it's still so trippy to me to chat with a program I made to change how it works.

    It's written in Typescript using Deno, the discordeno library, the official openai npm library, and also a small Powershell script I wrote with ChatGPT's help to use the Windows API to screenshot a specific program.

    2 votes
  11. Comment on Popular AI chatbots found to give error-ridden legal answers in ~tech

    Macil
    Link Parent
    Well, Google is extremely useful for this, as long as you can apply a little critical thought and further research to the results you get, and ChatGPT seems similar to me. It's easy to make fun of...

    Well, Google is extremely useful for this, as long as you can apply a little critical thought and further research to the results you get, and ChatGPT seems similar to me. It's easy to make fun of the people who do their own research with these tools hilariously badly but it's harder to recognize the many people who get real value out of it.

    7 votes
  12. Comment on Popular AI chatbots found to give error-ridden legal answers in ~tech

    Macil
    Link Parent
    Sycophancy is a big problem with LLMs right now. The issue has been recognized and is being studied a lot lately so I'm hopeful solutions will be found eventually.

    Sycophancy is a big problem with LLMs right now. The issue has been recognized and is being studied a lot lately so I'm hopeful solutions will be found eventually.

    1 vote
  13. Comment on Single-player games to play with my partner in ~games

    Macil
    Link Parent
    A remaster of Braid is being released on April 30 this year!

    A remaster of Braid is being released on April 30 this year!

    2 votes
  14. Comment on Playing Quake for the story (A franchise retrospective) in ~games

    Macil
    (edited )
    Link
    It's a very interesting look into the shift from plain game logic to cinematic style that happened across the Quake series and games in general, and also the ways that narrative can come through...

    It's a very interesting look into the shift from plain game logic to cinematic style that happened across the Quake series and games in general, and also the ways that narrative can come through outside of the modern cinematic style.

    I remember as a kid being very confused and disappointed by the lack of connection between the story in the manual of the original Quake and the actual game. I wanted to daydream in the settings of games I played and see the game interact with the ideas of my daydreaming, and no experience in playing Quake fit with my early conception of it. Later on, Quake 2 with its actual coherent narrative felt like an acknowledgment of my desire. And then much later on Quake 4 seemed to answer my desire even further. For a while, it really felt like games adopting more of a cinematic style was huge progress as a part of the shift to 3d and realistic graphics. It was brand new and cool. Games that didn't have that style suddenly felt dated and ready to be replaced.

    But now the cinematic style is the norm in games. We've seen it explored in tons of ways now. Quake 4 banked on "Quake 2 but modernly cinematic" being enough to carry it, but it was a little late to that. To people no longer starving for the cinematic style, it feels a bit generic outside of a few signature moments. The older games now feel much more distinct with their more experimental approaches to narrative and level design.

    I'm really glad the video continues from there by exploring the throwbacks that are the recent Quake 1 and 2 expansions. It's very cool to see the ways the level design can evolve once the designers are unshackled from the idea that Quake campaigns need to get more cinematic to get better for modern sensibilities. I really agree with the video that this was a better way to follow up Quake than a remake or a sequel, and that it's a shame the new levels haven't gotten more attention.

    Within just one of five units of the new campaign [Dimension of the Machine], the developers demonstrate complete tonal mastery over the conflicting elements of sci-fi and fantasy that the original completely failed to resolve. Here they are in actual harmony, a sci-fi civilization using their slipgates to explore a magical universe filled with dark secrets man was not meant to know, hidden horrors never meant to be unearthed. The Realm of the Astrologers, using only level design, creates a more coherent narrative than anything in the first game, and a more creative narrative than anything in the second game.

    Call of the Machine is so conscious of how the fact that Quake has never had much of a plot or much consistency is actually a kind of artistic freedom if you're willing to look at it that way. It can be reshaped and newly molded into so many strange configurations and still remain faithful to the original campaign.

    An even longer video would have something to say at this point about the revival of "boomer shooters" as an indie game genre including Dusk, or about the mapping community that still exists for Quake with the amazing work that is Arcane Dimensions, but this is probably more than enough for one video.

    One thing about the original Quake's very loose non-cinematic approach to narrative is that it makes it the perfect base for user-made levels, because tons of styles fit in with it and it's acceptable for a level to provide just mere gameplay arenas without much narrative of its own.

    7 votes
  15. Comment on The morality of using AI-generated art in my web app in ~comp

    Macil
    (edited )
    Link Parent
    The main consequence of this is that Midjourney itself can't copyright the images they automatically generate for you. Guidelines from the US Copyright Office explain that it's possible to combine...

    The main consequence of this is that Midjourney itself can't copyright the images they automatically generate for you. Guidelines from the US Copyright Office explain that it's possible to combine human authorship with an AI-generated work, through editing or even arrangement of AI outputs, and the result can be covered by copyright. So people could reuse any individual image you put up that's unedited, but if you substantially further edit the images or say build a site template out of them, those results are your own.

    10 votes
  16. Comment on Cory Doctorow: What kind of bubble is AI? in ~tech

    Macil
    (edited )
    Link
    It's surreal to see Uber brought up as directly analogous to Enron when everyone I know in SF completely switched from taxis to Uber/Lyft many years ago, raved about the improvement, and can't...

    It's surreal to see Uber brought up as directly analogous to Enron when everyone I know in SF completely switched from taxis to Uber/Lyft many years ago, raved about the improvement, and can't imagine going back. I know there was a bubble where investors were overly excited about Uber years ago, they're less excited about it now, and the prices are up a bit, but the product is still here. Taxis and city transit were already bad and it's far from obvious to me that the situation would be better now if more people had sat around waiting on them to get good instead of making rideshare services. (I still dutifully vote for all kinds of public improvements in the city.)

    I totally believe that there's a bubble in businesses building on current AI tech, but I expect that mainly has to do with there being many more people trying to get in early than there are good workable business ideas right now for the current technology level, and not because the technology is going to top out right here. I don't think the companies at the center making the biggest models (OpenAI) are going to die. They have absolutely no shortage of research directions to make current models much cheaper and new models much more powerful. The article seems to posit that copyright cases are maybe going to kill OpenAI (weird that Doctorow almost seems to be cheering for copyright here), but a recent case is looking good for AI companies. Both OpenAI and Anthropic are confident enough right now that they're offering to cover any legal cases for customers related to copyright issues from using their models. Even if copyright proved to be a big obstacle for AI companies, I fully believe they'd soon find ways to deal with the issue through training on fully licensed or artificial data.

    I feel like the general public's annoyance with the overhyped cryptocurrency bubbles has created a market for tech-industry-skeptic articles, and this article is filling that role more than providing insight on the technology and the future. I think people who primarily try to understand the tech industry as a social phenomena of certain subjects being either hyped or overhyped will understand the future less well than people who spend more time directly thinking about the technology and its possibilities.

    10 votes
  17. Comment on Netflix and Apple open door to bundling with streaming rivals in ~tv

    Macil
    (edited )
    Link Parent
    It feels weird to consider bundling the main difference between cable and streaming. I didn't start using Netflix because I didn't like bundling that cable services did. I started using Netflix...

    It feels weird to consider bundling the main difference between cable and streaming. I didn't start using Netflix because I didn't like bundling that cable services did. I started using Netflix because I wanted to be able to watch whatever episode of a show whenever I wanted instead of at a mysterious TV schedule.

  18. Comment on Node's "Single Threaded, Event Driven" programming model seems highly deceptive and farcical in ~comp

    Macil
    (edited )
    Link
    For small amounts of concurrent IO/threads it's relatively true that there's not much performance benefit to async IO over threads, but the difference is when you have a lot. Async IO doesn't use...

    For small amounts of concurrent IO/threads it's relatively true that there's not much performance benefit to async IO over threads, but the difference is when you have a lot. Async IO doesn't use threads in the background but more efficient OS APIs that allow IO to be done without extra threads. This is important because each thread has its own performance and memory cost.

    Async IO became popular in the context of the C10k problem, when it became obvious that having a thread per IO operation performed terribly at handling thousands of concurrent connections. Apache, the most popular webserver, was built on the threaded IO model, and it lost its top position to Nginx, which was built on the async IO model and performed much better at handling many concurrent connections.

    As async IO became popular, developers found that it was hard to program for in existing programming environments (like C, Python, and Java), because most standard library functions and third-party libraries used blocking IO, and calling any blocking IO functions within async code would often silently negate the performance benefit or completely destroy the performance of async code. Developers had to carefully avoid using pre-existing code that used blocking IO.

    The creator of Node, Ryan Dahl, decided that one way to solve this problem would be to create a brand new server programming ecosystem that (mostly) had no blocking IO functions and was built from the ground up for async IO. He realized that this would be hard to do within most existing language ecosystems, and that it would be easiest to do on a language not already commonly used on servers. Javascript was a convenient choice because it fit that, had no blocking IO in its standard library, and already had well-optimized implementations from its use in browsers. Unlike the common misconception, Node did not primarily exist to allow frontend JS developers to program on servers but to be a programming environment built on async IO.

    18 votes
  19. Comment on Day 3: Gear Ratios in ~comp.advent_of_code

    Macil
    Link
    Using Typescript and Deno together still. I flipped my approach to solving this a few times. Originally I decided I would process the text character-by-character to look for symbols, and then also...

    Using Typescript and Deno together still. I flipped my approach to solving this a few times. Originally I decided I would process the text character-by-character to look for symbols, and then also do that to look for numbers, but then I would have to do some annoying book-keeping to remember where I encountered each of a number's digits. I realized it would be much easier if I used a regex to recognize strings of multiple digits together, and then searched for symbols around it. I also used regexes to search for the symbols. I would use the slice() method on the strings of the surrounding rows to make a substring of only the positions neighboring the number, and then use a regex to search those for symbols.

    For part 2, I did a similar search, but I would only look for "*" symbols neighboring the numbers, and I kept track of the locations of all "*" symbols and the numbers that neighbored them in a Map object. Then I iterated through the map looking at all locations which had exactly two numbers as neighbors.

    Typescript
    import { assertEquals } from "https://deno.land/std@0.208.0/assert/mod.ts";
    import { runPart } from "https://deno.land/x/aocd@v1.5.1/mod.ts";
    
    class Coordinate {
      row: number;
      column: number;
    
      constructor(row: number, column: number) {
        this.row = row;
        this.column = column;
      }
    
      toString() {
        return `${this.row},${this.column}`;
      }
    
      static fromString(str: string): Coordinate {
        const [row, column] = str.split(",").map(Number);
        return new Coordinate(row, column);
      }
    }
    
    function parse(input: string): string[] {
      return input.trimEnd().split("\n");
    }
    
    function* getNumberSymbolNeighbors(
      lines: string[],
      numberCoordinate: Coordinate,
      numberLength: number,
      symbolRegex = /[^0-9.]/g,
    ): Generator<Coordinate> {
      for (
        let row = numberCoordinate.row - 1;
        row <= numberCoordinate.row + 1;
        row++
      ) {
        const line = lines[row];
        if (!line) {
          continue;
        }
        const searchPartStart = Math.max(0, numberCoordinate.column - 1);
        const searchPart = line.slice(
          searchPartStart,
          numberCoordinate.column + numberLength + 1,
        );
        for (const symbolMatch of searchPart.matchAll(symbolRegex)) {
          yield new Coordinate(row, searchPartStart + symbolMatch.index!);
        }
      }
    }
    
    function numberHasSymbolNeighbors(
      lines: string[],
      numberCoordinate: Coordinate,
      numberLength: number,
      symbolRegex?: RegExp,
    ): boolean {
      for (
        const _value of getNumberSymbolNeighbors(
          lines,
          numberCoordinate,
          numberLength,
          symbolRegex,
        )
      ) {
        // Just return true as soon as we've found one, don't need to keep looking.
        return true;
      }
      return false;
    }
    
    function part1(input: string): number {
      const lines = parse(input);
      const partNumbers: number[] = [];
      lines.forEach((line, row) => {
        for (const numberMatch of line.matchAll(/[0-9]+/g)) {
          const numberCoordinate = new Coordinate(row, numberMatch.index!);
          if (
            numberHasSymbolNeighbors(lines, numberCoordinate, numberMatch[0].length)
          ) {
            partNumbers.push(Number(numberMatch[0]));
          }
        }
      });
      return partNumbers.reduce((a, b) => a + b, 0);
    }
    
    function part2(input: string): number {
      const lines = parse(input);
      // keys are stringified coordinates
      const gearCoordsToNumbers = new Map<string, number[]>();
      lines.forEach((line, row) => {
        for (const numberMatch of line.matchAll(/[0-9]+/g)) {
          const numberCoordinate = new Coordinate(row, numberMatch.index!);
          for (
            const gearCoordinate of getNumberSymbolNeighbors(
              lines,
              numberCoordinate,
              numberMatch[0].length,
              /\*/g,
            )
          ) {
            const gearCoordinateString = gearCoordinate.toString();
            let gearNumbers = gearCoordsToNumbers.get(gearCoordinateString);
            if (!gearNumbers) {
              gearNumbers = [];
              gearCoordsToNumbers.set(gearCoordinateString, gearNumbers);
            }
            gearNumbers.push(Number(numberMatch[0]));
          }
        }
      });
      return Array.from(gearCoordsToNumbers.values())
        .filter((gearNumbers) => gearNumbers.length === 2)
        .map(([a, b]) => a * b)
        .reduce((a, b) => a + b, 0);
    }
    
    if (import.meta.main) {
      runPart(2023, 3, 1, part1);
      runPart(2023, 3, 2, part2);
    }
    
    const TEST_INPUT = `\
    467..114..
    ...*......
    ..35..633.
    ......#...
    617*......
    .....+.58.
    ..592.....
    ......755.
    ...$.*....
    .664.598..
    `;
    
    Deno.test("part1", () => {
      assertEquals(part1(TEST_INPUT), 4361);
    });
    
    Deno.test("part2", () => {
      assertEquals(part2(TEST_INPUT), 467835);
    });
    
    1 vote
  20. Comment on The Boys | Season 4 official teaser trailer in ~tv

    Macil
    (edited )
    Link Parent
    I'm not against it in principle, but I hate how they seem to stick to an overly predictable strict schedule of having one shockingly violent scene per episode. It's so routine that you know if the...

    I'm not against it in principle, but I hate how they seem to stick to an overly predictable strict schedule of having one shockingly violent scene per episode. It's so routine that you know if the episode is most of the way through without it happening yet that a twist is going to happen any minute now with one.

    6 votes