 Hi. Hello. Hello. How is everyone doing? I'm good. How are you? Doing good. Got another blog post out. So that always feels good. All right. Nice job. What's news? I see very warm here in Minnesota. Woman Minnesota. I didn't know that happened. Yeah. Yeah, a little bit in the summer. I just moved away from Minnesota about a year ago. We're part of Minnesota. You in that Twin Cities area. I moved. Yeah, I lived there for. I guess 15 years. I just moved, moved to DC from there about a year ago. Gotcha. I was there for seven years and moved last year. I went to college in Duluth actually. Oh yeah. Yeah. Little colder up there. Was the weather in Australia? Not very good today. Best time in a while. It's. Yeah, really not very good. Is it raining? It's raining. It's raining. It's windy. Still, I guess that's fine. I saw that it looks like the course is coming along in terms of getting it ready. Yeah. Yeah. It's like, I'll do terrifying, you know, it's like. Good to have things finished, but then. It's like, oh, you know, what if people hate it? So. Hopefully people don't hate it. Were those pictures all Dolly too generated? Yeah. You should try it. Did you try with Dolly mini instead? No. Yeah. You know, that was developed by a lot of fast AI people, right? So that could be, could be interesting too. Yeah, it was, but it's also like. Much less trained. So it's. Not normally very good. I mean, it's good for what it is, but. Yeah, because I think one of the things, it depends on the, I guess the sort of what you're prompt and stuff, because some people say like it, you know, especially with like, I guess more pop culture and stuff. Yeah. I think Dolly mini is better because. Yeah. Dolly to the filter all that stuff out. So. Hmm. That's interesting. Yeah. Yeah. A lot of people. I didn't spend time on it. Honestly. It's just like, I'll be fun to. Throw in some. Examples. Yeah. Oh, just a moment. I've got a message. Player's teacher is sick. So I'm. Hopefully you will be okay. Any. Questions. Check. I posted a. Kind of a statistics blog post an APL on the forum a little bit ago. We were just talking about that a little bit. Very interesting. Going through that. Tell us about it. Yeah. So. So it's calculating some simple statistics, confidence intervals and P values through. Through bootstrapping. I've got a little monologue on why those who don't know what bootstrapping is. Do you want to mention what that is? Yeah. So there's kind of a couple of ways you can calculate most statistics. Kind of the classical. Statistical formulas that I think most people are more familiar with as. You know, you have a formula that can calculate a P value. And you have. Kind of assumptions baked in like you're going to assume the normal distribution and if these assumptions are true, you can calculate your value. Bootstrapping. Does a little bit of a different approach instead of kind of approximating. The statistic by kind of assuming normal distribution. It says, well, we're just going to randomly sample. Over and over and over again. So rather than creating a kind of an artificial sampling distribution based on what we believe the distribution to be. We'll just create it by randomly sampling a thousand times. And so, so there's less assumptions baked in, and then if you calculate a confidence interval, you can say a confidence interval on the mean. You can sample it a thousand times, get the mean of all these small samples. And if you want a 90% confidence interval, you can do that. Chop the lowest 5% off, chop the highest 5% off. And 90% of the time. Your data will fall in those, in those bounds. And you know, that's the case because. Because he did it a thousand times and he looked at where 90% of them fell. So it's kind of a. A more elementary, I think more flexible. Flexible approach that kind of gets the same answer. You know, when I used to do. Consulting 25, 30 years ago. This was my. One of my two big tricks. Was to use. This kind of sampling all the time for creating simulations. I basically almost never used assumed distributions. But yeah, we'd always basically get some real data and then randomly pick from a column. Yeah, it made life a lot easier and generally made things more accurate. Well, and I think it's the other trick. My other trick was using pivot tables all the time. Back when pivot tables have just come out. People's minds. Nice. They still blow people's minds, by the way, but 25 years ago. It's a little less. A little more surprising it blows people minds today, I guess, but. Yeah. And so, you know, I think the biggest value for me in this, in the bootstrapping is. You can kind of think in reason and it's very intuitive, right? Like, where will 90% of my data points fall? I don't know. Let me try it a thousand times and see where 90% of my data points did fall. If you want to do. You know, it's just a hypothesis test, you can. Sample it a bunch of times and see how many values, how many, how many values were more extreme than what you saw, and you can, you can actually sample it and look. And the nice thing about that is, you know, you can compare your means, but it's very easy to say, not just. Let me validate that the means are different, but eventually. You want to actually say, let me validate. Can I validate to see if the means are different by a certain amount? So you can start to do statistical tests on magnitude because. Just because two things are different doesn't mean it's, it means anything. Normally as an about it has to be different before it matters. And you can kind of. My daughter wants me, you can keep talking. So these, when you sample it, I feel it's, it's just. It's a way of doing it just based on kind of intuition and experimentation. That I find is, is just a lot easier to. To work with and customize and understand what's going on. And you don't have to be as careful about what assumptions you're making versus not making. So. So Isaac, have you used that a lot? I'm sorry. You might have said that I was. I might not have been, might not have heard it. Yeah, I pretty much exclusively use, use bootstrapping. I don't really see. I mean, I think the, the situations where I wouldn't would be. If I'm, you know, completely certain of what the, the assumptions of a given formula are. And completely certain my dataset fits those. And, and bootstrapping for whatever reason is, is not feasible. Like if I, if I really needed to calculate the statistic on some enormous, ginormous dataset, then, then maybe these formulas are really just kind of shortcuts. They're not, they're not different. They're not giving different values. They're just a way to do it. You know, more computationally efficient. And so when I'm kind of just testing and developing things, I'd rather have something that I can think about. And, and, and there's a little bit more intuitive. But I mean, I don't really need to. I mean, this, these, these drawing a random sample is, is usually not, you know, computationally prohibitive. So I can usually just, just do it on my laptop and it's, it's not a big deal. So I almost never use the traditional formulas. I don't say never, but bootstrapping is on my default. If you can say what are the applications. That you like just a handful or like one or two of what you've used it on. Yeah, I mean, I mean, really, I mean, what, what's the data from pretty much anything you would do any normal statistical tests or confidence interval on. So, you know, you, you've got some data and you run. Maybe you're doing an AB test, you have a control group and you're testing, sending fewer emails to another group. And you want to know. Did it have an impact on revenue or their level of engagement or whatever we do. I used it a lot for simulations. So it'd be like, you know, in consulting it'd be like, okay, what's the possible outcomes of this company under different scenarios and you would need to make a bunch of assumptions about what might happen. And generally it's not the idea to do a point assumption because you don't know. So then, you know, the normal thing might be to say, oh, well, let's assume it's a, you know, standard deviation around our assumption of whatever. Right. I'd kind of often like to find him some historical data of like past results or something like that. And then basically just do a random look up into that list of values. There's a really great introductory statistics book. That is a bootstrap first approach. I'll put that in the chat if anyone is interested. Yeah, that'd be great. Thank you. It's not APL, but it's a, I think it teaches things in a really intuitive and useful way and covers things like just something as statistically significant doesn't mean it's practically significant, which I think is something that's sometimes missed in statistics, right? Feels like remembering the author names won't be too hard. Yeah. Yeah, it's a, it's a freak family of, I think like four of them have PhDs in statistics. But it's, yeah, it's interesting. Gotcha. Thank you. I haven't seen this before. At cart. Oh my God, $112. What is it about books? No. Wait, the e-books $112 or the print books $48. That's interesting. Oh, that's a rent for the book. Well, the rental. Oh, God, I hate textbooks. And what's this? Yeah. Online access for $10. You need the $30 Dover edition. What? $30? I'm sorry. What did you say? Well, you know, Dover, Dover publications, they, they, they'll have these kind of pseudo textbooks. So I have a buddy that I went to college with. He's a physics professor over here in the States. And he was trying to find a Dover publication on physics that he could use for one of his classes because the books only cost like $30. You know, it's a, it's a, it's not hardbound, but it's a, it's an actual physical text or physical book. But unfortunately a lot of them, you know, for, at least he was saying for the stuff he was looking at, they left out too much detail. Because, you know, they're, they're usually at least the ones I've seen are, you know, in that kind of standard 200 to 220 page. So that's, that's what I was referencing. I see. But Dover publications has a lot of technical books. Maybe I'll find their, you know, their, their website and put it on the thing. And some of the books are really good. It's just that some of the detail isn't in there. The Kindle version is $47. That's weird. It's just student solutions or, or. Oh, was it? Solutions manual. Oh my gosh. Okay. Right. I'd cover $362. I don't know. Yeah, it was more than I wanted, but my work paid for it. So I didn't. Feel bad for it. It's not as wasting somebody else's money. I'm more okay with it. But. Maybe you can find a used copy. Yeah. I hope Molly's able to join because it sounded like she was going to try and actually do some prep for today's chat. She was asking what we're going to cover. And. So right away about, did you list. These things was that. Previous session or something. No, it's in the how to buy a really short. Okay. Okay, so tell us about this. APL problem solving competition. Actually, I hear from your interview in a way cast. And Adam mentioned it at the end. So I just jump in and have a look. And under the face one. The left hand side. Oh, left hand side. Yeah. So they actually give you some various. Easy to start with sample and then have a platform for you to. Do it. And I find it quite easy to use some of the, I have experience in the past in Python. Some of them I just don't know how to do the submission, but they are very good explanation. And I think I've been hooked is because of the two questions. They actually using the. And then solving the license problem. They actually how to turn the different or the DNA and the mutation. So, and the second solution actually really, really short. And I really impressed by the. By what they can do. Of course. So you can actually submit your function and. Yeah. Test it here. Yeah. And then they have some edge case. So that's why I start thinking into the documentation. I don't know. The slightly different. I need to do that little diamond thing in it. But yeah. And they cover quite a wide range of the other problem as well. So you can pick through. Yeah, that is a bit more a multi lie question. So maybe in the future, we can, you can cover it here. Yeah, I think. I feel like it was telling me that a lot of the phase one. Questions are pretty approachable. So just for me, it's just more exercise. I, when I learned Python, I remember I tried to find different. Problem and just try to understand the discretion how to do it. So yeah, just kind of fun. And they give us some hints on what solution or simple we should use. And then just start looking at it as well. As APO documentation sometime can be quite hard to understand. So yeah, you can cover it a little bit great. And the mutation actually they point you to the hamming distance. Actually very interesting when I learned how to write APL and then I also learning other knowledge as well. So yeah, just fun very interesting. Yeah, I mean this one seems trivially easy, right? Yeah. It's just. But I think that for me it's very inspiring is the application. This one's just this isn't it. Yeah, it's over here. You're not supposed to do it. Well, I mean presumably phase one is not. I think there is some prize money associated with phase one. Oh, you know what it is so it's plus slash applied to each side. So you've got to do equals on the two sides. It's interesting actually to think about how to do this really neatly right because you've got to have. I mean you can obviously do it with a D fun. But to do it directly. Oh, I guess it's like, yeah, plus slash applied to that. This one. So that would be that would give you that. Okay, so that would give you. It's a slightly different case to any of the. Binds I remember seeing you want the, the. This to be the dyadic one and then you want to post process it with plus slash. Is there a way to do that. Yep. So that's why you need to think about it. And yeah, they also in the example stage they. Tell you there's different method in, in APL can do it and just see how they actually quite expressive to, to, to operate actually really, really amazing. And I saw in the last year competition they actually compare different solution and they actually can brand the performance to compare different, not just the length of the solution but also the processing time. You want X equals wine and post process with plus equals. So you want. This is your post processing. And this is your dyadic pre processing. It's your way to. Like run some examples and see what happens. What do you have this. Because your answer is not correct. That's right. Yeah, I was hoping to see what it does give. Actually, the example is all your test case. I see. Yeah. Let's try it. So you just need to do your function. Okay. F equals. Plus slash. What's this button. J. Applied to equals. That's not bad. It's this. Okay. That's interesting. It hasn't. It hasn't ended up. Are you, are you trying to put. It calls it should say F. So 10. And is it saying that was wrong. Result should have been seven with that. And that. Oh, wait, the number of differences. That's why. So it's some. It's the. It's the opposite of that. And I believe not. His children. I think I saw that on. Yeah. It is. So. That's the post processing. There you go. And would you need the parentheses? I'm not sure without the parentheses. It's still works. That's interesting. Now, why does it still work? So that's the operator. That's the right hand side. That's the, oh, I see. That's the left hand side. And then that's what is applied to the whole thing. So I think that's correct. Test. Wow. Yeah. But my solution is only five. So one, one letter smaller shorter than you. One, two, three, four, five. Mine's five. Okay. Yeah. Yeah. And, and they, for the, for them, they have the past. They have a silver trophy for you or. Go code trophy for you. Silver just passed part of the test case and the goal. Actually you passed all the case. And so this is called. Yeah. I see. I think it said you have to log in for you to. Save your correct answer if you. Oh, good point. All right. You can submit now and then you can put the trophy. All right. I just found very fun and VC and I can learn and practice. That's great. All right. So, so your list of things for the things that they were saying would be needed. Okay. So we've done this one. So let's do these ones. And this competition's called. 2022 APL. Okay. So let's create a. Section. So should we just go in order? This is called key. I feel like I heard people talk about key a few times. Yeah. What is this lift called? You can see it. This one is it on primitive operators. Yeah. Quad equal. Okay. Quad. Equal. And it's spelt. Yeah. Okay. So I'm on an operator. I really wish this book, Mark, gave the whole hover over that the. It'd be easy enough to fork it and add that, I guess. That's true. Yeah. Maybe somebody can give that a go. That's a shame. They're not using a nice font in here. Oh, we should add our, um, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Uh, Okay. Okay. Means key. It's okay. So the left hand side's optional. So we need to look out for that. the major cells. Okay, but maybe the best way to look at this is to look at that competition because it had an example. I think it's okay if we look at how to do some of the phase one stuff together. If that sounds reasonable. Yeah, I can say it's okay we just walk through. Oh, don't press that button. So right argument that's a character vector representing DNA and we want to count each symbol. So all right, so maybe we should start with like banana and count the symbol banana. Okay, plus a function to each unique key in X and the major cells of Y having that key. I see and here they've got a function which is just inserting colon between things each unique key and the major cells of Y having that key. So if we did like, let me know if anybody's got a thought about what we could try this for. This is shift K. A comma rank error. Okay, plus a function key similar to group by maybe we should try their example. So this banana example might be an even simpler one that one potentially put it in the chat. I guess it's basically the same thing but okay. Easier to see what the mapping is doing. So what is it doing Isaac? So the B if banana goes with the three. Why is the A appearing with 119? Oh, it's selecting from like where the A's are it's selecting these. Oh, and then where the ends are it's selecting those. Yeah. Oh, I see these are the positions of it's kind of slightly backwards to what I expect. There's three A's. Oh, and they're in maybe it would be easier actually if we did by six out of six. There's the positions of them, which means can we just say comma comma two or six. Yeah, that just concatenates things and it's a bit like group by another example that shows actually applying a function other than kind of a custom function in there as well that I think is another functionality might want to show. Okay. Though the I in mine is not an iota. So it should be. I see. Oh, I see. So we're saying like this is column one and this is column two and you find all the unique things that are in column one and then you find their corresponding things in column two and do something to them. And what if it's monadic? I think it will pass the iota six on both sides of it and treat it as I think the iota six will be alpha and omega. There you go. If it's monadic, it just does the results. Good. I thought you meant only something on the right side of the quad equals like no A no left side. So like I wonder how you can do this without the D funds. So in that cell 22 where you have the A with plus some, I mean, you can also remove the A from the left or not the alpha that holds. You can move that and it'll pass that that iota six is both alpha and omega to that function. Okay. So that's not going to be very interesting presumably. What's that doing? So that is I guess B is the first slot A is second and fourth but where is okay. So I guess that just gave you the index locations for each character. The key operator applies the function to each unique key. Oh, here we are. It's the same as this but we haven't done this yet have we? Maybe we should do that because it actually comes up quite a lot. So let's just step back for a moment and put it underneath this. Presumably the dietic form of this is not match. It is. So that's easy but we want the monadic version. So this is a level quote and I wouldn't have guessed that. Okay. Dietic is not match. So I can just move this, copy that from match I guess. Oh, we don't have anything for match. Oh, we haven't done equal underbar yet either. All right. Okay. So this one should be pretty easy. So that's interesting. Now, why are these different? Oh, I guess I'm confused. They look the same. And so not because they do match. Yeah, of course. Sorry. So yeah, so not match is false. Fine. I wish they had the simplest possible examples first. One doesn't match one. It's false. One doesn't match zero is true. Okay. Now, the point though is that it doesn't kind of like normally equals or not equals is element wise. So this would broadcast over this and the answer would be zero zero because one, it's not true that it doesn't match one. But this version with the extra line in it checks whether the ranks are the same. So it's operating on the whole thing, which presumably it might be one somewhere to get that using the rank operator and not equals. I don't know if that's true or not. So not equals is eight. So yeah. So my point is that normally, well, let's just use equals, right? Just an example. So one is equal to one and one is equal to one. Oh, we could do it like this. And then I'm wondering, is there some way rank operator was this one over rank? Okay, should show. Is there some way to say, okay, we want to take the left hand side as a scalar and the right hand side as a vector? Okay, I guess I don't know how to do that then. Okay. Anyway, so I guess I think this is clear enough. And so we could copy that up to match, which is problem. Okay, monadic. So interestingly, I think the, I think the rank operator you have to put in parentheses, because otherwise it interprets that right scalar as part of the vector on the right, at least doing that at least gets it not to error. It didn't give me a useful answer, but it got closer. Well, I didn't get an error. I got one, one, which is this. Yeah, this is. Oh, okay, zero one. I was trying to get a single result to say this is not equal to this. This whole thing is not equal to this whole thing. Oh, using just the single equals. Okay, I misunderstood. Yeah, I was trying to get that to be the same as the match command. I wonder if they say whether it's some equivalent doesn't mention it. Okay, so tally is how you get counts. I've come across this before. And the mnemonic I heard on ArrayCast, who I remembering that this is how you get counts, is imagine rotating it by 90 degrees. It looks like tallying stuff on a whiteboard or a chalkboard or whatever. So that should be that's three got three things. What about tallying up a matrix? Okay, it's a number of major cells. There are two rows in a matrix. Yeah, so imagine rotating that by 90 degrees. It looks like you're tallying something. There you go. Yeah, number of major cells. Great. That's interesting. It points out that row V is a white line on one vector. Where else tally V is the same thing, but it's a scalar. Minor difference might be worth pointing that out like so. Okay. And then depth is the how much nesting there is, I guess. So this is an array of arrays. So it's depth is two. This is an array. So it's depth is one. This is a scalar. So it's depth is zero. And in the case where it's not always two, then it makes it negative. Okay. So if all the items are scalars, it's a simple array as a depth of one, a scalar depth of zero. And if they're not all scalars, it's nested uniform depth if all its items are the same depth. Okay. And it's not doing uniform depth. It's negative. Okay. I don't know what quad ML is. Okay. So I guess that's hopefully gets us back to where we were, which I don't remember what that is. Oh, we were doing quad equal. And I guess that mentioned here. Okay. So that is the number of elements in Y. Okay. So iota of that. Yeah. Okay. That's exactly what we just saw. So this is, this is iota of the number of elements of A. Yes. iota six is iota of the number of elements of A. So that's the same as iota of tally of A. And that's why these two are the same. Cool. Did we want to have a go at trying to do this thing? Anybody have any ideas? So to jump back, I just looked at what that quad ML does. Okay. Kind of cool. Kind of don't think I'll ever use it. Okay. I guess different versions of APL define partitions differently, particularly when you're doing like partitioned enclosures and stuff like that. And apparently you can change which definition you're using. Sorry, what do you mean by partition? Set that variable. What does partition mean in this case? Like the the back tick Z or back tick capital Z. It's the little C. I think it's the called Oh, okay. We haven't learned that yet. Yeah. Left you under bar. So it All right. I guess I'll come back to that. Then we look at that. Okay. So if we did this quadty thingy, what's it called? Quad equal. She's key. That tells us the locations of each of these things. And what did it ask us? The counts. Oh, okay. So would that just be Pally? No. Okay. Uh, that worked. So do we need to have a function and apply tally only to the omega argument? Or yeah, was it doing something? Was it like doing it diatically or something like? So key. Oh, it's a dyadic function. Right. Right. Right. It's a dyadic function. So we want a way to say we want to use it Minotically, which obviously we can do in a rather ugly way by doing it like this. We need the tally to apply to the omega, but not the alpha, right? Uh, that's still wrong. Are you trying to do tally? Isn't that tally? Isn't the tally the one with the... Oh, yes. Yeah. Yeah. Just the other one. Thanks. Right. And then, thank you, Tanishk. Okay. Is there a better way to say we want the monadic version? Did you come across a shorter answer to this, Serada, or did you have something like this? We can't hear your muted. I think I have a longer version. Ah, okay. Let's see if it works. Well, this is an interesting, yeah, thing maybe to see if anybody can figure out is how to do this without the D funds because it seems like it should be unnecessary. Okay. This 2012, 17, 21, 20. Oh, oh, it's got to be in a particular order. Right, right, right. Which I think is easily fixed by telling it what order we wanted in. Is that true? So we want it for A, G, C, T. A, C, G, T. A, C, G, T. A, C, G, T. Is that... That's not quite how it works, is it? It's going to go through each of the unique things on the left. The right-hand side is... Yeah, the problem has been entered in that order, right? That's why I actually quite long my answer. So actually, it really made you think about how to approach the problem. I think I achieved the purpose of how to use the location as a tool to support. And I've got a bad solution. If we do both arguments, we can use that rank up and rank down the, I don't know, the Christmas tree-looking ones to sort it and then just select the last column of that. We haven't actually used those yet, but yeah, okay. There should be an easier way, I would think. All right. Well, we can get it in the wrong order. Fine. And so the particular order that's going to be in is going to be A, G, C, T. And the order we want is... Wait, what do we want? Is A, C, G, T? Oh, A, G, C, T. Slightly wrong. Yes, we could sort that list before we send it in. So if we did... Oh, because that's just sorted. Yeah, so we could just sort that. That's true. And the way we sort things, it's like a grade thing, right? Yeah, it's to the left of Iota. It looks like a Christmas tree, yeah, there. Oh, I see. This is how you sort things, is it? Yeah, now it returns the index locations that you should... You have to index N. It doesn't actually sort the list. It returns the... And so then you need to use the squash quad to get back to the correct values. So it's not... Is there something like... Aha! This is... There's only vaguely rings a bell. But when we did Iota, dyadic, yeah, tells you index of. So this is the location of each of these things. I don't know if that helps. So I mean, I guess what would we do with this? We could somehow get a sum by each unique number and then use the quad equals to pair that up with ACGT. Maybe. Kind of making stuff up. I don't know if that'll work, but... That's the order we want. All right. Well, I might leave it for now. I think it's an interesting question, again, to think about. I mean, that's why we're trying to do all the glyphs, is that until you know all the glyphs, we don't have the raw stuff we want. Why can't we just sort the... Yeah, go on, Tanishk. Why can't we just sort the array and then do it on the sorted array? We can. We just haven't learnt the glyphs to sort with yet. Oh, okay. Okay. They suggest using outer product. Well, maybe that's worth thinking about too. So outer product. So we would have AGCT down the left. And so if we did like outer product of... Oh, I can see how they're going to do that. So outer product is jot dot. So if I do jot dot comma, right? There's that. Okay. So if instead I use equals, there's that. Right? There's that. Yeah. Awesome. Okay. Now, again, it'd be nice to do this tacitly, but I don't know how. So this is going to be ACGT. And then we're going to have the thing that they're passing in. Let me say it'd be nice to do it tacitly. Do you know of any reason why the tacit stuff is better? It's... Okay. So that's the whole... That's like asking, is wildcard import in Python better? That's like a can of worms. Yeah. I asked that on the APL Discord and I realized... Oh, there you go. Okay. Not a helpful question for me to ask. I was hoping I could get a better answer here. Hello, Americans. What do you guys think of gun control? Yeah. That was about the reaction I got. Yeah. Okay. So there was an early array cast with Henry Rich, who's the guy who mainly implements or almost entirely implements Jay nowadays. And he said he basically never... Not never, but he very rarely uses tacit programming, the tacit meaning without the curly braces and amegas and whatnot. So, you know, that's one point of view. Aaron Hsu, who is the creator of Codefunds, the GPL compiler written in Slash4, APL uses a lot of tacit programming. So Henry Rich's view was like, oh, it's too hard and it gets just too complicated. So I don't want to do that. Or else Aaron's view was like, well, you know, I want my APL to look like APL and I can kind of create nice, small, neat idioms and I can combine them together. The kind of overall sense I get from listening to array cast is a lot of people tend to feel like stringing together four or five functions and operators is perfectly reasonable and normal. And if you go too much past that, it starts to get confusing. So I don't know. I mean, Aaron's like, seems like a particularly smart guy who's particularly good at APL and writes a lot of it. And so it might be just one of these comfort things that at some point at which tacit functions. Yeah, easy. One of the benefits of tacit functions is that they're invertible. So you can use the negative power operator to get the inverse. Roger Hui, who implemented a lot of dialogue, apparently he preferred defunds and a lot of the faster idiomatic versions in APL are only faster if you use defunds. For me, it's more like reference, I guess, mostly. The reason I wanted to do it was just to test my understanding of APL. Gotcha. I think it's a useful exercise to try, particularly because I'm really bad at understanding how these things are kind of parsed and strung together. I'm just looking at this now where post-processing something and then this is applied diatically. Yeah, I don't know. Submit. Oh, consider cases like A as a right argument. Oh, yeah. That's a problem. So if you think about the art of product, well, you can see it. You're writing that work. Oh, I can't plus slash that, of course. You don't have each of the rows represented there. So yeah, edge cases don't work. Anyway, I feel like we've had a good go at it. Interesting to hear what you folks find. It would also probably be an issue with the other approach of using the key, right? If we were to sort the array and then use key on it, it would probably have a same issue. Well, you kind of want the left-hand side to be ACGT or something. I guess you could look at ACGT, check if it's a member of your and in your string. And if it is not, then it'll give, or I guess, I don't know. Okay, so there's slash, right? Or was it backslash something? Where was that thing that was like, or was it iota? Oh, where? iota under bar is where? iota under bar. If you had, just A. Yeah, no, it still doesn't work. So you want to go through each of ACGT. Is it possible to use it just with equals? So A equals, well, C equals A. And I want to do that. Is this rank? Yeah. I want to do that for each thing, no, for the whole thing on the right left and for each thing on the right. Can you do something like that? Oh, that looks interesting, doesn't it? Can we use epsilon for membership? Kind of A, epsilon, C. I don't remember if we've covered epsilon or not. Well, Iris is thinking, can we just sum this up now? Oh. Now, why did that not work? I thought it would. We've got to be a bit careful when we sum it up. But I think- Give us the wrong- It's very close to correct, right? But I think if we do this, it's correct. So I think what we need to make sure is just that the rank- Okay, so consider these. Here's the problem. This is a vector. It's not a matrix with one row. So that's interesting. Oh, because that's not a list of characters. Right? That's a character scalar. But that's okay, because I would guess that they would actually make it a list containing the single letter A. I guess, ideally, we'd be able to use, I guess, I don't think row works this way, but we're able to use row to reshape to four columns. And in terms of rows, kind of do like the numpy negative one for power. I actually think we've already solved it. I actually think, you know, I need to write this to say a list containing the letter A. Oh, would that be the left- The problem is that this is a scalar. Got you. So I think actually my test was wrong. So actually, I think we've got the answer. Little bit. So I think it's that. And then I think it should be a case of making that into a function. Okay. So we've actually ended up not using any of their suggestions, which makes me think that there's a better way to do this. But that's okay. Test. So it looks like the last example. I would say it is this. I think they are treating, they are passing in a. Yeah. And the last example, we can see that. Can you put, can we do like an enclosed left shoe? Is that how you do it? Can we just also just, you could just make it a list, but could you just do like comma and then again empty string? Oh, just direct comma before it. Look at you. All right. Nice. Yeah. Yeah. Yeah. Look at you. So yeah, comma 10, comma is in list, isn't it? Or rebel? Is that rebel? Rebel, I think. Yeah. Nice one, Tanish. I need to get better at using comma. I think I end up like using the enclosure too much and then having to like do a bunch of reshapes and then so that's good for me to keep in mind. All right. Perfect. That was fun. That was actually fun. The only other thing I'm thinking is like maybe we'll split this. I think this notebook's getting too long, particularly because the kernels so slow for dialogue. So I might split it into three being like operators. The first staff and then operators and then we'll do an APL competition one. So anyway, look out for that when I send it in. I won't necessarily do that in a hurry though because I have a course to release. All right. Thanks all. Bye. Have a good one. Bye.