Resources

Advent of Code for R users | Emil Hvitfeldt | Data Science Lab

The Data Science Lab is a live weekly call. Register at pos.it/dslab! Discord invites go out each week on lives calls. We'd love to have you! The Lab is an open, messy space for learning and asking questions. Think of it like pair coding with a friend or two. Learn something new, and share what you know to help others grow. On this call, Libby Heeren is joined by Posit engineer Emil Hvitfeldt as he walks through Day 1 of Advent of Code 2026 using R. This is a super friendly, collaborative, and cheery intro to AoC! Don't forget, you can do Advent of Code at any ole time of year Hosting crew from Posit: Libby Heeren, Isabella Velasquez, Daniel Chen, Emil Hvitfeldt Emil's socials and urls: website: https://emilhvitfeldt.com/ GitHub: https://github.com/emilhvitfeldt Bluesky: https://bsky.app/profile/emilhvitfeldt.bsky.social LinkedIn: https://www.linkedin.com/in/emilhvitfeldt/ Resources from the hosts and chat: Advent of Code: https://adventofcode.com/ Install Positron: https://positron.posit.co/ Eric Wastl, Advent of Code: Behind the Scenes: https://www.youtube.com/watch?v=_oNOTknRTSU AoC Subreddit: https://www.reddit.com/r/adventofcode/ Kieran Healy shared a reddit post with an Advent of Code answer done in Minecraft: https://www.reddit.com/r/adventofcode/comments/1pbeyxx/2025_day_01_part_2_advent_of_code_in_minecraft/ Emil’s Solutions: https://github.com/EmilHvitfeldt/rstats-adventofcode Emil’s helper package: https://github.com/EmilHvitfeldt/aocfuns purrr::accumulate() function: https://purrr.tidyverse.org/reference/accumulate.html And, for anyone hangin' in there at the end, Emil updated us on Discord that he figured out why his cumsum() didn't work: he forgot to start the dial at 50! Once you fix that, it works to solve part 1 :) ► Subscribe to Our Channel Here: https://bit.ly/2TzgcOu Follow Us Here: Website: https://www.posit.co The Lab: https://pos.it/dslab Hangout: https://pos.it/dsh LinkedIn: https://www.linkedin.com/company/posit-software Bluesky: https://bsky.app/profile/posit.co Thanks for learning with us! Timestamps 00:00 Introduction 01:01 Tour of the Advent of Code website 02:30 Dashboard overview and puzzle schedule 03:23 How to view and access previous years' events 03:37 Structure of puzzles: Two parts and stars 04:40 Understanding the global leaderboard 05:08 "Does that ASCII art build itself? 06:16 Setting up private leaderboards for friend 07:54 Starting Day 1: Story prompt and mechanics 09:30 Understanding unique puzzle inputs 10:51 Submission feedback and delay penalties 11:44 Safe dial logic: Left, Right, and circularity 12:50 Starting position and Part 1 success criteria 14:09 Setting up the project in Positron 16:26 Strategy for speed: Reading from the bottom up 18:49 Problem-solving strategies: Pen, paper, and visualization 19:22 Walking through the logic with a sample case 20:52 Coding Part 1: Data parsing and vectorization 23:17 Positron keyboard shortcuts for duplicating lines 24:40 Debugging the logic and handling negative numbers 26:03 Explaining the Modulo operator (%%) 28:15 Managing large inputs of over 4,000 instructions 29:21 Submitting Part 1 and transitioning to Part 2 32:03 Part 2 challenge: Counting zero "clicks" 34:02 Brainstorming Part 2 code modifications 36:19 Checking important warnings for edge cases 37:00 Coding Part 2: Nested loops and incrementing counters 38:23 Hint: Modulo vs. integer division 40:40 Success with the Part 2 test case 42:30 Alternative method: Vectorized cumulative sums 45:29 "What's the difference between % and %%?" (percent vs modulo) 46:50 Mathematical optimization to avoid inner loops

Jan 12, 2026
54 min

image: thumbnail.jpg

Transcript#

This transcript was generated automatically and may contain errors.

And I'm just ready to introduce our guest today, which is Emil Hvitfeldt. He is a software engineer here at Posit, and he's going to be talking to us about Advent of Code, and I'm super, super excited about it. Emil, would you like to introduce yourself?

Yes, thank you for introducing me. So I'm a software engineer on the Tidy Models team, mostly thinking about how to make modeling as easy and pleasant as possible. But I also like to do fun things on the side. I do a lot of puzzles and such, which is where Advent of Code has a little bit of an intersection between coding and puzzles. So I'm excited to be here.

I love puzzles, too. I'm a big mystery person, but also a physical puzzle person.

Okay, we are going to be talking about Advent of Code today. We are going to hop into screen sharing very soon. I'm going to share my screen really quickly first and just show you what Advent of Code even looks like. I'm going to share. Okay, hopefully you can see my screen right now. And you can see I have just gone to adventofcode.com. The only other thing I have up here is our Slido. And it is a blank base of a Christmas tree with numbers next to it.

And it's got a login button, because I am not logged in. I've literally never done Advent of Code in my entire life. It kind of looks like a console screen. And if I click login, it will give me some different options. So I can log in with GitHub. I will do that in just a second. But you can go through any of these. I think Google is probably the easiest one.

If you have never used Advent of Code before, there are some places you can go. I'm going to let Emil walk through that. But I just wanted you to see what it looks like before you're logged in. Maybe we can all log in together. So I'm going to stop sharing and hand this over to Emil.

Tour of Advent of Code

All right. Yes. All right, Emil. Give us the tour really quickly first of like what we can see before we dive in. Yes. So this is what Advent of Code will look like once you're logged in. And we have a line per day. So this year, they're only creating 12 puzzles, when normally it was 25. It's a lot in December. So this is the 11th year. So he decided to only do 12 for this year, which is going to be perfectly fine. And each one opens up on midnight in New York. So you can see here, the third day will open up in a little bit less than 12 hours.

But there's a lot more information in here. We can also, if we click on the events, we can see previous years. So here, if we go to like 2016, this is what I've done so far. So each day has two parts to it. So you can open up a day, and it will describe a question with a prompt and everything. And once you have answered that correctly, part two opens up.

Some of these are like real fun. Yeah. So like here, we can see on 22, I was only able to do part one. And then if we say, yeah, so, oh, I finished part one, now part two. And then like more information comes in, but I wasn't able to do part two of that specific day.

Okay. So each of these stars is a part. So on day 22, you only did part one, but on day 21, you did both parts. Yeah. And I skipped 17 for some reason.

And that's another thing, you can do them out of order as well. So it's only about, they're all timelocked for like when they is, because the leaderboard is only based on time. And the official leaderboard is really hard because it's like everyone in the world. And the first person to do it, that's 100 points. The second person, that's 99, and so on and so forth. So you only get a point if you're in the top 100 people.

Okay. We had a question I saw in the Discord, which I think is interesting, because I have the same one, which is like, does that ASCII art build itself as the code puzzles get completed? Like whether you complete the day or not?

So good question. So here's like 15, which I fully did. So you can see like, it's all nice and nice. But if we didn't do 23, it's only building up somehow as far as you went.

But this one's also a weird one, because this is not a chronological year. So like, they're jumping up and down a little bit. So the art is changing over time.

And so it's a lot of fun things happen, but we'll be doing day one. So I made the assumption that this might be the bottom of a Christmas tree, because I've seen Christmas trees before, but this looks like it's probably something else. Yeah. And so we don't know yet, right? So we're only two days in, and we haven't filled in any of the days.

And also, one thing that you can do too, is if you click on leaderboard... Lauren actually made a good point that the leaderboard is disabled this year, because he decided it was a little too competitive.

Yeah. And we had some where people are very fast, especially day one, because it starts off being easier than harder and harder, where some people answer the first question in that one minute. And there are techniques to do it harder. And I'll explain a little bit what people do to improve the speed, but also a lot of people stream them doing Advent of Code on Twitch. And it's very fascinating because people are really fast.

But there's also a... You can also do personal leaderboards or private leaderboards. So everybody has an ID, so you can share it with your colleagues or your friends, and then you are all on a leaderboard with other people.

All right. I just shared Tan's leaderboard in the Discord chat for everybody. This is the one. And now it's based on the same idea of how to add the numbers, but you're not competing with the world. You're competing with a hundred of your friends, which makes it a lot more doable.

Day one: reading the puzzle

All right. So let's get started. So day one is a little bit more verbose, because it's explaining what happens. But generally, it's a wall of text, and it will explain what it is. So here, the elves have bad news because they disturbed the project management, which is giving them some tools to deal with Christmas emergencies. And there's a story going on that doesn't do anything other than being fun, right? So we need to help them decorate the North Pole by December 12th.

And we collect stars, and it's two puzzles per day. Each puzzle is a star. And so you get 24 in total. So this is mainly just explaining what it is. This is only on day one. And then it starts. And it starts with the story. So here we have that we're arriving at the secret entrance at the North Pole base. We're ready to start decorating. Unfortunately, the password seems to have changed. And you take it in, and we have a document explaining what happened.

Due to new security protocols, the password is locked in the safe below. Please see the attached document for the new combination. So we have a safe with a dial, and we can turn it left and right. And it has the numbers 0 through 99 on it. And it makes a little clip every time it reaches a number. And the attached document, which is our puzzle input, which let's just see right now. So if you're locked in, everybody gets their own puzzle input. So I can get mine, and it looks something like this. It's a long list of some text.

That's our puzzle input, and it's a sequence of rotations, and one line by line, and how to open the safe. Okay, wait. Pause. Does everybody get the same input? People get different inputs, but I do believe there's duplicates. Okay. So probably not an infinite number of combinations, but ours will probably not look like Emil's, which is great, because then we don't have the solution completely spoiled for us, right?

Because at the end of it, I will run some code based on this input, and it will give me an integer, and I have to put that in my answer and submit it. Okay. I know this won't be zero, so if I put zero and submit, it will be like, hey, that's not right. So it will tell you... I feel like sometimes there's a little bit of a hint if you're wrong in a very specific way. Okay. Oh, did you remember to turn it left, too, or something like that? But in general, it will just say it's not right, and it has some delay on it. So if you spam it, you start having to wait a minute, two minutes, five minutes to be able to resubmit.

So you can't just trial and error it. You have to actually do it. You can't just warmer or colder it. Kieran says that it'll sometimes tell you like, oh, your answer is a little too high, right? Yeah. So sometimes it's helpful, but sometimes it's not. So here we just have this. So our possible input is something like this.

So it has a L on R for left and right, and then a number next to it. And it is describing whether to turn it left or whether to turn it right. And here, left means lower numbers and right means higher numbers. And how much to rotate it by is the value itself. And then he always includes examples and instructions. So here it says, if we started at 11 and it was a R8, it would mean we turn it right eight times until we hit 19.

And if this is L19, we would go back to zero. So it has some examples we can play with. And here we also have that it's circular. So if we're at zero and we go down one, we go back up to 99. And if we're at 99 and go up, we go back down to zero. We have to remember that. And then a very important thing is we start at 50.

Setting up the code

So we can conceptually imagine that we probably have to turn the knob according to the instructions, right? So we probably start at 50 and then we need to write some code that simulates turning this knob left and right a number of times.

So here it has how we actually find out what our answer needs to be, because we can follow the instructions. But the actual password is the number of times the dial is left pointing at zero after we rotate the sequence.

So then he has an example, which I will copy in as my input. Okay. So you just copied this? I copied this little example, because then we can verify that it gives the answers that it should. And hopefully, this would be enough. All right. And then are you working in Positron? Yes, I'm working in Positron. Okay. So did you paste it into just a text file?

Yeah. So what I do is I just added just a folder that has two files in it. It has input and day. So it's just a normal text file, nothing fancy. But then when I'm in here, I can do read lines. Yeah, that's a capital L in R. And it's in a complete fine line. So now I have my input in a neat way. And then once we have solved this test case, I'll go back in here and copy-paste the real input over.

And one thing to note that might be useful later is I'm also noticing some three-digit numbers here. So that just might be... That doesn't show up here. So we might need to remember to think about that. And we know here that the sample points to zero three times.

So it has a L on R for left and right, and then a number next to it. And I'm also turning them into integers because we know they're integers. So now we're in here, and we can still loop over the input.

So I'm seeing two main ways of handling this. So if the direction is left, we minus. So that means that we take the position, should be the position, plus value of i.

Whoa, wait a minute. Did you just copy something and then move it down with a shortcut? So if you do shift option on a Mac, it might be different places, you can just duplicate the current line. So I use a lot of something like this, where you shift option, and then you take your finger off shift. So you're only doing option because that lets you move a line around. So option plus the up and down keys? Yes.

So I think now we have l, we're minusing the value, and we're remembering to add it to the original value. And then if position equals zero, we say zeros plus one. So if we run this now, we did two, which is not what they had.

They had three, right? Yeah. So they said they had three. So something is wrong.

So what we can do here is probably right here, we can print. We use the catch function, where we are saying the position, and I'm adding a new line on it. So if we start all over, we are seeing some negative numbers right here.

We are, and we need to go backwards down to minus 100. And the reason why we're getting it wrong is because this minus 100 should have been a zero. Yeah, yeah.

So that isn't being counted. So the way we can do this is we should manually try to do the math. But that might be annoying because we notice that the real puzzle input has three-digit stuff, and that's a little bit of a pain.

Introducing the modulo operator

So there's this thing called the modular operator, which is the remainder of the division. And this happens to be exactly what we need here. So if you do persist, which is this double percent thing of 100. So that will take, if we run it, we now see that it does exactly what we need. Because if we do 100, modular 100, turns it back around into zero. And it also works if you do minus one of 100, it turns it around to 99. So that's exactly what we needed in this specific case.

So we could have written this by ourselves, but doing the math and if-else and whatever to make sure we are looping correctly. But I think it's pretty obvious that he was alluding to using the modular operator here. Which again, if you didn't know, it was a thing that might have been hard and taken you a little bit longer.

Yeah. Modulo is one of those things that, and for anybody who's listening and not looking at the Discord chat, modulo is like M-O-D-U-L-O, modulo. There's no like R on the end of it. And if you wanted to test it, you could see, you could do like 10 modulo three would give you, I think like one, right? Because you divide by three and it's just giving you the remainder only, which would be one after that division process. So your answer is only a remainder.

Yeah. And it works perfectly for what we need for negative numbers as well, which is like what we needed. So now we see that the zeros are correctly done here. So that's what it had. And at a quick glance, these numbers took away the debugging. So now we just try.

So this is what we do. We go in here, paste it in. And we see here that this was unlikely to be deduced by hand because my input is almost four and a half thousand left and rights. Oh my gosh. So it's very, yeah. So a lot of times it's also meant to be that you can't do them by hand. You can do the examples by hand, but it's very rarely you can do this part by hand.

If we run it and now I'm getting 1105 and should we try to submit it and see what happens? Let's do it. It's right. Oh, yeah, that's right. So we got one little star. So this is the exciting part because we haven't looked at what happens on day two or on part two here.

And you have to do part one to see what happens. And this is where Advent of Code tries to mimic what it's like to do programming in the real world. Because now we have some code that does something. And now he's asking a new question and it could be related to what we've done so far. But it's a little bit different. So you can mentally think about how can we make this code future-proof, but you never know because you don't know what it actually could be.

And this is where Advent of Code tries to mimic what it's like to do programming in the real world. Because now we have some code that does something. And now he's asking a new question and it could be related to what we've done so far.

Part two: counting every click

So then I stemmed a little bit. So it talked earlier about up here that when you turn the knob, you hear a little click. Oh, yeah. I do remember it said that. I was wondering if that was going to be a part of this. Yeah. So if you had that in mind, you might have written it a little bit different, right? Because now we have it said the actual password is not how many times we end up at zero after an instruction. It's how many times we're passing zero.

Like for any time you turn a knob, just like if you turn it 50 times, you're turning it 50 increments. Any time any of the increments hit zero, we're topping that. Oh, no. Now I don't know how to think about this anymore in our code loop. I sometimes think like when things change like that, I just want to delete my entire loop and start it over because if I try to modify my existing one, I might make things harder for myself. It's like when you ask an LLM to write something for you and it's so bad that fixing it takes more time than writing it yourself from scratch.

What are you doing, Emil? So what I normally do is I just copy all my code into a part two. So this is my part one solution and this will be my part two solution where I'll just do something. So I'm seeing two main ways of handling this. One of them is doing the math.

First, is it going to be one or more? So can we count any times it's going to be more? Okay. So first, if we're turning left. Yeah, it feels like... If anybody has an idea here, please let us know.

I will do it definitely here by doing... So I'll move this up. So instead of doing, adding, like subtracting the value, I will do a new for loop with J in the value and we're subtracting one instead. So instead of subtracting the whole value once, we are subtracting one, that whole value of times.

That doesn't make any sense to me. I keep going. So here, instead of adding 15. Like if it was L15. If it was L15, instead of adding 15, we're adding one, 15 times. Oh, so we can see once it passes a threshold. Yeah. And then we're just moving this chapter inside. But Kieran says, what if you land on zero?

But that's fine, because that's what we want. So if you land on zero, you get a click, but if you pass zero, you get a click. I think it's when you pass zero, you get a click, right? Because if it was landing on zero, it would be the same answer as the first part, where we would only land a certain number of times. So it's any blip that causes the dial to point at zero.

And then... Oh, wait. Isabella has a... Isabella says, don't forget to check the warning at the bottom. What warning? What warning? Where's the warning? Oh, is it at the bottom of this? That's in this example? Be careful.

If the dial were pointing at 50, a single rotation like R1000 would cause the dial to point at zero 10 times before returning back to 50. So it is just any time it passes zero. Yeah. So let's... This is starting to be like a lot of...

So now what we're doing, this is basically the same topic twice, right? So what we're doing here, when we turn left and we have a value of something, we're looping over and subtracting one that many times. Each time we're subtracting one, we check if it's zero. No, we should move this on before. We subtract a value from it and then do the modular operator to make sure we're between zero and 99. Then we check the value is zero and then time it. And then we move on.

So let's... This is where we can try the example one more time.

Oh, Kieran put a big old hinty hint in the Discord chat. Oh, I want to hear it. Do you want to know? He put a spoiler tag on it in Discord, which you can do by putting a double pipe on either side of something, by the way, if you want to. This is a learning space, so we're going to go ahead and say it. He says the magic is the difference between modulo and percent divided by percent integer division.

It's interesting how we never hit zero. Oh, we're not doing enough. Something is happening here. Yeah. All right. Let's see. This is what we can just do. I equals one. The reference is L. The value is... Oh, so we know what it is. We're not looping over... We're just looping over the singular value of 68. We need to seek that. Yeah. We need to seek a length of this. It gives us a little vector of one to that number. By the way, Emil's working in R, so we are one indexed, not zero indexed. Yes. That's also very fun because every once in a while the puzzle assumes that it's one indexed, but a lot of times it assumes it's zero indexed. So every once in a while R just works really well compared to other languages by being zero indexed.

So now I'm going to move this because this is going to blow up when we do the real input. That's true. Do we have a part two test number to tell us if we're right? Let's see. It's a six. Oh, you guys. I think we did it. Well, Emil did it. I take zero credit.

And I'm just doing command C to undo. And then we move this. Now that sets. Oh, one more thing that would be fun to do. That is R1000 because that was the warning. There was a warning, yeah. And we did sets for this. So we can also fader some of these things as unit tests. Right, yeah. So sometimes if you do these and you're doing them in a little bit longer format, later ones require a lot more code than these earlier ones. And, yeah, so it's just like sometimes you actually write the unit test to make sure that you're following all these.

Do you do this like pretty messily or do you like? Oh, it's very messy the first time. Okay, I have your GitHub with your Advent of Code in our stats and I'm going to pop that into the Discord server channel just so that everybody can kind of like get a glimpse at the way that Emil works. And that is the cleaned up version. Yeah. Also, I think that 1000% expect yourself to be a lot messier. I am a hot mess and my stuff if I post it on GitHub will be equally hot and messy.

An alternative approach using cumulative sums

So it turned out to be right and we're happy. Do we have time for me to show an alternative way of handling day one or part one? Absolutely, yeah. We have 12 minutes left and we are totally cool. We've got 41 people with us right now. Hello, everybody.

So then I will still split it out in directional values like this. We could do it with in that dplyr pipeline. The separate function from tidyr would also split it, but we already have it split, so we're saving some time. So what we can do is since these turns are happening one after another, we can do it as a time sum of this of the value that we then do the modulo on because that's the same as like turning it back and forth.

But we need to do the directions. So in here we can say if else direction equals to l then it's going to be a minus one or it's a one. So basically what I'm doing now here is I'm taking the values and then I'm turning this direction into a vector of like basically a sign. So are we adding? Are we subtracting?

So now it's like these are now clicks left or clicks right? Yes, and then we're taking the time sum of this. So we're just adding them one after another because that's essentially what we're doing. And then doing the modulo of that in one go. But then we can do sum of res equals zero and that might not be the right number. Let's find out. Why is that the right? That does seem too low. 31 is very low. Yeah, that's definitely too low.

So what are we doing? But like I said, even if we did this version and it worked, which I'm messing up somehow, even if we end. There's a question in Slido. Thank you, Lauren, for letting me know. It's what's the difference between the double percent, which is the modulo, and just one percent sign? What is it?

So one percent, I don't think, does anything. Does it? I don't know if that is an operator. That's not an operator. So that doesn't do anything. Well, at least in R, which is what we're working on. At least in R, yeah, right. So if you need to do the question mark and then like the bat around it, because this is a function, but it's not one with values, like letter values. So it's hard to search for. But if you do this instead, you can find it. And here we see it's in here. And they're like describing what they do.

Oh, there's the, what Kieran mentioned, which is like you have the modulo and then the like percent divided by percent Y. Yeah. Another thing you could do, but even if this option worked, that would have not worked because we needed to expand it in here, right? Because here we need to tell individual clips. I'm sure there's a way if you cared for it. So instead of adding another for loop inside, you could have done the math based on the number, like the position and the number of clips to find out if it will pass, how many times it will pass.

So you could do something like, so if we imagine the position is 40 and the value is 60, and we are minusing, right? So if we're in the left, we could do if value is larger than position. And then, because we know if it's larger than position, we're passing it, right? But if it's, if the value is then less than a hundred, no, it needs to be lighter than a hundred plus, like the depth between. So basically, so here we know that it's, it goes over, it hits zero if it goes over 20, right? But it also, it does over twice if it's more than 120 and three times if it's more than 220, right? So you could do the math here. Like divide it by a hundred first and use that, like the number of times it goes in to a hundred as your first number.

Yeah, so there is a way, like you could write this up to avoid the inner for loop somehow, right? There's probably like 50 ways to do this and to get it right, which is the best and worst thing about coding.

There's probably like 50 ways to do this and to get it right, which is the best and worst thing about coding.

I feel like when I was first learning programming, I was like, but what's the right answer? And nobody could tell me that. They're like, there's no right answer. There's, if the code runs, it runs, right?

I wanted to call out, Kieran mentioned, and by the way, Kieran said he did not actually implement Modulo on his own. I was just taking him literally, and he was joking. He said that he used accumulate from the purrr package, which I think is an interesting solution. Yeah, so there's so many different ways of handling this. Yeah, and that'll like sequentially do your cumulative sum by applying a function cumulatively over time.

And Noor was saying in the beginning too, that she would have solved it by like creating a function that did your thing that you need to do in your for loop.

Yeah, we're having a conversation in the chat about Modulo and the difference between R and Python operators. Like another thing you should do, which would be overkill in this situation, but a lot of Advent of Code likes these things where it's like a series of instructions, right? Like if the first character is L, you do something. If the first character is R, do something else. But sometimes they have like six different ones that do different things.

What we do in R, which I've done, which is very fun, is you take the input and then with, so here we have the, I've just done a shape of the, oh, it's so long. So just for like demonstration. So what we could do is we have the input that says this, but what we instead could do is to do is modify it a little bit. So you have direction. And then, oh, three minutes left as a time check.

So you can modify it a little bit, right? So now suddenly it looks like a bunch of function tools, right? So you could modify the input to turn it into what looks like a bunch of R function tools, define the functions R and L that does what we need. And then evaluate the input. Ooh, I like it. It's almost metaprogramming. Yeah. So you can do that. Here, it's Overtail. And you need to do like some weird, like back up things where we need to, because we need to now modify in global slope, like out of zeros. But you could do that. You could, these two for loops we have, you could have put those inside an L function and R function that then just run on itself. So instead of looping over the input, we're turning the input into code that when evaluated does the same thing.

So that's, so it was a great first day because there's a lot of different things to do. Yeah, this was a fantastic day. Part one and two for our purposes. This is really fun. If you never did Advent of Code before, like I didn't, I hope that you are now excited to go play with it. And there's only 12 days this year, so it's a little bit less stressful. It used to be 30 days every single time. And people were staying up past midnight to get things done as fast as they came out. And like, don't stress that much, but do have fun. Do come share in the Discord server what you're working on, and we can work on it together.

And I'm so excited that you hung out with us today. We are going to be here next week with Alex Chisholm, who also happens to work here at Posit, to talk about all the different ways to publish Shiny apps in 2026. Because our Shiny app publication landscape has been changing so much and is evolving. And we would love to show you how that works in Positron and RStudio and everything in between. Thank you for hanging out with us, Emil. This was fantastic.

It was a pleasure. It was fun having time with everyone. I'll try to do, like, if people aren't Discord, I think people are sharing answers. That's fun. They are. And it's very entertaining, but also, like, make sure to only spend however much time you have on it, so it doesn't take over. Care for your mental health and your friends and family, instead of spending all day on Advent of Code. Yeah. Okay, everybody, I will see you on the Discord server. Come say hi. Come share your code. Other than that, I'll see you next week, or I'll see you on Thursday for the Data Science Hangout. Bye, everybody!