Now that we have pieces and a board, we need a convenient way of setting
pieces on the board in specific positions. We'll use this, not only for the initial position
of a game, but also to configure a board with specific game scenarios
for testing and debugging.
...We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%.
Chess programming is most assuredly in the 3%! Our challenge in this series will be to strike a reasonable balance between efficiency and clarity. Our first opportunity to that end is the chess piece.
Programming a competent chess engine in lisp has been a goal of mine
for some time. I finally did so in 2021, and it was a
lot of fun! My new goal is to rewrite the code in a step by step way
that emphasizes clarity, and to present it as a clear tutorial for
writing a chess engine, and as a general Racket tutorial.
The left side is our card hand. The right side is our bid amount. As always, we begin with parsing. For our purposes of illustration, I'll skip the first 20 hands to get to a more interesting one with a J:
Day 5 involves a typical Advent of Code scenario where Part 1 is easy, and a naive modification to Part 1 to get Part 2 is easy; however, the naive Part 2 solution will take far too long to run! :)
After solving Part 1 to get a star, I re-implemented the code to solve Part 2, and then Part 1 was simply making the Part 1 input conform to what Part 2 needed, and call Part 2.
The "trick" for Part 2 was to process the seed ranges as ranges, and not attempt to convert the seed ranges into lists of individual seeds.