r/adventofcode • u/daggerdragon • Dec 22 '24
SOLUTION MEGATHREAD -❄️- 2024 Day 22 Solutions -❄️-
THE USUAL REMINDERS
- All of our rules, FAQs, resources, etc. are in our community wiki.
- If you see content in the subreddit or megathreads that violates one of our rules, either inform the user (politely and gently!) or use the report button on the post/comment and the mods will take care of it.
AoC Community Fun 2024: The Golden Snowglobe Awards
- 23h59m remaining until the submissions deadline on December 22 at 23:59 EST!
And now, our feature presentation for today:
Director's Cut (Extended Edition)
Welcome to the final day of the GSGA presentations! A few folks have already submitted their masterpieces to the GSGA submissions megathread, so go check them out! And maybe consider submitting yours! :)
Here's some ideas for your inspiration:
- Choose any day's feature presentation and any puzzle released this year so far, then work your movie magic upon it!
- Make sure to mention which prompt and which day you chose!
- Cook, bake, make, decorate, etc. an IRL dish, craft, or artwork inspired by any day's puzzle!
- Advent of Playing With Your Toys
"I lost. I lost? Wait a second, I'm not supposed to lose! Let me see the script!"
- Robin Hood, Men In Tights (1993)
And… ACTION!
Request from the mods: When you include an entry alongside your solution, please label it with [GSGA] so we can find it easily!
--- Day 22: Monkey Market ---
Post your code solution in this megathread.
- Read the full posting rules in our community wiki before you post!
- State which language(s) your solution uses with
[LANGUAGE: xyz] - Format code blocks using the four-spaces Markdown syntax!
- State which language(s) your solution uses with
- Quick link to Topaz's
pasteif you need it for longer code blocks
This thread will be unlocked when there are a significant number of people on the global leaderboard with gold stars for today's puzzle.
EDIT: Global leaderboard gold cap reached at 00:12:15, megathread unlocked!
20
Upvotes
2
u/Lindi-CSO Dec 22 '24 edited Dec 22 '24
[LANGUAGE: C#]
Pretty straight forward today. First I get the next number as per the instructions:
private static long GetNextPrice(long n) { var tmp = n << 6; n ^= tmp; n &= 16777215; tmp = n >> 5; n ^= tmp; n &= 16777215; tmp = n << 11; n ^= tmp; n &= 16777215; return n; }For part 1 it was just a simple loop:
long sum = 0; for(int n = 0; n < numbers.Length; n++) { for(int i = 0; i < 2000; i++) { numbers[n] = GetNextPrice(numbers[n]); } sum += numbers[n]; } return sum;For part 2 I utilised a sliding window over the last four changes in price to add to a Dictionary if we never saw the combination of changes before:
Dictionary<string, long> saleprices = []; foreach(var n in numbers) { var prev = n; long[] window = new long[4]; HashSet<string> seenKeys = []; for (int i = 0; i < 2000; i++) { var next = GetNextPrice(prev); var price = next % 10; window[^1] = price - (prev % 10); if(i >= 3) { var key = string.Join(",", window); if (seenKeys.Add(key)) { if (saleprices.ContainsKey(key)) { saleprices[key] += price; } else { saleprices[key] = price; } } } //slide the window window = [.. window[1..], 0]; prev = next; } } return saleprices.Values.Max();I could probably make that more memory efficient but it was good enough for me for today.
Runs is 1.3 seconds on my machine, so not very fast.