In case you ever wanted to write really short APL code

Thanks for mentioning this. I wonder if it should go in the top post. I have been working through the ‘Zark tutorial’ on the Dyalog website, I didn’t know about this course until I saw your post.

3 Likes

I just finished Phase 1! Some of my solutions were terrible. Others turned out quite nice. When the submission deadline has passed I will create a new thread to discuss the problems.

3 Likes

Well done! Are you going to enter Phase 2 of the competition? I am stuck at the moment and researching how to do loop in a loopless language. Can you recommend some beginner-friendly resources to me?

I hope Adám Brudzewsky doesn’t see this :joy: :sweat_smile:

On average, it took 2 months to break an old habit. I am on Day 18 (or 11 APL sessions). So, I have not yet adapted array-oriented thinking. :disappointed:

2 Likes

Well you’re way ahead of me because I’m still doing the “Zark tutorial” (not quite at the level of doing the competition yet) :sweat_smile:

When I learnt Python, I followed various books/tutorials. But, when I put it into practice, I hardly write a simple function. So, I am trying to practice APL as soon as possible.

BTW, I found a “FizzBuzz” written in APL. It is eye-opening :star_struck:
image

2 Likes

I guess that’s kinda what each is?..

Staying with dfns, your choices are using the Power operator or recursion; a dfn can call itself using so it doesn’t need to know its own name (or even have one).

That said, there’s an another function syntax (actually the original one of APL) which does feature a full set of control structures.

1 Like

I am not going to attempt Phase 2. I had fun working on Phase 1 but it took more time than expected. I learned a ton though! I don’t have any recommendations for learning resources as I am still exploring myself. I did see that @abrudz has an excellent YouTube series called APL Quest where he reviews problems from Phase 1 of past APL Problem Solving Competitions. There is an associated APL Quest Wiki which has more information.

I think a good learning strategy for myself would be to try out a problem each week and follow up by watching the video to see how others solved it.

1 Like

The tutorial is wonderful! @mike.moloch Thanks!

1 Like

Have a look at the cultivation dedicated to array programming techniques which looks at an alternative approach to FizzBuzz.

3 Likes

@abrudz When a function is simple, I can use to assign value to .
image

However, when a function involves multiple operations and logic, I got VALUE ERROR or SYNAX ERROR. What is the best practice to handle this type of situation?

image

When you assign to , you give it a default value in case no left argument is given; you make the function ambivalent: it can be called both monadically and dyadically. If this is what you intended in your first example, you can see what happens if you call your function X with a left argument.

      X←{⍺←⍵+2⋄(2×⍺)+⍳⍵}
      X 3
11 12 13
      10 X 3
21 22 23

In your function f below, it’s hard to say without also seeing how you called it – the your arrow is pointing to is a different than the one given to f (as your redacted bit is an inner anonymous function). If you can show the redacted bit, it’s easier to tell what’s happening. It’s possible that you intended the inner to be the ⍵+2 of the outer function, but that won’t work – give it another name if that’s what you intended. If I had to guess, you didn’t give the inner function a left argument:

      f←{⍺←⍵+2⋄⍺{5≤⍵+⍳⍺}¨⍳⍵}
      f 5
 0 0 0 1 1 1 1  0 0 1 1 1 1 1  0 1 1 1 1 1 1  1 1 1 1 1 1 1  1 1 1 1 1 1 1

but this is an error:

      f←{⍺←⍵+2⋄{5≤⍵+⍳⍺}¨⍳⍵}
      f 5
VALUE ERROR

In general though, don’t assign to unless you really need your function to be ambivalent.

3 Likes

Redaction is probably due to it being a competition solution.

When using a variable name (not , ⍺⍺ or ⍵⍵), the long function works perfectly. Thank you! :heart_eyes:

1 Like