« first day (1280 days earlier)      last day (1380 days later) » 

5:29 AM
@ngn curious, how did you indent your file? because vim-apl doesn't indent tradfns properly, and i use tabs, i had to :%s/ /^I/g first
 
ngn
5:56 AM
@user41805 no, i didn't indent. :namespace etc is just noise for me
it's a bit like <html><body>..</body></html>. people usually don't indent that.
everything else is, of course, only dfns and trains
 
@ngn ah, i see
 
@user41805 Note that ngn isn't actually interested in winning; he's just having fun. We're happy to provide him this entertainment :-)
 
ngn
right, i'm not a student
 
There's a professional prize too…
 
ngn
@Adám a trip to the "user meeting" :)
@Adám btw, phase I:2 doesn't let me use ⎕io←0 :|
 
RGS
6:17 AM
@ngn which is going to be in Portugal (next year). Portugal is a nice country to visit :p
@ngn btw did you golf your answers or did you just write terse code ?
I am interested in looking at your code after the competition is over
 
ngn
@RGS i'm sure
@RGS what's the difference?
 
RGS
@RGS same thing with you @Bubbler
@ngn I would say golfed code is as short as possible and disregards performance completely while terse code doesn't
 
ngn
@RGS i'll publish mine if the winner publishes theirs. what happened last year was ugly.
@RGS probably something inbetween
 
RGS
@ngn what happened last year??
 
ngn
@RGS i couldn't win because they invented "negative points for lack of comments". i asked the winner to publish. he saw the message but then quietly disappeared.
 
RGS
6:35 AM
@ngn oh wow, I wonder why the winner would disappear like that :/
 
ngn
@RGS likely busy with other stuff. but i think it's important that the winner's solutions be public, so everyone can verify them independently, and to know they haven't been changed since the submission
 
I wonder how many professionals participated in the competition...
 
RGS
@Bubbler I was wondering the same; and for students too. I'd guess this year the numbers were higher because there's more ppl at home because of the pandemic; is this something you can verify and share with us @Adám?
 
7:03 AM
Meanwhile, I checked my 2 month old Phase 2 file, and found that some of the solutions are not commented. I won't fix it since the mobile problem is commented :P
 
7:18 AM
@RGS Brian will publicise statistics.
 
RGS
@Adám +← 1
 
@ngn No, we didn't give negative points for lack of comments, you just missed out on a bunch of potential points for comments.
 
ngn
"we don't charge for using cash. we just give a discount for paying with a credit card."
 
Each of a handful judges give each solution scores for a handful of aspects, as stated on page 2 of the phase II pdf:
> • Did you solve the problem? Working solutions rate higher than non-working ones.
• The difficulty of the problem. If two entrants solve two different problems equally well, the entrant who solves the more difficult problem will likely receive higher consideration.
• Does your solution demonstrate an understanding of the problem, including the implications imposed by edge cases? Is it well commented, but without writing a novel? Does the code flow smoothly?
• The appropriate application of array-oriented thinking. One of APL's strengths is its ability to process entire arrays at once r
 
ngn
@Adám yeah, this year's pdf
but it's fine. your competition - your rules.
 
7:38 AM
@ngn Good point. But already last year the competition site said:
> Phase II will be judged mainly based on:
• Completeness: did you solve the problem? Did you comment your code? (Phase I solutions should not be commented.)
• Use of array-oriented thinking: did you write array-oriented APL or something that looks like C# written in APL?
 
ngn
@Adám ok. how do we know that the winning solution did solve the problems and was well commented?
and wasn't modified after submission
(of course, i understand this is for advertisement, and fairness is not a priority)
also: what are the relative weights of the different winning criteria?
 
@ngn I guess you have to rely on the competition organisers. Everything could of course be staged, like wrestling "competitions". I'm not sure why we don't publicise winning code (slightly censored for PII) so others can learn. I'll ask about that.
@ngn 1
 
ngn
@Adám here's an idea: on the day of the deadline publish cryptographic hashes of all submissions. when/if the winner's code gets published, we'll all know that it hasn't been changed.
or better: publish the hash at the moment you receive the submission
 
> PII
 
ngn
@Adám personally identifiable information?
 
7:53 AM
Yes, which is included in the submission file.
 
ngn
@Adám what does the hash of my code reveal about my identity? :)
it doesn't even reveal anything about the code itself (unless you already know the code)
 
The file has fields for personal details, which many people use to supply information about where they live, study, do, etc.
 
ngn
well, don't include it in the hash
 
Of course, we could maybe record that separately. Do you know of any other competitions that have verification like you propose?
 
ngn
@Adám competitions - no. but hashes are often used to guarantee that something hasn't been changed, for instance for files you download from mirrors of popular software.
first you should be convinced you want to publish (at least) the winner's solutions though
 
8:05 AM
That does sound like a good idea to me. Or maybe a collection of the best solution for each problem.
> By entering the competition, you consent to the use by Dyalog Ltd of all images, text and materials that you submit, for any purpose, in any media, for an unlimited period, without remuneration. We have the right to publish, display, reproduce, adapt, promote or otherwise use entries in any way we deem fit.
 
@Adám Possibly even better: the best solution and a few notable, different solutions.
(Or simply one or more best solutions)
 
Yes.
 
ngn
slightly off-topic: fhe is one of my favourite topics in cryptography. it's amazing. you can compute on encrypted data without knowing the data itself, and reveal only the result. this means it's theoretically possible to have a competition in which nobody even shows their code to the judges! :) of course there are some practical difficulties with the implementation..
 
8:42 AM
@ngn I've also thought it fascinating for a while now. Haven't played with it yet, though; haven't had a use-case
 
9:15 AM
@ngn We're pretty deep on this at IBM Research right now -- order-preserving crypto is useful for secure indexing in databases.
Apparently it's pretty slow right now.
 
ngn
@xpqz afaik, fhe and closely related 2pc (2-party computation) are slow but the theory behind them is constantly improving. mpc (multi-party) can run at practical speeds, but requires >2 independent, mutually distrustful organizations running the software.
 
 
2 hours later…
RGS
11:49 AM
@Adám what is the APLCult's topic for today?
 
@Marshall i assume _m←({𝔽𝔾}(1+⊢)) ⋄ -_m ÷_m 24 should be allowed (and give ¯1.04)?
 
@RGS Continuing with new language features of 18.0
 
@dzaima It should, and the parens around _m's definition aren't required. My compiler doesn't support partial application yet.
 
RGS
@Adám but which ones? or is that TBD?
 
Probably atop and over together.
 
11:55 AM
@Marshall (the parens were there due to me using it inline first; stumbled upon this with ט{𝔽𝔾}+ failing on mine due to ˜ blocking the regular application while partial could complete just fine)
 
12:06 PM
(also, it would make some sense for "value" blocks to interpret their result as a function, then this would be as pretty as it is (modified subset of some tests i'm writing))
 
12:24 PM
what should b←1 ⋄ {F←{b+𝕩} ⋄ •←F 𝕩 ⋄ b←10 ⋄ •←F𝕩}0 do?
 
@dzaima Value error from the first call to F. The second one would give 10 if the first was removed.
All declarations in a block are visible in the blocks it contains regardless of their position. The way I handle this in the compiler is to sort identifier references by the position of the opening brace of the containing block.
BQN2NGN does a breadth-first traversal by placing the interior blocks in a queue.
 
@Marshall right, that's more the way i'd think about it. So tracking variable origin is mandatory for a "valid" impl
 
CMQ: Good name for ⍸⍣¯1
 
@Adám Count indices? But that fails to hint at the fact that the input has to be sorted. ≠¨⊔ is "count each group" and doesn't have the sortedness requirement.
 
12:39 PM
Maybe "whence"?
 
i was thinking about "integer count" or maybe just count, with the same problems as above
 
Nic
@Adám I like "whence"
 
ngn
@Adám "at"?
 
@ngn That's not bad. As if placing the items back at the locations from where (or whence) they came.
Maybe "at whence".
 
ngn
is the opposite of @
 
12:51 PM
i like "at". "increment at" would be more descriptive, but not sure if it's better as it "hides" the use-case for generating boolean vectors
 
Well, kind of 1@
Fiona is suggesting "whither" which is good too, in the meaning "to which specified position".
 
ngn
⍸⍣¯1⊢a ←→ 1@a⊢0⍴⍨1+⊃⌽a more or less
 
@ngn Sure for a≡∪a, but 18.0 allows a≢∪a
 
ngn
then ⌈/ instead of ⊃⌽
 
Doesn't help because @ ignores duplicates :-(
 
ngn
12:55 PM
oh.. right
@Adám can never produce such a-s though, can it?
 
@ngn Yes, now in 18.0 it can. I'm preparing my webinar about that.
 
Hello everyone, long time no see
 
Welcome back!
 
Hope you're all doing good despite the current world situation
 
RGS
Olá @J.Sallé :)
 
1:03 PM
Oh right, the two of you can speak your native tongues to each other and understand everything, right?
 
@RGS Olá!
 
RGS
@Adám written, 110%; spoken depends on how well we understand each other's accents and vocabulary
 
@Adám I suppose so. @RGS are you brazillian as well?
 
RGS
@J.Sallé Portuguese
 
Oh, nice. So yeah, written is no problem, speaking might have a few bumps along the way
Although I'm from Rio and have been told before by European PT speakers that my accent is not the worst :p
 
RGS
1:08 PM
@J.Sallé Probably not and tbh I think I have spent time with enough different Brazilian ppl for it not to be a problem for me. And I also don't speak weird Portuguese so you'd be able to keep up no problem. I was just talking about conversations between generic Brazilian and generic Pt people
 
Like two APLers that can write APL code to each others, but may not be able to "speak" APL code out loud.
 
@RGS Indeed, that's cool
 
RGS
@Adám yup; except I'd expect all APLers to be able to read each others code :)
 
And? Can't all Portuguese-speakers write to each other?
 
RGS
@Adám A far more interesting phenomenon occurs between european portuguese and european spanish; Pt understands Es but not the other way around
 
1:10 PM
I guess Portuñol is not so common there, heheheh
 
RGS
@Adám ugh of course, for a moment there I was restricting the set of ppl into consideration to APLers
@J.Sallé :D
 
ngn
1:29 PM
@Adám the new looks consistent with , it has the same discontinuity at rank 1 :)
 
@ngn Yup.
@ngn Ooh, that comment just made me find a bug. Thank you!
 
ngn
@Adám what! a bug? in dyalog?!
 
Preposterous!
 
ngn
1:45 PM
is ⍸'' supposed to work?
 
@ngn I think so. Just like ⍳''.
That said, seems to not care about the prototype at all. doesn't like nested prototypes.
 
ngn
@Adám but ⍸a replicates ,⍳⍴a, not ,⍳a, so the analogy with should go only as far as the shape of a
anyway, doesn't matter much
 
@ngn there's the separate analogy of how both interpret an empty char vector as an integer vector. Either way, ''/⍬ works anyways
 
ngn
@dzaima right
 
I thought was /⍥,∘⍳∘⍴⍨ except for negative integers.
 
ngn
1:55 PM
@Adám exactly. you have ⍳∘⍴ there, not just .
 
      Ⓘ←/⍥,∘⍳∘⍴⍨
      ⎕SE.Dyalog.Utils.repObj Ⓘ ''
⍬
      ⎕SE.Dyalog.Utils.repObj ⍸ 0⍴⊂'ab'
DOMAIN ERROR
      ⎕SE.Dyalog.Utils.repObj⍸0⍴⊂'ab'
                             ∧
 
ngn
i was thinking the old-fashioned way: {(,⍵)/,⍳⍴⍵}
 
That's exactly the same.
 
ngn
i understand
 
@ngn f⍣¯1 requires that Y≡f(f⍣¯1)Y but:
      Y≡⍸(⍸⍣¯1)Y←,¨1 3 4
0
 
ngn
2:01 PM
@Adám can't have it both ways
 
Right.
 
@Adám i don't think it's worth making too much sense of ⍣¯1. what needs to happen, happens. ¯\_(ツ)_/¯
 
@dzaima No, that's the J way. Dyalog is strict.
 
@Adám is Y≡f(f⍣¯1)Y supposed to hold for any and all f and Y?
(be true or error, of course)
 
@dzaima Yes. f⍣¯1 asks "Which argument can I give to f so the result becomes Y?"
 
2:12 PM
@Adám so is this a bug?
 
Hmm, ⍸⍣¯1 is neither a right inverse nor a left inverse of ...
 
RGS
I think ⍣¯1 has been used to compute "close inverses", so that f⍣¯1 undoes as much as possible what f does, but it ends up not being a proper mathematical inverse of f
 
@Bubbler ⍸⍣¯1 alone is still a right inverse if i remember which is which
 
2:27 PM
@dzaima That might be because the ⍣¯1 cancel each other out, so there isn't actually any result-checking.
 
@Adám i'm pretty sure that's exactly the explanation, but it shows that you can't have both Y≡f(f⍣¯1)Y and f≡f⍣¯1⍣¯1 and not have Y≡(f⍣¯1)f Y
 
Oh well.
Welcome to APL Cultivation!
We've are going through the new stuff in 18.0.
Last time, we covered the unique mask function and the constant operator.
This time, I'd like to go over the new compositional operators, Atop and Over.
First Atop, which has been assigned function⍤function thus sharing the symbol with the rank operator's function⍤array
You should be familiar with the 2-train, which is also called "atop": (f g)Y and X(f g)Y.
Maybe you've even been burned by f∘g Y being an atop, but X f∘g Y not being an atop.
Well, the atop operator is what you would expect, i.e. f⍤g Y is exactly like f∘g Y but X f⍤g Y is f X g Y or X (f g) Y.
I strongly recommend transitioning to use in places where you've hitherto used monadic f∘g.
 
RGS
@Adám why?
 
Because it will prevent (at least one potential cause of) frustration if you ever decide to add a left argument to your code.
 
RGS
I was taught to look at (⍺) f∘g ⍵ as (⍺) f with the right argument preprocessed by g.
 
2:40 PM
Right, but it is easy to forget that if you use f monadically.
 
RGS
@Adám Yes, I am just trying to understand how/why you can be so sure that the most useful dyadic extension to that interpretation is with ⍤ and not ∘
 
Let's say you define a function that returns the magnitude of reciprocal.
      |∘÷ ¯4
0.25
      |∘÷ ¯5
0.2
(I realise that this could be written without the but I've opted for a very simple function for illustration purposes.)
 
RGS
@Adám (ofc)
 
@RGS i recently have started to strongly prefer to not reference the only argument in monadic application as "the right argument"
 
RGS
@dzaima what do you call it, then? only "argument"?
 
2:42 PM
@RGS yep
 
Now you get a feature request that the function should take a left argument which is a numerator (instead of the default 1).
      2 |∘÷ ¯4
1.75
      2 |∘÷ ¯5
1.8
 
RGS
@Adám :)
 
Oops. However:
      |⍤÷ ¯4
0.25
      |⍤÷ ¯5
0.2
      2 |⍤÷ ¯4
0.5
      2 |⍤÷ ¯5
0.4
@RGS Well, you can't of course. So by all means, continue to use if indeed you mean preprocess the (right) argument. But if, conceptually, you are simply applying one function after another, then use
 
RGS
Of course you engineered an example that was good for you and the example made sense; thanks. I think ⍤ is particularly helpful when dyadic g is similar to monadic g, like - and ÷. My take on this is that when dyadic g is not that related to monadic g, using ∘ might be as suitable as ⍤ a priori, but then dyadic g ≠ monadic g means I probably won't be in any situations similar to the one you just described.
So I can just roll with f⍤g for the monadic cases; when extensions make sense ⍤ is already there, when they make no sense it makes no difference
 
Sometimes you might want to add a left argument to the left function. In that case, is the right choice.
 
RGS
2:47 PM
@Adám Yup, just corrected "roll with f⍤g for the monadic cases"; in the dyadic case f∘g still preprocesses the right arg. Very nice! I am happy to move on now :)
 
An equivalent definition of our above function would be ÷∘| and there you don't want as the added left argument is for ÷
 
RGS
@Adám true, but now we are not returning a magnitude anymore, as ¯1 ÷∘| 1 returns ¯1
 
OK, I assumed a non-negative left argument.
One way to look at f∘g vs f⍤g is that when given a left argument, gives it to the left-hand function and gives it to the right-hand function.
Other than that, they are equivalent.
 
RGS
@Adám +← 1
 
Another way to look at f∘g vs f⍤g is simply choosing order of the first two tokens in the equivalent explicit expression: X f∘g Y computes X f g Y and X f⍤g Y computes f X g Y
So we're simply swapping X and f.
Then there's the classic problem with slashes, especially in tacit programming.
If you've ever tried using replicate/compress in a train, you'll have bumped into the fact that slashes prefer being operators over being functions.
This means that {(5<⍵)/⍵} doesn't convert to (5<⊢)/⊢
 
RGS
2:55 PM
@Adám particularly annoying, yes
 
While it may not be obvious at first sight, if we define f←5<⊢ it might become clearer that f/⊢ isn't at all what we want.
Now, there's an axiom in APL that an operator cannot be an operand. (Shh, don't mention ∘.f)
This means that if a slash ends up in a situation where it has to be an operand, it will resort to being a function.
You may even have noticed that constructs like ⊢(/⍨)5<⊢ work fine, though ⊢/⍨5<⊢ doesn't.
This is because the / in isolation with the is forced to become the operand of . But since operators bind from the left, ⊢/ binds first, and so ⊢/⍨5<⊢ becomes (⊢/)⍨5<⊢ or (5<⊢)⊢/(5<⊢) which is usually not what you want. (Ping me if you find an example where you actually do want that!)
So, to the rescue.
If (or any dyadic operator) is found to the immediate left of a slash, then clearly the dyadic operator cannot be the operand of the slash, being a dyadic operator itself, and it can't be part of the function on the left, since it requires a right-operand too.
Therefore, the slash is forced to become a function.
So -⍤/ is the negation of the replicate:
 
RGS
@Adám so how would we use it? ⊢⍤/ ?
 
       1 0 2-⍤/10 20 30
¯10 ¯30 ¯30
 
Nice
 
@RGS Yes, if you don't actually want any function applied to the result of the replication, you'd use the identity function like that.
 
RGS
3:04 PM
awesome
 
It is easy to think then that "oh, this is an atop, so I should be able to do this with parentheses too; (f g)" but that'd be a mistake:
(-/) is just a normal minus-reduction.
 
RGS
@ngn (without most of the comments I get a 7.04kB file; ×5 sounds good enough for me :P )
@Adám I didn't understand
 
Well, since f⍤g is "atop" and (f g) is "atop", you might think they are interchangable.
 
RGS
@Adám ah ok, I get what you mean
 
Another mistake is to think: "if a slash is an operand, it'll be a function" and then think that /∘⊢ would work like ⊢⍤/ by pre-processing the right argument with a no-op rather than post-processing the result with a no-op.
 
RGS
3:09 PM
@Adám you mean that /∘⊢ inside a train will still bind a function to / if / is not the leftmost function?
 
Yes, it'd also work if you give it a name or parenthesise it, but it won't work inline in a train, because f /∘⊢ g will be bound as (f/)∘⊢ g
Btw, it isn't just inside trains you hit this
Let's say we have a two-element vector of a mask and some data, and you want to "apply" the mask to the data…
Challenge: Write a function Apply which takes an argument consisting of two vectors; a mask and some data, and computes mask/data
 
RGS
Apply ← //
 
      //(1 0 1)'abc'
┌──┐
│ac│
└──┘
 
@RGS That gives an enclosed result ^
 
Does work up to this point, but will break if you try to chain anything on the left
 
RGS
3:15 PM
Ah so the point is that you don't want the enclosure?
 
yes.
 
RGS
Apply ← ⊃⍤(//)
 
So the solution will be ⊃(//) or ⊃⊢⍤//
 
Yup, any one of those three will do.
In fact, once ⊢⍤/ becomes a common pattern, you can actually help the reader of your code by using ⊢⍤/ so they don't have to consider if your slash is Replicate or Reduce.
For example, if your code says z←x/y it might not be obvious what's going on.
 
RGS
@Adám being that mine is a single function and Bubbler's are atops, they have different usages inside trains, no?
 
3:18 PM
But if you write z←x⊢⍤/y your reader knows exactly what you're doing.
@RGS Sure. But if you name it, it makes no difference. (Also, yours is an atop too!)
 
RGS
@Adám Mine is an atop too but a single function; without naming it ⊃⍤(//) will behave differently in a train when compared to the other two. Or did I get it wrong?
I'm just trying to get everything right
 
Bubblers 2-trains would need parenthesising if used inside a train, yes.
 
@RGS Of course if I needed to embed it further in a train, I'd have written like yours
 
RGS
@Bubbler ok ok so it is somewhat different; thanks
 
OK, anything else about Atop before we move on to Over?
 
RGS
3:23 PM
@Adám hm, another challenge? :P
 
Let's see if I can think something up…
OK, given a string, replace every character with two copies of itself prefixed and suffixed by a space.
E.g. 'abc' becomes ' aa bb cc '
Yes, you can do this with regex. Please don't.
 
RGS
@Adám oh dang
 
Otherwise, I'll just change the data type :-)
10 20 30 should become 0 10 10 0 0 20 20 0 0 30 30 0
 
{' ',⍵,⍵,' '}¨
 
@xpqz That needs flattening, and fails on other data types.
      YourFunction 3 4⍴⎕A

ABCD
ABCD


EFGH
EFGH


IJKL
IJKL

⍝ ↑ all-space line
 
RGS
3:31 PM
{⍵\⍨¯1,¯1,⍨2ׯ1*⍳¯1+2×≢⍵}
 
(∊¯1 2 ¯1⍨⍤¯1)⊢⍤⍀⊢
 
RGS
So that is not very different from mine, in idea. You "just" wrote a train and made it shorter; correct?
 
Also featuring Constant :)
 
Right, and Bubbler got the hint that you want to use to force to become a function.
 
RGS
@Adám I couldn't come up with a solution using ⍤ ⍥
 
3:33 PM
@Bubbler Try getting rid of the parenthesis.
@RGS Try ^ or make your own tacit.
 
Done: ⊢⊢⍤⍀⍨¯1 2 ¯1⍴⍨3×≢
 
RGS
f⍤¯1 applies on what cells?
 
@RGS Major cells.
 
RGS
@Bubbler +← 1
 
i.e. the cells with one rank lower than the whole array
 
3:35 PM
@Bubbler That's basically my solution.
 
@Bubbler I bow to your superior skills
 
You can do it too, if you write 100 code golf solutions in APL.
 
@Bubbler A more direct translation: ⊢⊢⍤⍀⍨∘∊¯1 2 ¯1⍨⍤¯1
@Bubbler Oh well, I out-golfed you by two bytes: ⊢⊢⍤⍀⍨0 2 0⍴⍨3×≢
 
Damn zeros.
 
Yeah, they are quirky.
OK, let's see if we can cover Over as well.
So, remember how f∘g preprocesses the right argument of f using g?
One way to look at Over is simply as preprocessing all arguments of f using g.
All as in both or the only.
So again f⍥g Y is the same as f⍤g Y and f∘g Y.
The difference is again when we do a dyadic application.
So while X f∘g Y is X f(g Y) we have X f⍥g Y be (g X)f(g Y).
This may seem like an overly involved operator, but really, the pattern of preprocessing both arguments comes up a lot. Once you start looking for it, you'll see it all over ;-)
 
RGS
3:43 PM
@Adám ah, I see what you did there.
 
I was just staring at (g X)f(g Y) and thinking 'everywhere'
 
Challenge: Dyadic function computing the sum of absolute values of its arguments.
 
+⍥|
(Compare that to the old-fashioned +/∘|, or even ⊃(+/∘|{⍺⍵}))
 
Yup. And: Given arguments which are vectors, which one has the smallest maximum? Return ¯1 if the left argument has the smallest maximum, 1 if the right one has, or 0 if they are equal.
 
RGS
×⍤-⍥(⌈/)
 
3:51 PM
@RGS Oops, someone forgot the first part of this lesson!
 
RGS
woops
 
But now it is good. Beautiful use of both Atop and Over.
You can of course omit the here, unless used inline.
OK, how about this: Write an alternative to replicate which can take arguments of equal shape, both with rank greater than 1, and replicates the corresponding elements. Since the result might otherwise be ragged, you have to return a vector.
      (2 3⍴⍳6) YourFunction 2 3⍴⎕A
ABBCCCDDDDEEEEEFFFFFF
 
Shouldn't it be "equal shape" to make sense?
 
@Bubbler Yes, thanks.
 
RGS
@Adám ⊢⍤/⍥∊
 
3:57 PM
I'd use , instead of
 
RGS
@Bubbler why?
 
Because we don't want to open up the elements of the right argument.
 
Right arg could be nested
 
Also, in this case, you don't need ⊢⍤ but it is good for clarity, and necessary if used inline in a train.
 
RGS
@Bubbler Ah, hence shape
 
3:59 PM
One of my favourites lately is ,⍥⊂ which I prefer over {⍺ ⍵}
There are lots of these. Sometimes the operand can be huge too.
Anyway, enough for today. Thank you so much for participating!
 
@Bubbler Ah, right. I forgot about that.
 
Thanks @Adám - lots of brain gymnastics
 
Good.
 
RGS
@Adám thanks for your time ⍥/
 
4:04 PM
A golfing tip regarding : you can sometimes use it to preprocess the left argument, when it is a no-op on the right.
e.g. Transpose the left arg when the right is a vector or scalar
 
@Bubbler Ah yes, good point:
Jul 24 at 9:46, by Adám
That's a nice one. I had 1≡⍥,≡,⍴
Here, ⍥, only ravels the left argument, since the right argument already is a vector.
 
That's a nice example too.
My transpose example comes from a J golf of mine
 
Oh, it's good to see APL Cultivations happening again
 
RGS
4:25 PM
@Bubbler your showcase series could be called "An APL a day keeps the doctor away"
 
Boom! One pun a day....
 
Ada
5:03 PM
> • Brevity is not a primary consideration. This is not a code-golfing contest.
I feel called out
 
i've got 11b so far
 
@user41805 I have 11B too.
@user41805 I've got 7B, 9B if you're strict.
 
5:19 PM
hmm
 
Ooh, I have two completely different 11Bs
 
I have 11 as a dfn. I think.
 
i'm at 8 giving a 1-item vector, and a proper 9
 
@dzaima Right, my 7B is 1-item vector too.
 
5:44 PM
@wuyudi Hello there. Interested in APL?
 
@Adám I got 7B too. Strict should be 8 because you could just tack a at the front.
 
@Bubbler Oh, I had to add ⊃⍤ for strict.
 
ngn has entered the chat
 
My 7B (and therefore 8B) has no operators at all, btw.
It only works because the domain is strictly positive integers
 
@Bubbler Oh. Mine works on any data. 2 operators.
 
5:49 PM
i have an 8b that gives a scalar (no leading )
 
Time to open the solutions?
 
@ngn ?
 
(Too bad we still don't have a TIO-like with 18.0 support)
 
@Bubbler spoilerise it if you are
 
ngn
this problem looks familiar
 
5:53 PM
 
@Bubbler TryAPL 3.0 coming "soon".
 
@ngn i have a faint remembrance of a similar cmc posed by Adám to you, don't remember if it was in tnb or here
 
My 7B (hover to reveal)
 
ngn
∊~⍨.⊣⌸
i'm pretty sure i've solved this before, but i can't find it in the history
 
@Adám +←1
 
6:07 PM
@ngn Yeah, I wish I could search for APL symbols in the transcript.
 
a bunch of my solutions (last two being after seeing others)
 
@Bubbler oh monadic has been implemented in 18.0
@ngn nice
 
ngn
@ngn maybe this (not the same, just similar)
 
@dzaima shorter
 
 
2 hours later…
8:34 PM
BQN scoping rules now specified. All the "formal" parts of the spec now exist, although there are some small features I need to add. Other than that I just need some descriptions of primitives to go with the reference implementations.
Also need to do the fuzzier things: type information, inverses, and structural modification.
 
8:46 PM
@RomanCzyborra Welcome to the APL Orchard!
 
 
2 hours later…
10:16 PM
yay part one; (doesn't execute as the names (and so variable count) aren't yet fed to the interpreter)
 

« first day (1280 days earlier)      last day (1380 days later) »