One of the virtues of J is its conciseness; I think this is underrated in exploratory programming. Here I present some J one-liners alongside samples of other languages.
GCD of Random Integers
Problem: pick two random integers between 1 and 1,000,000,000 and find their GCD.
This Python solution is from @MemeArcana:
>>> from random import randint
>>> from math import gcd
>>> gcd(*[randint(1, 1_000_000_000) for _ in range(2)])
1
Compare to J
+./ ?2#1000000000
1
(thanks to Randy MacDonald for a correction)
Shuffle a 1-D Array
Python:
>>> import random
>>> random.shuffle(array)
J:
(?~@#{[)
This is characteristic of the APL family: it doesn't depend on a library but it still uses fewer characters!
This can be extended to an array of arbitrary dimension:
($ $ (?~@#{[)@,)
Linear Regression
Python and R from Richard Dinga:
lm(y ~ x)
>>> import numpy as np
>>> from sklearn.linear_model import LinearRegression
>>> reg = LinearRegression().fit(x, y)
J:
y %. 1 ,. x
Sample Without Replacement
To sample x
items from a 1-D array y
:
x {.?~# y
Generate a Random Permutation and Find its Inverse
C example from the GSL manual:
#include <stdio.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>
#include <gsl/gsl_permutation.h>
int
main (void)
{
const size_t N = 10;
const gsl_rng_type * T;
gsl_rng * r;
gsl_permutation * p = gsl_permutation_alloc (N);
gsl_permutation * q = gsl_permutation_alloc (N);
gsl_rng_env_setup();
T = gsl_rng_default;
r = gsl_rng_alloc (T);
gsl_permutation_init (p);
gsl_ran_shuffle (r, p->data, N, sizeof(size_t));
gsl_permutation_inverse (q, p);
gsl_permutation_free (p);
gsl_permutation_free (q);
gsl_rng_free (r);
return 0;
}
In J:
/: ?~ 10