Introduction to J

Written by Ben Wendt

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

But let’s look at a silly way of doing the same multiplication:

   NB. note that comments in J start with NB., for nota bene
   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

Now, let’s imagine Guass knew J when he was in school, he could have done this:

   +/ 1 + i.100

Which 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. answer

And that’s it. I really love J but I doubt I’ll get any chance to use it professionally.