Readit News logoReadit News
waf · a year ago
Fun exercise! I found that the Ruby in this post resembles modern C# (probably because Ruby is a gold standard in readability, and in the last 5 years or so C# has been making big strides in readability). I've recreated the Ruby code mostly line-for-line in C# and posted it here: https://gist.github.com/waf/5c6a04899e8250cb9a89406b978c9bcc

It mapped from Ruby to C# really well. The only concept I had to add was a `BoardCell` base type for the `Mine` and `Empty` types so we could return either `Mine` or `Empty` in a typesafe way. Everything else matched conceptually 1-1.

It's 118 lines total, with 18 lines of whitespace, so 100 lines exactly. I figure the original Ruby code was also not counting whitespace so it's a fair comparison. I tried to not use any "code golf tricks" that would minimize line count. It's a full program; it could be copy/pasted into a modern .NET 8 project and run without any additional setup.

Note, I posted this same comment on the original blog post, but I've posted it here too as it might be interesting for HN folks.

radanskoric · a year ago
Author here, thank you for doing this! Really nice. And yes, I was not counting empty lines, and also, no code golfing. :)
neonsunset · a year ago
Thank you for making a C# variant, with K&R braces it's just 102 lines, and 1.5 MB binary (quite a few un-strippable baseline bits like integer formatting) when AOT compiled with 9 preview, we've come a long way...
akdfax · a year ago
Very nice syntax. Ruby is definitely underappreciated at the moment.
RodgerTheGreat · a year ago
I had a go at an implementation of my own in Lil, using an imperative style rather than OOP. I tried to loosely follow the organization as shown here, but opted for a very different board representation, and I included some niceties like displaying board legends to aid in choosing the proper coordinates.

https://github.com/JohnEarnest/Decker/blob/main/examples/lil...

I'm really not convinced that OOP simplifies or clarifies this type of program.

codesnik · a year ago
I'd too probably write it in Ruby using classes basically just as modules and not much else. It's totally fine using simple arrays and hashes in Ruby for data structures. For example, unlike in many other languages, board could be just a hash of booleans addressed by "tuples", like @board = {[x1, y1] => true, [x2, y2] => true}, which makes neighbours check trivial, while board will be sufficiently compact.
pooriar · a year ago
I'm currently implementing my favorite 2 player board game - Raptor - in Ruby, and this article is giving me great ideas for how to structure it better. Thanks so much to the author for writing this up!
radanskoric · a year ago
Author here, I'm really glad it helped! Thank you for reading. :)
igor47 · a year ago
Cool! Mine sweeper is a really fun easy game to implement. I did a version in Python a few years ago: https://github.com/igor47/sweeper but mine is closer to 500 lines
darthg0d · a year ago
Ditto. I did the same with GoLang a couple of years back, but didn't aim for clean/terse code: https://github.com/jedib0t/go-mines
BogdanOlar · a year ago
Same, in Rust, just as an exercise to get familiar with GUIs. So I ended implementing it twice, once with `iced`: https://github.com/BogdanOlar/iced-minesweep-rs , and with `egui`: https://github.com/BogdanOlar/egui-minesweep-rs , using the common `minefield-rs` library: https://github.com/BogdanOlar/minefield-rs

It's a really fun exercise, and a good way to practice new skills. Highly recommend it.

oneeyedpigeon · a year ago
Warning to Mac users: you'll need at least ruby 2.7 to run this because it uses a feature called 'argument forwarding'. Looks like the latest ruby installed on macOS 15 is 2.6.

I eventually got it working with a combination of techniques from [this stackoverflow post](https://stackoverflow.com/questions/8730676/how-can-i-switch...) but it's not left my system in the cleanest of states.

radanskoric · a year ago
Author here, that's a good point. Most of my readers are Ruby developers and no one doing Ruby regularly uses the macOS Ruby. I'll throw in a simple Dockerfile for easier running.
AlchemistCamp · a year ago
radanskoric's sibling comment is correct (but flagged).

Most Ruby devs I know are on Macs and none of them are running the ancient version Apple installs. Just like with most other languages, even JavaScript, you'll want to get a current or recent version.

Either use a version manager like RVM (popular) or ASDF (my favorite tool since it handles nearly all languages). You can also install Ruby with Homebrew, but I don't recommend using Homebrew for managing programming languages since you may want different versions on different projects.

Jtsummers · a year ago
It's not flagged, it's dead. Their comments and submissions are all auto-killed. My guess is it's because their account had one comment in 2015, no activity until 2022, and then a submission. Everything from that submission in February 2022 on is dead (not [flagged][dead], just [dead]).

radanskoric: You should reach out to the mods (contact link at the bottom of almost every page here) and ask to have your account un-banned.

dialsMavis · a year ago
rbenv is another great Ruby version manager.
aaronpkelly · a year ago
Why are all of radanskoric's replies in this story marked as [dead]? He is replying to people here and all his comments won't show for people who don't have showdead enabled

And when I check his profile, almost every comment he's made is also marked as [dead] - but I don't see a good reason why?

radanskoric · a year ago
Thank you again for notifying me about this. I emailed dang and he restored my account right away! :)
defrost · a year ago
Good question, you might want to email dang hn@ycombinator.com and ask - it goes back to 2022 and might be related to excessive self promotion, something else, or even an accidental click.
wkjagt · a year ago
Very fun stuff, and nice post.

Reminds me of my 2048 game clone in Ruby in about 100 lines (https://github.com/wkjagt/2048)

And I just saw that I did this - oh god - 9 years ago. Time goes way too fast.