Hi Adam, I hope that it does not count as cheating. As a beginner, I find the Dyalog documentation is a bit hard to understand. I just want Jeremy to go through them as usual. Hopefully, other fastai folks with more programming experience may join the competition as well.
Not cheating at all. The Dyalog documentation is very much a reference for those that already know the language. You might find APL Wiki’s articles more pedagogical. E.g. see Windowed Reduce - APL Wiki
Hey @Moody
I also have been having lots of fun attempting the 2022 APL Problem Solving Competition questions. Working on the Phase 1 problem set has been very enlightening. I have learned so much while struggling with these problems.
After the competition is over I would like to compare our solutions
Same here. My current solutions are very hacky. Hopefully, I can improve them further when I learn more glyphs.
I also work on Dyalog Course and try to solve simpler problems. The answers are under the collapsed headings. So, it is very beginner friendly.
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.
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.
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
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.
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)
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
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.
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.
Have a look at the cultivation dedicated to array programming techniques which looks at an alternative approach to FizzBuzz.
@abrudz When a function is simple, I can use ⍵
to assign value to ⍺
.
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?
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.
Redaction is probably due to it being a competition solution.
When using a variable name (not ⍺
, ⍺⍺
or ⍵⍵
), the long function works perfectly. Thank you!