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.