More fun with APL

Yan Cui

I help clients go faster for less using serverless technologies.

Note: see the rest of the series so far.

 

I stumbled across this post the other day and problem 2 seems like something I can easily do in APL since it essentially requires you to interleave two arrays.

The problem is:

Write a function that combines two lists by alternatingly taking elements. For example: given the two lists [a, b, c] and [1, 2, 3], the function should return [a, 1, b, 2, c, 3].

Here’s the solution I have come up with:

p2

since it uses both $latex \omega$ (right argument) and $latex \alpha$ (left argument) so it’s a dyadic function, let’s test it out:

$latex ‘a’ \ ‘b’ \ ‘c’ \ p2 \ 1 \ 2 \ 3$

=> a 1 b 2 c 3

Here’s how it works:

  • concatenate the two arguments together, with the left argument first $latex (\alpha, \omega)$
  • reshape $latex \rho$ the concatenated vector into 2 rows, so that you have effectively placed $latex \alpha$ and $latex \omega$ into a matrix, i.e.

$latex

a \ b \ c\\*

1 \ 2 \ 3$

  • transpose that matrix

$latex

a \ 1\\*

b \ 2\\*

c \ 3$

  • reshape $latex \rho$ the transposed matrix into a vector, and that’s it!

 

Whenever you’re ready, here are 3 ways I can help you:

  1. Production-Ready Serverless: Join 20+ AWS Heroes & Community Builders and 1000+ other students in levelling up your serverless game. This is your one-stop shop for quickly levelling up your serverless skills.
  2. I help clients launch product ideas, improve their development processes and upskill their teams. If you’d like to work together, then let’s get in touch.
  3. Join my community on Discord, ask questions, and join the discussion on all things AWS and Serverless.

7 thoughts on “More fun with APL”

  1. Strictly speaking your result is a one row matrix rather than a vector. If it’s truly a vector that you want, then your code can be simplified by using ravel rather than reshape (and some of the parentheses can be removed too):

    s1?{,?(2,??)??,?}

    These days I prefer to use the monadic function Tally (?) rather than monadic ?: Tally returns the length of the leading axis, which in the case of a vector is its length. Tally has the benefit of always returning a scalar.

    s2?{,?(2,??)??,?}

    A more traditional solution would be to use Catenate (,) with fractional axis:

    s3?{,?,[?io+.5]?}

    although unless you use the slightly awkward ?io+.5 the expression is ?IO dependent.

    Recent versions of Dyalog include Table (?) which has been in Sharp APL and J for many years. Using Table allows the following solution:

    s4?{,?,??}

    The last expression is the fastest, but as to which is “best” .. well that is in the eye of the beholder !

  2. Thanks for these, that’s one of the things I like above APL – there’s always so many different ways to approach a given problem!

Leave a Comment

Your email address will not be published. Required fields are marked *