this post was submitted on 13 Nov 2023
113 points (87.4% liked)

Programming

16769 readers
98 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities [email protected]



founded 1 year ago
MODERATORS
top 18 comments
sorted by: hot top controversial new old
[–] [email protected] 63 points 9 months ago (3 children)

Well now. A few things, here:

  • there are not 9 × 9 × 9 × 9 × .... possible ways to play. After the first move, 8 squares remain, and so on, so there's at most 9 × 8 × 7 × ... = 9! = 362880 ways that the game can be played, ignoring the fact that most of those can be eliminated as reflections and rotations, or as win positions before you fill the whole board.

  • we don't care how we got there. Each square can either be blank, a cross, or a nought, so 3^9 combos = 19683, and most of those are illegal, as only the boards where there's (one or zero) more crosses than noughts are good. And you don't need to store 'the computer's move', just jump directly to letting the player go again. Let's guess we need at most a quarter of that.

  • we could have created a single web page with 5k anchor elements on it back in the HTML 1.0 days, ignoring the fact that it would have taken a while to download on our 28.8K modems. That wouldn't have been 170 Mb of unnecessary tagging, even with the 'lay it out with tables' style we had at the time.

Google do seem to have a predilection for reinventing the past, poorly. I hear that their bonuses are based on inventing 'new' things, though, so it's in their interest to pass it off?

[–] [email protected] 36 points 9 months ago (1 children)

Indeed. One could have done the whole thing with a simple, static HTML page.

On top an empty board with 9 clickable fields. Each of them links to a new, pre-rendered board on the same page, with the move of the player and the perfect reply of the computer already in place, and 7 clickable fields. Which link to other, pre-rendered boards with 5 clickable fields remaining, then with three. The last one only has one field open, so this could be pre-filled as a player move.

All in all this would result in 9x7x5x3=945 pre-rendered boards max on that page. And, of course, two links to "You won" and "You Lost". I'm no HTML junkie, so I have no idea how many bytes one would need to produce such a board, but I'm sure this all could easily done way below 170MB.

[–] [email protected] 12 points 9 months ago* (last edited 9 months ago) (1 children)

Some of those boards are impossible, and there are multiple ways to get to most of them, so you only need maybe half of that. There are 5,478 possible valid boards in total if you allow the computer to play any legal move.

[–] [email protected] 5 points 9 months ago

As I described, I'd need way fewer, as the optimal computer counter-move would already be included in the next board.
So if you placed your X in the top left field in the starter image, the link would directly go to a field with the X in the top left, the O in the center position, and links in all the remaining seven positions. And of course the pre-calculation will eliminate some of the boards already, e.g. if the player or computer already won after the third move, where placing a fourth will not make sense.

[–] [email protected] 29 points 9 months ago (1 children)

And that, kids, is why maths is absolutely necessary if you want to amount to anything more than a shitty webdev.

[–] nitefox 2 points 9 months ago

Which is also why I’m a shitty webdev

[–] [email protected] 11 points 9 months ago* (last edited 9 months ago)

170 Mb of unnecessary tagging

The guy in the blog says mb (millibits) and you say Mb (megabits). I was confused so I checked, and the page is 170MB (megabytes). I agree though, that's inefficient even for an intentionally inefficient idea.

[–] [email protected] 45 points 9 months ago (1 children)

Modern web development in a nutshell.

[–] [email protected] 31 points 9 months ago

ahem excuse me?

modern implementation would have at least a 300mb node_modules/ and a bunch of memory leak sources

[–] [email protected] 33 points 9 months ago

170 MEGABYTES. Excusez moi?

[–] [email protected] 21 points 9 months ago (2 children)

Sorry, but, mb, in lowercase? Like millibit?

[–] [email protected] 19 points 9 months ago (1 children)

“I implemented the FizzBuzz algorithm in only 10 million lines of code!”

[–] [email protected] 13 points 9 months ago (1 children)
char* fizzbuzz(int n) {
    switch (n) {
        case 0: return "fizzbuzz";
        case 1: return "1";
        case 2: return "2";
        case 3: return "fizz";
        case 4: return "4";
        case 5: return "buzz";
        ...
    }
}
[–] [email protected] 7 points 9 months ago

A terrifying number of people think like that.

[–] [email protected] 8 points 9 months ago (1 children)

For comparison the original StarCraft game asks for 80 uppercase megabytes of HDD (76.294 of whatever we're calling the lowercase thing today) and for RAM it asks for 16MB/15.259mib.

[–] [email protected] 11 points 9 months ago

whatever we're calling the lowercase thing

  • M: "Mega": 1000^2
  • Mi: "Mebi": 1024^2
  • m: "Milli": 1000^-1
[–] [email protected] 6 points 9 months ago (1 children)

Doesn't seem to work in Firefox? It just displays every combination lol

[–] [email protected] 5 points 9 months ago

It uses a newer HTML feature called popover which Firefox doesn't support by default yet.