Day 23: LAN Party
Megathread guidelines
- 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
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
Haskell
I was expecting a very difficult graph theory problem at first glance, but this one was actually pretty easy too!
import Data.Bifunctor import Data.List import Data.Ord import Data.Set qualified as Set views :: [a] -> [(a, [a])] views [] = [] views (x : xs) = (x, xs) : (second (x :) <$> views xs) choose :: Int -> [a] -> [[a]] choose 0 _ = [[]] choose _ [] = [] choose n (x : xs) = ((x :) <$> choose (n - 1) xs) ++ choose n xs removeConnectedGroup connected = fmap (uncurry go . first Set.singleton) . Set.minView where go group hosts = maybe (group, hosts) (\h -> go (Set.insert h group) (Set.delete h hosts)) $ find (flip all group . connected) hosts main = do net <- Set.fromList . map (second tail . break (== '-')) . lines <$> readFile "input23" let hosts = Set.fromList $ [fst, snd] <*> Set.elems net connected a b = any (`Set.member` net) [(a, b), (b, a)] complete = all (uncurry $ all . connected) . views print . length . filter complete . filter (any ((== 't') . head)) $ choose 3 (Set.elems hosts) putStrLn . (intercalate "," . Set.toAscList) . maximumBy (comparing Set.size) . unfoldr (removeConnectedGroup connected) $ hosts ``