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 4 ways I can help you:

  1. If you want a one-stop shop to help you quickly level up your serverless skills, you should check out my Production-Ready Serverless workshop. Over 20 AWS Heroes & Community Builders have passed through this workshop, plus 1000+ students from the likes of AWS, LEGO, Booking, HBO and Siemens.
  2. If you want to learn how to test serverless applications without all the pain and hassle, you should check out my latest course, Testing Serverless Architectures.
  3. If you’re a manager or founder and want to help your team move faster and build better software, then check out my consulting services.
  4. If you just want to hang out, talk serverless, or ask for help, then you should join my FREE Community.

 


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 *