I tried using j for some of my advent of code puzzles. I found it wasn’t totally suitable for a lot of the challenges, but I had fun learning about J nonetheless.
J is a declarative and functional array programming language. I like this quote from J’s new user guide:
J isn’t just another way to declare variables and write loops. J is a way of thinking big: describing an algorithm by looking at it as a whole and breaking it into its natural parts. You’re going to have to spend some time learning what those natural parts are. Your skill as a program designer will help, but it will be fighting against your learned tendency to think small.
But I won’t be giving an example of that. I’ll just show how some of J’s vocabulary works.
Here’s how to multiply two numbers in J:
4 * 4
16But let’s look at a silly way of doing the same multiplication:
NB. note that comments in J start with NB., for nota bene
1
1
NB. commands read right to left.
NB. $ is the reshape operator it will take the input and
NB. change it into an array with the size on the left.
4 $ 1
1 1 1 1
NB. you can reshape to multiple dimensions
4 4 $ 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
NB. now we have 4 * 4 = 16 ones above, we need to add them up.
NB. / is the insert operator. It adds it's left operand between
NB. everything in the right operand.
NB. So this shows the sum of all of the columns:
+ / 4 4 $ 1
4 4 4 4
NB. So, to get the result of 4 * 4, we need to apply the + insert twice:
+ / + / 4 4 $ 1
16Now, let’s imagine Guass knew J when he was in school, he could have done this:
+/ 1 + i.100
5050Which probably isn’t as fun as the original story.
And for day of of 2017 advent of code, the question was very well suited for J. It gives you a 16 x 16 array of numbers, and asks for the sum of the max of each column minus the minus of each column. So in J, that was:
e =: 790 ... NB. tonnes of numbers
NB. reshape the input.
f =: 16 16 $ e
NB. insert the minimum into the list
max =: >./
NB. insert the maximum into the list
min =: <./
NB. sum of maxes minus mins. (|: is transpose)
+/ (max |: f - min |: f) NB. answerAnd that’s it. I really love J but I doubt I’ll get any chance to use it professionally.