Highlights of the 2020 APL Problem Solving Competition – Phase I

We received some excellent competition entries this year. Once again, thank you to all those who participated, congratulations to this year’s winners, and thank you to the Grand Prize Winner Andrii Makukha for his presentation at this year’s user meeting.

This post contains some suggested Phase I solutions along with some comments from the judges. Before each solution there is a brief summary of the problem and a link to the full problem on the practice problems site; you can also download the full set of problem descriptions as a PDF.

This page contains spoilers. The suggested solutions are not the only correct solutions, and may not necessarily be best practice depending on your application or most optimal in terms of performance, but they do solve the problems in some particularly interesting and elegant ways. If you’d like to try to solve the problems yourself before looking at these example solutions, you can use problems.tryapl.org to check your solutions.

1: Let’s Split

The first problem was to write a function splitting a vector right argument into a nested vector of vectors according to a signed integer left argument. For example:

      ¯3 (your_function) 'DyalogAPL'
┌──────┬───┐
│Dyalog│APL│
└──────┴───┘

Most entrants successfully solved this problem using dyadic take and drop .

{c←⍺+(⍺<0)×≢⍵ ⋄ (c↑⍵)(c↓⍵)}

It was common to use the left argument as-is with and , and swap the two parts of the result using ⌽⍣condition or condition⌽array, but the solution above avoids the swap by computing appropriate arguments to and .

Try it now with TryAPL

2: Character Building

In problem 2, we asked participants to partition a vector of UTF-8 character encodings, similarly to 'UTF-8'∘⎕UCS¨, without using ⎕UCS. For example:

      (your_function) 68 194 165 226 141 186 226 140 138 240 159 148 178 57   
┌──┬───────┬───────────┬───────────┬───────────────┬──┐
│68│194 165│226 141 186│226 140 138│240 159 148 178│57│
└──┴───────┴───────────┴───────────┴───────────────┴──┘

Eight participants submitted this (or a variation thereof):

{⍵⊂⍨1≠128 192⍸⍵}

Instead of doing multiple comparisons, this neatly uses interval index to check which range the argument is in. It then uses partitioned-enclose to create partitions beginning where code points are either below 128 or above 192.

Try it now with TryAPL

3: Excel-lent Columns

Problem 3 was simply to convert Microsoft Excel-style column letters to an integer. For example:

      (your_function) 'APL'
1104

Thirty-five participants submitted variations on this:

{26⊥⎕A⍳⍵}

While simple at first glance, it is actually quite involved because ⎕A⍳⍵ can give 26 (for Z) which isn’t a valid digit in base-26. However, decode handles out-of-bounds digits by carrying.

Try it now with TryAPL

4: Take a Leap

The task for problem 4 was to write a function to verify which of an array of integer years are leap years. For example:

      (your_function) 1900+10 10⍴⍳100
0 0 0 1 0 0 0 1 0 0
0 1 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 1 0 0
0 1 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 1 0 0
0 1 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 1 0 0
0 1 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 1 0 0
0 1 0 0 0 1 0 0 0 1

We had eight solutions like this one:

{0≠.=4 100 400∘.|⍵}

At first, it generates a 3-element vector showing whether the argument is divisible by 4, 100 or 400.

      0=4 100 400∘.|1900
1 1 0

The cleverness then is that ≠⌿ is used to express the logic of the leap-year algorithm. From Wikipedia:

if (year is not divisible by 4) then (it is a common year)
else if (year is not divisible by 100) then (it is a leap year)
else if (year is not divisible by 400) then (it is a common year)
else (it is a leap year)

We can check this with all possible length-3 boolean arguments:

      2⊥⍣¯1⍳¯1+2*3
0 0 0 1 1 1 1
0 1 1 0 0 1 1
1 0 1 0 1 0 1
      ≠⌿2⊥⍣¯1⍳¯1+2*3
1 1 0 1 0 0 1

Consider each case in turn:
1. Leap year, return 1
2. Can never occur
3. Not a leap year, return 0
4. Can never occur
5. Can never occur
6. Can never occur
7. Leap year, return 1

It is good because it uses no explicit loops and keeps intermediate values flat (no nesting). The solution leverages that each leap year rule is an exception to the previous one, and this particular formulation employs an unusual inner product ≠.= (equivalent to {≠/⍺=⍵} for vector arguments) to compute the parity of the divisibilities.

Try it now with TryAPL

5: Stepping in the Proper Direction

Problem 5 was to create a list generator somewhat similar to iota . However, this list generator takes a 2-element integer right argument and returns a list starting from the first integer and either increasing or decreasing in steps of 1 until the last integer inclusively. For example:

      (your_function) 4 ¯3
4 3 2 1 0 ¯1 ¯2 ¯3

Only one person had this exact solution, though many solutions were not too far off:

{(⊃⍵)-0,(××⍳∘|)-/⍵}

This dfn contains a 3-train or fork. Having seen contestants use the following format before, we feel compelled to provide you with a commented version of the above:

{
               -/⍵   ⍝ The length of the result is 1 more than the difference
           ⍳∘|)      ⍝ Integers up to the absolute difference
          ×          ⍝ times
        (×           ⍝ The sign of the difference
      0,             ⍝ Make the range inclusive
     -               ⍝ Use arithmetic to compute the correct result
 (⊃⍵)                ⍝ From the first value
                  }

Alternatively:

{
 (⊃⍵)                ⍝ From the first value
     -               ⍝ to
      0,             ⍝ inclusively
        (×           ⍝ The sign of...
          ×          ⍝ times
           ⍳∘|)      ⍝ Integers in the range of...
               -/⍵   ⍝ The difference
                  }    

This one excels in only computing necessary values once, and cleverly adjusts the generated values to rise or fall as needed, using the sign of the difference between the beginning and end points of the target range.

Try it now with TryAPL

6: Move to the Front

The task for problem 6 was to move all elements in the right argument vector equal to the left argument scalar to the start of that vector. For example:

      'a' (your_function) 'dyalog apl for all'
aaadylog pl for ll

Only one participant found this train, though two others submitted dfns using the same idea:

∩⍨,~⍨

Instead of computing indices or selecting elements, this simply employs two set functions, intersection and without ~. The asymmetry of intersection, namely that it preserves duplicates from its left argument, is here used to great advantage.

Try it now with TryAPL

7: See You in a Bit

Problem 7 involved writing a function to compare set bits in the base-2 representations of its integer arguments. For example:

      2 (your_function) 7   ⍝ is 2 in 7 (1+2+4)?
1

Eleven solutions used this method:

∧/(≤/2⊥⍣¯1,)

Indeed, the problem is about finding particular set bits in a binary number, hence the 2⊥⍣¯1. The overall function is a 2-train or atop, where the right-hand function is itself a 3-train or fork.

We can break it down as follows:

∧/             ⍝ Are all of (0 if any are *not*)
  (≤/          ⍝ Set left bits also set in right
     2⊥⍣¯1     ⍝ in The base-2 representation of
	      ,)   ⍝ The left and right arguments?

The function less than or equal to only returns 0 where a left bit is not found in the right argument:

      5((⊢,⍥⊂⍪⍤(≤/))2⊥⍣¯1,)9   ⍝ Just a fancy way of visualising the intermediate and final result
┌───┬─┐
│0 1│1│
│1 0│0│
│0 0│1│
│1 1│1│
└───┴─┘

This is pretty impressive, as it both demonstrates array orientation (in treating both arguments together) and uses Dyalog APL’s fancy inverse operator ⍣¯1 to use as many bits as necessary, while keeping the two representations aligned.

Try it now with TryAPL

8: Zigzag Numbers

The solution to problem 8 returns a 1 if its integer argument’s digits consecutively rise and fall throughout. For example, 12121 is a zigzag number, but 1221 is not.

We saw a handful of solutions of this type:

∧/0>2×/2-/10∘⊥⍣¯1

We can decompose it like so:

∧/                  ⍝ Are all
  0>                ⍝ Negative for...
    2×/             ⍝ Consecutively different signs of...
       2-/          ⍝ The pairwise difference of...
          10∘⊥⍣¯1   ⍝ The digits of the input?

It constitutes a good example of how the pattern in trains often is a natural one (this is actually an 8-train), and also shows off two uses of pairwise application 2f/ to compute the pairwise difference (the sign of which indicates the direction from digit to digit) and then the pairwise product (which due to the rules for multiplication of signed numbers indicates if a change has happened or not).

Try it now with TryAPL

9: Rise and Fall

Problem 9 involved writing a function to verify if a numeric vector has two properties:

  • The elements increase or stay the same until the “apex” (highest value) is reached
  • After the apex, any remaining values decrease or remain the same

For example:

      (your_solution)¨(1 2 2 3 1)(1 2 3 2 1)(1 3 2 3 1)
1 1 0

Actually, nobody had this exact solution, however, a handful came very close:

⊢≡⌈\⌊∘⌽⌈\∘⌽

Instead of trying to analyse the numbers, it does a running maximum from the left and from the right. If the minimum of those matches the original numbers, then we have exactly one peak.

⊢             ⍝ The input vector
 ≡            ⍝ matches
  ⌈\          ⍝ The max-scan from the left (msl)
    ⌊∘⌽       ⍝ The lower of msl and ⌽msr
       ⌈\∘⌽   ⍝ The max-scan from the right (msr)

We can visualise ⌊∘⌽ by stacking its arguments on top of one another:

      1 3 5,[0.5]⌽2 5 4
1 3 5
4 5 2
      ⌊⌿1 3 5,[0.5]⌽2 5 4
1 3 2
      1 3 5⌊∘⌽2 5 4
1 3 2

When used with the two max-scans, we can see how this solution works.

      (⌈\,[0.5]∘⌽⌈\∘⌽)1 3 2  
1 3 3  
3 3 2  
      (⌈\,[0.5]∘⌽⌈\∘⌽)1 0 2  
1 1 2  
2 2 2

Try it now with TryAPL

10: Stacking It Up

The task for problem 10 was to format a nested vector of simple arrays as if displayed using {⎕←⍵}¨, and then to return the formatted character matrix ({⎕←⍵}¨ simply returns its argument). For example:

      (your_function) (3 3⍴⍳9)(↑'Adam' 'Michael')(⍳10) '*'(5 5⍴⍳25)
1 2 3               
4 5 6               
7 8 9               
Adam                
Michael             
1 2 3 4 5 6 7 8 9 10
*                   
 1  2  3  4  5      
 6  7  8  9 10      
11 12 13 14 15      
16 17 18 19 20      
21 22 23 24 25

We had a couple of entries like this:

{¯1↓∊(⍕¨⍵),¨⎕UCS 13}

This was a tricky problem, especially as the automated testing didn’t include the 'a'1 test case, and many didn’t catch that one. Whilst most people wrote complicated code to get matrices for the element arrays, two participants thought outside the box, and simply joined the arrays with newlines after converting them to text.

Try it now with TryAPL

Conclusion

As always, not only are we deeply impressed by the ingenuity and cleverness of your submissions, but we also continue to be amazed by the number of people successfully solving most, if not all, of the problems in Phase I.

If you’d like to be notified when next year’s competition launches, go to dyalogaplcompetition.com and submit your email address.

Welcome Ron Murray

Ron flying in 2003

Ron Murray is a recent addition to the Dyalog team, with a long history in the APL community. He first encountered APL/360 in 1969 and was hooked. He used it as the basis for teaching Computer Science courses for the Hampton, Virginia High Schools. Then, working with other APL pioneers, he wrote several APL applications and contributed to five different APL implementations at The Computer Company, STSC, Burroughs, Data Resources, and Analogic Corporation.

From 1986 until 2019 he left the world of APL to develop software on Microcomputers for Microsoft and Amazon, where he contributed to various development projects for Windows, OS/2, NT, Visual Basic, Encarta, and a variety of projects within the Microsoft Research Division as well the Developer Relations Group. He also contributed to the scalability and reliability of the Amazon transaction accounting system and the Windows Azure Archival Storage System.

He also ran an Aviation business for several years at the Tacoma Narrows airport, and started an internet television company with three friends. Together they learned a lot about crawling the web using machine learning, categorizing videos by their subject matters and quality, as well as constructing interactive user interfaces on IOS devices.

During all that non-APL work he continued to use APL as a tool of thought for organizing, analyzing, and clarifying the work that needed to be done.

Since July of 2020 he’s been applying the many non-APL things he’s learned to help extend and improve the Dyalog APL systems and their interactions with the rest of the computing world.

He points out that Windows 95, which is now 25 years old is about half as old as the APL/360 release!

Welcome Kirstine (Stine) Kromberg

Stine graduated from Copenhagen Business School with a Masters degree in Business Administration and Information Management in 2016, and went to work for a small consultancy firm. She started with “Drag&Drop” programming in SSIS and other similar tools, but quickly moved into project management, accounting, and Business Intelligence.

Covid-19 intervened just as she was looking forward to coming back from maternity leave, and she decided not to burden her previous employer by returning to a job as a consultant in a world where no-one really wanted external consultants for an unknown length of time. Since Dyalog was looking for a new accountant due to Helene’s retirement, she accepted that job. She hopes that she will soon have an opportunity to help the development team with project management as well.

If her last name sound somewhat familiar, it is because Stine is closely related to Gitte and Morten! Stine grew up in a household where APL was a part of everyday life. After swimming against the tide for many years she finally accepted a bet with Morten to give his “hobby” (APL) a try if he gave her hobby (Roleplaying) a try in return. As a result, she spent 2 weeks in Montreal trying to learn from one of the best teachers of APL. But while she learned a little French from staying at Dan Baronet’s house, the APL did not really stick. Morten sadly never got around to roleplaying, but he did take up Zumba many years later, so they consider the deal settled!

Several years later, while looking for something to do as a summer job, she took a job at Insight Systems learning APL while proofreading the new Dyalog APL book by Bernard Legrand and correcting data in the CRM system.

For several years she was hired to help run the help desk at the user meetings whenever they took place in Denmark. Her last appearance at a Dyalog user meeting was as a Zumba instructor in 2012 in Elsinore.

Stine has spent most of her life dancing around the edges of Dyalog, coming to the user meetings and chatting with customers and developers alike, hanging out at the office in Bramley, listening in whenever Gitte and Morten talked shop at the dinner table, trying to learn APL, but realizing that where her heart truly lies is in organizing and managing things. So, while working for an APL company feels like coming home, her ambition is not to take part in development, but instead to take care of all the details and bureaucracy so that the rest of our brilliant team can focus on what they truly love!

Dyalog ’19: Thursday 12 September

Dyalog Pictures Ltd?

After a wonderful banquet dinner bonding with fellow teammates of last night’s Viking Challenge, we were invited to the Jorns Auditorium for the world premiere of our movies from earlier in the day. The screening and awards show was a roaring success with everybody being surprised and thrilled at the quality of what came out from the editing room. We would like to thank Filmteambuilding.dk for an incredibly enjoyable afternoon and evening.

How do I… in APL?

In another world premiere, Adám Brudzewsky introduced us to APLcart this morning. This is the new answer to the question “how do I… in APL?”. Luckily Adám’s presentation strategy of asking the audience for functionality to search for was a win-win – if APLcart had it then we were impressed, and if not Adám had a new item to add to APLcart. Try it now and see if APLcart has what you’re looking for. If you can’t, Adám invites you to email the functions you want to see to adam(AT)aplcart.info.

Richard Park then gave his third and final presentation of the week on the theme of using APL for education. He showed us how you can quickly and easily create Dyalog Jupyter notebooks and recommended using them for how-to, instructional documents and problem sets for students. You can view and download his presentation (which is a notebook) from GitHub, and interact with the live running notebook by clicking this button → .

Tomas Gustafsson tells the Irma story

We then had the final talk of the User Meeting. Tomas Gustafsson, creator of the Stormwind boating simulator, told us the fascinating story of the Finnish ship M/S Irma. It disappeared while travelling a common route in 1968 and became one of the greatest mysteries in Finnish maritime history. Eventually some wreckage was found near Åland and Tomas was able to use APL, reconstructing possible paths of the debris via simulation, to make an educated guess of where to search for the main wreckage.

Lastly Gitte expressed to us how enjoyable the week had been, and all in the audience seemed to agree. We thanked Helene, Karen, Jason, Fiona and all of the staff at Konventum for their hard work “behind the scenes” to make the User Meeting run smoothly.

For the last afternoon of the User Meeting three final workshops were held. Two focused on technical software development issues, with Morten and Josh answering users’ questions related to using text-based source with ]LINK and Git. Andy Shiers and John Daintree were generally helping users with application-related issues, but were especially helpful to some of the young new users of APL. Some of our delegates took on another challenge in the workshop on code golfing.

I think it is safe to say that we have all thoroughly enjoyed this week. You can look forward to seeing our commercials from the Viking Challenge as well as recordings of talks from this week at some point in the future on dyalog.tv.

Dyalog ’19: Wednesday 11 September

Floaty balls

In contrast with Monday night’s brain-bending puzzles, last night there was some lighter entertainment as Richard Park presented his molecular dynamics framework APLPhys. He showed us how elegantly APL could express mathematical equations and we joined in his fascination watching simulations of little balls flying around on his MiServer based graphical interface.

APL for every kid

Roberto and students from Liceo Scientifico GB Grassi Saronno

This morning we got to hear from Roberto and his students again. Pietro, Alessandro and Gabriele told us how after they were shown APL in school their interest was sparked to the point that they would write APL in other, slightly more dull lessons. They gave us more details on their competitive league scoring algorithm which was used in Monday evening’s contest. Lastly they expressed how APL’s ability to have you think differently led them to develop their puzzle competition platform called MathMaze. They had familiarity with Python but were new to APL, so they used Py’n’APL to make Dyalog communicate with a python-based Django server. In that way, MathMaze contestants could enter either a direct puzzle solution, or an APL statement which is evaluated on the server to solve the puzzle.

Afterwards Stephen Taylor led the Young APLers panel. To begin he introduced us to Josh David from the small town of Scranton, PA. We learned how he started working with APL at 15 years old after being introduced to it by his neighbour Paul Mansour of The Carlisle Group. Next was James Heslip from Optima, telling of his discovery of programming through Visual Basic. During and after university he wanted to pursue computing but keep the maths aspect of his work in the future. After meeting Paul Grosvenor he managed to convince Paul to take him on as an apprentice at Optima, and now APL allows him to write programs using mathematical notation. Yuliia Serhiienko from Ukraine came next to the stage, and said how she loved mathamatics in school but never imagined becoming a programmer. She had been an actuary in a previous life but, in the end, her transition from Excel macros to APL turned out wonderfully. Alve Björk, last year’s competition winner, claimed to spend more time reading about programming languages than actually programming. He said that in many languages he will think of a program but not write it. However, since APL is terse he actually sometimes tries it out when he thinks of a program. Alve also stated that he found it interesting that when you have a problem, in APL it’s not the first thing you do to go online looking for a ready made solution.

The young APLer’s panel. From left: Stephen Taylor, Alve Björk, Yuliia Serhiienko, James Heslip and Josh David

All of the panelists discussed the importance of having a teacher and being able to ask questions. It was suggested that some kind of mentor system for APL could be fostered. Once again the idea of “spreading the gospel” and getting APL in front of more people was brought up, and how it may be necessary to do this in order for the community to grow – as much as some of us would like it to remain niche.

The 2019 APL Problem Solving Competition

Professional prize winner Torsten Grust

Finally, the moment we’d all been waiting for: the prize ceremony for this year’s problem solving competition. Brian Becker talked about how we had made the leap to “eat our own dog food”, having built and hosted the competition website using MiServer (you can still see it at dyalogaplcompetition.com). Many technologies came together so that Dyalog could have the Phase I “one-liner” problems automatically validated in collaboration with TiO.Run. We saw some stastics about registrations and submissions, and heard about the extremely high quality of both Phase I and Phase II entries this year.

Then Gitte presented the top professional and student competition winners with their prizes. Torsten Grust expressed how much fun he had thinking about the problems and how clever he felt when he managed to come up with his solutions.

Grand Prize winner Jamin Wu


The Grand Prize winner Jamin Wu told us about how he discovered programming when he was looking into ways to solve problems using computers – something he still needs to do despite being a medical student – and how he had found the APL family of lanugages via the project Euler website. Jamin then took us through some of his solutions, including his incredible invertible tacit functions for tap encoding and decoding. He expressed how nice it had been to think about his implementation of the Romberg method of integration by solving the problem with a pen and paper first, and then implementing the refined solution at the end, since writing the APL was so cheap in terms of effort. We were enthralled by his brilliant explanations and incredibly impressed by his well considered problem solutions.

After lunch we were made extremely busy in the Viking Challenge. The delegates were split into teams and had to make short commercials emphasising a certain aspect of APL to a particular audience. We expect to see some oscar-winning performances at the screening after the banquet dinner – so now it’s time to get on my Sunday Best ready for the prize acceptance speech I expect to make.

Dyalog ’19: Tuesday 10 September

2⍴⊂’APL’

Last night Roberto Minervini and his students Pietro Pio Palumbo, Gabriele Meroni and Alessandro Laselli of Liceo Scientifico GB Grassi Saronno conducted A Puzzle League – sneakily introducing us to another APL. The delegates were divided into teams who competed to solve 18 maths and logic puzzles, which could be solved both using APL and with good old pen and paper. The scoring system rewarded teams who solved puzzles that other teams did not solve, but it was soon clear that the real challenge was solving the puzzle whatsoever in many cases. The furious cognitive battle lasted long into the night but eventually the team “AdamsAPL” (Adám did not choose the name) beat “MKTeam” (Morten may well have chosen the name) to prove that, although Morten Kromberg is the CTO, he should be glad to rely on the problem solving capabilities of Dyalog’s employees.

Roberto and Pietro introduce another ‘APL’

Application Station

Marshall shows us a bit of Dyalog ‘under the hood’

This morning the second day of talks commenced. While the first talk of the day had Marshall Lochbaum melting brains with the details of utilising CPU vector processing (among other techniques) for implementing fast reductions, the majority of the day’s talks focused on various tools for developing software applications with Dyalog.

Richard Park and Michael Baas gave an update on recent developments of the statistical package TamStat. The creator, Stephen Mansour, couldn’t be with us this week as he is using TamStat to teach his class at the University of Scranton, PA.

Erik Wallace gave us a view of the wide range of functions available in his cryptographic library Mystika. His talk mentioned promising work in combination with Aaron Hsu’s co-dfns compiler to give speed ups, as well as some of his own work on algorithms and implementation. Erik also expounded on some non-cryptographic use cases such as high precision squaring and inverses.

Stig Nielsen of SimCorp

Stig Nielsen told us how SimCorp is moving Dimension to the cloud – an undertaking which requires that the business logic within its 2.5 million lines of APL code be moved from the desktop application to the server and run on multiple instances of Dyalog within a .NET process.

Asset and Liability Management has been getting more popular as the legal landscape changes and SimCorp Italiana have been swift to account for those needs. Francesco Garue gave an impression of the complexity of ALM and how SimCorp Italiana have been trying to tame their “pretty messy scheme” by, for example, removing the dependency on system-specific databases or tables.

Another asset management system was presented by Claus Madsen of FinE Analytics. Claus has been using Dyalog since version 6 so he has seen the evolution of APL user needs over the last thirty years. He showed us how he has been using .NET classes to allow his APL solution to integrate with other languages used by those he is working with, using an object oriented model to handle settings for various types of financial data.

Gooey GUI

Brian Becker shows us the HTMLRenderer

The HTMLRenderer has been developed to enable easy creation of cross-browser user interfaces using web technologies. Brian Becker drew some analogies between his granddaughter and HTMLRenderer over their respective developments, from sometimes making a mess (SYSERROR) to becoming more able to communicate over time (WebSockets). He then introduced some recent changes and additions to the way the HTMLRenderer is used in Dyalog 17.1. However, he also explained that MiServer sites would need no change to their code in order to run as a desktop application using the HRServer (HTMLRenderer Server).

Josh David has recently transferred from Dyalog user to Dyalog employee. Neatly segueing from Brian’s talk, he gave us a demonstration of the tools he has created which use the HTMLRenderer to quickly and easily create graphical elements in the Dyalog session.

Josh David demonstrates his Easy GUI

And now for something completely different

Somehow COO Andy Shiers of Dyalog keeps improving the fireside chat, and this year has reached version 5! Jokes aside, his fireside chats are an opportunity to address a few points which might not fit into the scope of other individual talks. This year Andy informed us about why it is now really important that the interpreter knows its serial number, and gave us his usual smorgasbord of tips on subjects such as: the new Windows “backtick” keyboard enhancement, resizing the language bar, the memory manager I-Beam (2000⌶) and using ⎕NINFO on directories where there are inaccessible subdirectories. In return he asked the we send him examples of APL errors which would be made clearer with better DMX messages.

Nathan Rogers creates Excel spreadsheets using Dyalog all the way from Colorado

Excel and APL: A match made in Windows – now available cross-platform. As new recruit Nathan Rogers demonstrated, since modern Excel spreadsheets are zipped XML documents using the OOXML specification, Excel spreadsheets can be created directly from APL arrays on any platform. Unfortantely Nathan could not be here in person due to an important performance of Argentine tango with his wife conflicting with the User Meeting. However, he was still able to present via video-link – what a time to be alive!

Don’t forget that tomorrow we will be live streaming the prize ceremony for the 2019 APL Problem Solving Competition on dyalog.tv from 11:00 until 12:00 (09:00 to 10:00 UTC).