Coder Social home page Coder Social logo

guidodipietro / doomsday-battle Goto Github PK

View Code? Open in Web Editor NEW
0.0 2.0 0.0 11 KB

"Doomsday" algorithm to find the weekday of a given date, implemented in 8 languages, which battle to see who's the strongest!

C 20.15% Haskell 10.97% Julia 9.53% JavaScript 12.76% Prolog 20.11% Python 13.93% Wollok 12.54%
julia python javascript c chelang prolog wollok haskell language-comparison

doomsday-battle's Introduction

Doomsday algorithm battle ๐Ÿ—“

Algorithm that calculates the weekday of a given date in the Gregorian calendar, implemented in Python, Haskell, C, JavaScript, Wollok, Prolog, Julia, and CheLang.
What highlights from each of them?

The algorithm

You get the weekday by adding up all these numbers:

  • The day (i.e. for August 18th 2049 it is 18)
  • The month code (being 6, 2, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4, from January to December)
  • The "century" code (mod 4) (first 2 digits of the year number, i.e. for 2014 it is 20)
    • Codes are 0, 5, 3, 1 for 0, 1, 2, 3 (mod 4)
  • The "year" (last 2 digits of the year number, i.e. for 1984 it is 84)
  • The "year" divided by 4 (rounded down)
  • Subtract 1 if the year is a leap year, and if the month is January or February
    • Leap years are those which are a multiple of 4 and not of 100, or else, a multiple of 400

Then, you take modulo 7 of all that, and you find the weekday as:

  • 0 = Sunday
  • 1 = Monday
  • ...
  • 6 = Saturday

As you can see, it is very simple to implement. It can even be calculated mentally in a few seconds (or less) with enough practice.

Who won? ๐Ÿค”

Let's make a battle!

By lines of code

Let's count non-empty lines relevant to the algorithm!
By the way, many of these programs can be reduced a lot, but I tried to code as naturally as possible in all of them and keep things readable.
Also, I am not excellent in these languages, so you can expect to see some sub-optimal code here and there ๐Ÿ˜œ

  • Python - 7 lines
  • Julia - 8 lines
  • JavaScript - 8 lines
  • C - 8 lines
  • Wollok - 11 lines
  • Haskell - 16 lines (5 are just type declarations, so it's probably better to say 11 ๐Ÿ˜€)
  • CheLang - 20 lines
  • Prolog - 34 lines (the knowledge base really killed it)

There is a triple tie for the second place, and a perhaps double tie for the third! Also, JavaScript and Julia both have 1 line that only serves as code block finish (end and })... How unfortunate ๐Ÿ˜ฅ

Let's try to break those ties.

By number of characters

Maybe some use more lines, but less characters... Let's see who gets favoured if we only count non-blank characters!

I will use the same variable names for those that stand a chance at being high in the rankings (sorry about that, Prolog, CheLang...)

  • Python - 203 characters
  • Julia - 210 characters
  • JavaScript - 250 characters
  • C - 255 characters
  • Wollok - 279 characters
  • Haskell - 404 characters - 301 without type declarations (ouch)
  • Prolog - 505 characters
  • CheLang - 595 characters (phew!)

The ties are broken! However... C uses the short int declarations 4 times, which could just be changed to int to shave off 20 characters and beat JavaScript!
(Future self note: why not use char in the first place or smt instead of the meme short int, lol?)

In any case, the winner here turns out to be Python, however Julia comes really, really close to it. Removing the const declarations in Julia would make it beat Python (and still outperform it in execution time ๐Ÿคซ) but we're leaving them just so that the victory in the next section is as crushing as it is. (spoilers!!)

Finally, CheLang comes last here, despite it having 14 lines less than Prolog, due to its highly verbose argento slang syntax, which also makes the language so beautiful.

By execution time

Ok, but many of these programs are already really similar. Python, Julia, C, JavaScript, Wollok, all seem to be basically the same thing just with different syntax...

Let's have some fun no, it's terrible benchmarking these functions/methods/predicates in every language! why

  • Julia - 2.199 ns โ€ผ
  • C - 9 ns
  • JavaScript - 396 ns
  • Python - 790 ns
  • Prolog - about 2 ยตs ~= 2000 ns
  • CheLang - about 484 ยตs ~= 484000 ns
  • Haskell - couldn't get it working...
  • Wollok - there is literally no way to do it

Wow. Julia beat everyone here, end of discussion. ๐ŸŽ‰
Even measuring the time was much simpler than in any of the other 7 languages: just import a library and call the function with the @btime macro, and that's all.

C did extremely well in speed, as it's usual, but Julia... it's just crazy.

I'm quite disappointed with Python and Prolog in this task, and with myself for not being able to deal with timing stuff in Haskell (gosh, stack is really harsh).

Awards ceremony ๐Ÿ…

Shortest code

In the "shortest code" category, the winner is Python, for winning both in number of lines and number of characters, with Julia in the second place, for just having 1 more line than Python because of a single keyword, and not beating Python in number of characters just because she's too kind.
In the third place, we have JavaScript, with also 1 more line that only has one character. What a waste! The number of characters in JavaScript altogether is quite higher than the first two places, though.

A notable mention to Wollok, for being just a teaching language yet being able to come rather high in the rankings!

Fastest code

In the "fastest code" category, the winner is obviously Julia, with a really close second place of C, who both ridiculously outperformed every other language by a huge margin.
There is no third place, since everyone else was terribly slow in comparison. Sorry for that, JavaScript.

A consolation prize is awarded here to CheLang, since even though its runtime was the slowest of them all (being like 250,000 times slower than Julia ๐Ÿคฃ), it was possible to find a workaround to benchmark a function, even it being a meme language. That was quite satisfying I gotta admit!

Most elegant code

Finally, in the "most elegant code" category, the winner has to be Julia again. This is just personal preference, but look at this: รท symbol used for integer division? Just one macro @btime used to benchmark efficiently and accurately? Functions defined casually as f(x) = stuff with x, as if I were writing random math notes? And it is extremely fast too? I just can't help but be charmed at that code.

Final words

I'm quite sorry to not see Haskell in any of these awards, since it is such an amazing language that I like a lot. I will highlight from it that I like very much how the doomsday function is called: doomsday 29 2 2020, no parentheses anywhere. That is very clean and I like it.

Also, a pity for Prolog, but this is not really the use for this language. Maybe my code was terrible, my apologies to the little owl! ๐Ÿฆ‰

Would you like to contribute?

Adding languages to this battle is welcome! Make your pull request, or an issue perhaps.

Also, improvements or suggestions for any of the 8 languages that are already featured is always appreciated.

Thanks for the read ๐Ÿค™

doomsday-battle's People

Contributors

guidodipietro avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.