Quest 3: The Deepest Fit
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
Link to participate: https://everybody.codes/
Also, don’t wait for me to make these posts, feel free to post yourself :)
You must log in or # to comment.
I thought this was going to be the knapsack problem, but no.
import Control.Monad import Data.List.Split import qualified Data.Set as Set import qualified Data.Multiset as MSet part1, part2, part3 :: [Int] -> Int part1 = sum . Set.fromList part2 = sum . Set.take 20 . Set.fromList part3 = maximum . MSet.toCountMap . MSet.fromList main = forM_ [ ("everybody_codes_e2025_q03_p1.txt", part1), ("everybody_codes_e2025_q03_p2.txt", part2), ("everybody_codes_e2025_q03_p3.txt", part3) ] $ \(input, solve) -> readFile input >>= print . solve . map read . splitOn ","I was scared of a hard combinatorial puzzle day, but this was a breeze.
{-# LANGUAGE TupleSections #-} module Main (main) where import Control.Monad ((<$!>)) import qualified Data.Text.IO as TextIO import Data.Text (Text) import qualified Data.Text as Text import qualified Data.IntSet as IntSet import Control.Arrow ((>>>)) import qualified Data.List as List import qualified Data.IntMap as IntMap part1 :: [IntSet.Key] -> IntSet.Key part1 = IntSet.fromList >>> IntSet.foldl (+) 0 part2 :: [IntSet.Key] -> IntSet.Key part2 = IntSet.fromList >>> IntSet.toAscList >>> take 20 >>> sum part3 :: [IntMap.Key] -> Int part3 = List.map (, 1) >>> IntMap.fromListWith (+) >>> IntMap.toList >>> List.map snd >>> maximum main :: IO () main = do sizes <- map (read . Text.unpack) . Text.split (== ',') <$!> TextIO.getLine print $ part1 sizes print $ part2 sizes print $ part3 sizesNim
Reading this day’s quest I was at first a bit confused what it asks me to calculate. Took me about a minute to realize that most of descriptions are not important and actual calculations for each part are very simple:
part 1 wants sum of each unique crate size
part 2 is same but only 20 smallest
part 3 is max count, because you can always put most crates in one large set and you only need 1 extra set per duplicate crateproc solve_part1*(input: string): Solution = var seen: set[int16] for num in input.split(','): let num = parseInt(num).int16 if num in seen: continue else: seen.incl num result.intVal += num proc solve_part2*(input: string): Solution = var set = input.split(',').mapIt(parseInt(it).uint16) set.sort() result := set.deduplicate(isSorted=true)[0..<20].sum() proc solve_part3*(input: string): Solution = var cnt = input.split(',').toCountTable() result := cnt.largest.valFull solution at Codeberg: solution.nim
Rust
pub fn solve_part_1(input: &str) -> String { let mut crates: Vec<i64> = input.split(",").map(|s| s.parse().unwrap()).collect(); crates.sort(); let mut monotonic_subsequence = vec![crates[0]]; for size in crates.into_iter().skip(1) { if size == *monotonic_subsequence.last().unwrap() { continue; } monotonic_subsequence.push(size); } monotonic_subsequence.iter().sum::<i64>().to_string() } pub fn solve_part_2(input: &str) -> String { let mut crates: Vec<i64> = input.split(",").map(|s| s.parse().unwrap()).collect(); crates.sort(); let mut monotonic_subsequence = vec![crates[0]]; for size in crates.into_iter().skip(1) { if size == *monotonic_subsequence.last().unwrap() { continue; } monotonic_subsequence.push(size); if monotonic_subsequence.len() >= 20 { break; } } monotonic_subsequence.iter().sum::<i64>().to_string() } pub fn solve_part_3(input: &str) -> String { let mut crates: Vec<i64> = input.split(",").map(|s| s.parse().unwrap()).collect(); crates.sort(); let mut monotonic_subsequences = vec![vec![crates[0]]]; for size in crates.into_iter().skip(1) { let updateable_sequence = monotonic_subsequences .iter_mut() .find(|v| *v.last().unwrap() < size); match updateable_sequence { Some(v) => { v.push(size); } None => { monotonic_subsequences.push(vec![size]); } } } monotonic_subsequences.len().to_string() }



