We interrupt the irregularly scheduled philosophical posts for some
programming memes:
Over the last few days, the Internet has divided itself over what the
value of the expression 8÷2(2+2) should be. Some say it should be
evaluated as (8÷2)×(2+2) = 16. Some say it should be evaluated as
8÷(2×(2+2)) = 1.
At the risk of belaboring the obvious, the core dispute here is not
really mathematical. There is not some sequence of mathematical
operations that produces some number, where mathematicians disagree
about what number it produces. Instead, this is a dispute about
mathematical notation: what sequence of mathematical operations the
expression corresponds to the way it’s written. Specifically, it is a
dispute about whether multiplication written as juxtaposition (how “2”
is written right next to “(2+2)”) has strictly higher precedence than
division. It is closer to a linguistic or typographical dispute than a
purely mathematical one, and the correct answer to the dispute is that
whoever wrote the expression that way should learn to write math
better.
This debate is not even new. The internet had fun arguing over 48÷2(9+3) and 6÷2(1+2),
which are functionally identical ambiguous expressions, eight years ago.
I don’t know why the debate is resurging now and why we still haven’t
gotten tired of it.
But life is short, so since we’re here anyway, let’s make some
additional memes.
Asking the computer
Some of my coworkers had the idea to ask some programming languages
what the answer was. The results were underwhelming.
$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 8/2(2+2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
5:27 PM phenomist: do you use gridderface to make
pretty puzzles?
…
5:52 PM phenomist: actually nvm excel is probably
easier lol
Okay I’m sorry this is a horrible puzzle where the rules don’t make
sense and I didn’t even get it testsolved. I just wanted an image to
concisely demonstrate the capabilities of
gridderface, my
puzzle marking and creation program, for the project homepage, after
somebody expressed interest in using the program to write a puzzle. Then
I got tremendously carried away.
So, what have I been doing with programming recently?
Scala is an amazing
multiparadigm programming language that runs on the Java Virtual Machine
and interoperates with Java. I learned about it last time reading random
articles on Twitter.
When I say “amazing” I mean “This is a language in which my code
gives me nerdgasms every time I read it.” Wheeee.
Okay, it’s not perfect. People say it’s too academic. It has a
notoriously complicated type system (which is
Turing-Complete
at compile time). Its documentation is a bit patchy too. For a
serious introduction, the Scala website has plenty of links under
documentation, and a tour
of features. Somebody wrote
another tour that
explains things a bit more. So here, instead of introducing it
seriously, I’m just going to screw with its features.
Example of freedom. Scala lets names consist of symbols, and treats
one-parameter methods and infix operators exactly the same. The full
tokenization rules are a bit detailed and I put them at the bottom of
this post for the interested. This lets you create classes with
arithmetic and domain-specific languages easily, but it also creates
some silly opportunities:
scala> val * = 12
*: Int = 12
scala> * * * * *
res0: Int = 1728
Yay?
Right now I feel about this a lot like I felt about getting Twitter. Nobody I know personally is there, but all the “famous” “technological” people are, and something like 90% of the open-source projects I bump into are too.
Just like Twitter, I barely know how to use Git either, but that’s okay. For version control I’m going all command-line now! Last time I tried to link stuff up with Eclipse everything exploded, but after I ran git init from the terminal this time, it’s highlighting things red and green everywhere like it’s suddenly begging me not to forsake it for the command line.
Okay I don’t actually know how this pointless rambling got so long. I
know the longer it is the more people will just tend to skim, because I
do that all the time. So I went back and refactored—er, rewrote all the
somewhat tangential bits (wow these puns are too easy) into footnotes.
Manually. Obviously if I have to do this again I’ll write a script for
it. But the post is still really long, and I bet nobody will read the
whole thing. Oh well.
Life updates: I got out of the hospital Friday two-and-a-half weeks
ago, went to the preliminaries of NPSC (a national team programming
contest) with classmates, threw up a lot, went back into the hospital,
and came out again. I wrote a lot of stuff about the experience and how
much it sucked (hint: a lot) when I started this draft around
that time, but now putting so much detail in this post feels weird. I’m
mostly good now.
Three years ago NPSC was the only programming contest I really knew
of; now I’ve participated in quite a few more, both online and locally,
but it’s still the only contest I’ve entered that gives you real-time
verdicts. I believe it inherits this from being modeled after ACM-ICPC,
but that’s for college people and I’m less clear on how it works. All
the other contests, namely
TopCoder,
CodeForces,
USACO, and the other local individual
competition (there doesn’t appear to be an English name so for the
purpose of this post I’ll just call it “Nameless Local”; there’s a
nation-wide competition in one-and-a-half weeks!), have system tests
after the contest that don’t allow you to resubmit afterwards. They all give pretests that you get
to know about right away, just to catch super-silly non-algorithmic
mistakes like failing to remove the debug statements or reading input
from the wrong place, but these contain weak test cases and don’t
guarantee that the solution will pass the system tests and get full
score.