• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Tim Cooke
  • Liutauras Vilda
  • Jeanne Boyarsky
  • paul wheaton
Sheriffs:
  • Ron McLeod
  • Devaka Cooray
  • Henry Wong
Saloon Keepers:
  • Tim Holloway
  • Stephan van Hulst
  • Carey Brown
  • Tim Moores
  • Mikalai Zaikin
Bartenders:
  • Frits Walraven

Advent of Code in Kotlin - some silly (but nice, I think) things I've done/discovered

 
Sheriff
Posts: 17680
300
Mac Android IntelliJ IDE Eclipse IDE Spring Debian Java Ubuntu Linux
  • Likes 1
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Having lots of fun re-upping my Kotlin skills with this year's AoC.

Here are some things I've done that I think are shareable.

1. Testing without JUnit - I'm trying to avoid using JUnit and just testing with check(), like so:


I just discovered the check() has a lazyMessage parameter, which is nice. At some point I might cave and start using JUnit but doing this still helps me do TDD well enough.

2. Declarative/functional programming is nice!

I'm starting to settle on a problem-solving approach that's kind of "bass ackwards" but very much in line with TDD philosophy: Start with the end in mind. I'm working on Day 4 Part 2 right now and here's what I started writing:

That's it. To get the answer, I work my way backwards and implement each of these steps, breaking each one down into smaller problems when necessary.

3. Kotlin makes it easy to create DSLs (Domain Specific Languages)

Extension functions really help for declarative/functional programming. Here's what the asCards() function ended up being:

and ScratchCard is a data class with the of() factory function/method as a part of its companion object. This does the heavy lifting of parsing the input.

There are a few more things I'm playing around with but this is getting long and I have to get back to solving Day 4 Part 2. I'm falling way behind with all the reflection and playing around that I'm doing, but it's fun.
 
Junilu Lacar
Sheriff
Posts: 17680
300
Mac Android IntelliJ IDE Eclipse IDE Spring Debian Java Ubuntu Linux
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
4. Using .also scope function for inline debugging statements

If I format them right, I can use IDEA's rectangular (column-wise) selection feature to easily add debugging statements:

When I don't need them, I just rectangular highlight the .also parts and delete or comment them out.

Just did this for Day 4 Part 2, which I just got done solving.

Who needs sleep when you can code in Kotlin all night!  
 
Junilu Lacar
Sheriff
Posts: 17680
300
Mac Android IntelliJ IDE Eclipse IDE Spring Debian Java Ubuntu Linux
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Still working through Day 5 part 1 (already the 9th day of Advent!!!). Hoping I can catch up a little bit this weekend.

Can't say enough about declarative style coding. I find it very helpful and fun to back into the solution by declaring the code I want to write. Here's what I declared for Day 5, part 1:

Edit #1: Ah! Found a bug already just by looking at that code. Off by one:

Edit #2: And as I keep working the problem, I'm also changing the way the code tells the story:
 
Saloon Keeper
Posts: 15727
368
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Junilu Lacar wrote:Edit #2: And as I keep working the problem, I'm also changing the way the code tells the story:


Looks similar to what I had:
 
Junilu Lacar
Sheriff
Posts: 17680
300
Mac Android IntelliJ IDE Eclipse IDE Spring Debian Java Ubuntu Linux
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Stephan van Hulst wrote:
Looks similar to what I had:


That's awesome. Like minds...  
 
Junilu Lacar
Sheriff
Posts: 17680
300
Mac Android IntelliJ IDE Eclipse IDE Spring Debian Java Ubuntu Linux
  • Likes 1
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Well, one thing's for sure, I still have a ways to go to be truly conversant with Kotlin. I've been following this guy named Todd Ginsberg and I find his Kotlin solutions simply amazing in their elegance. For example, I (finally) completed Day 5 Part 2 yesterday but it was taking several minutes (6 to 8 mins) to complete its run. I did not know how to make it perform better.  I looked at Todd's solution and was skeptical that his approach would perform well but when I tried it, it took 6.4 seconds (I ran with a profiler) to complete over 20 million iterations. I know the exact number of iterations because it was also the answer to my puzzle.

His approach was quite simple but something that just escaped me, I wouldn't have thought to do it this way. Basically, he started with the end value (the location) and just went through all possible values until he found one that converted to a seed value that was in any of the ranges given in the puzzle input.

The Kotlin code pretty much says that.

You could even get rid of the "seed" explaining variable but I prefer to keep it.

Just mwah! (chef kiss)
 
Junilu Lacar
Sheriff
Posts: 17680
300
Mac Android IntelliJ IDE Eclipse IDE Spring Debian Java Ubuntu Linux
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Junilu Lacar wrote:
You could even get rid of the "seed" explaining variable but I prefer to keep it.


I take it back. Should have tried it before posting. When I did this, the performance took a significant hit. I guess Kotlin is calling convert() multiple times when it evaluates the any() part. To keep the performance, you have to use that temporary seed variable so it's only executed once per iteration of the generated sequence. I profiled it again and this time part 2 took only 5,093ms to complete 20million iterations.
 
Junilu Lacar
Sheriff
Posts: 17680
300
Mac Android IntelliJ IDE Eclipse IDE Spring Debian Java Ubuntu Linux
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
If you're interested, check out my final (maybe) solution code for Day 7: https://github.com/jlacar/aoc-2023-kotlin/blob/main/src/Day07.kt

I think that's about as tight as I can get my Kotlin at this point, but if you think there's another notch please let me know.
 
Junilu Lacar
Sheriff
Posts: 17680
300
Mac Android IntelliJ IDE Eclipse IDE Spring Debian Java Ubuntu Linux
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I just looked at Todd Ginsburg's Day 7 solution at https://github.com/tginsberg/advent-2023-kotlin/blob/main/src/main/kotlin/com/ginsberg/advent2023/Day07.kt and I think I finally came up with one that I like more than his, all bias aside.

Any thoughts?
 
Hey, I'm supposed to be the guide! Wait up! No fair! You have the tiny ad!
Gift giving made easy with the permaculture playing cards
https://coderanch.com/t/777758/Gift-giving-easy-permaculture-playing
reply
    Bookmark Topic Watch Topic
  • New Topic