Skip to content

Commit b01170e

Browse files
committed
clean(2024/Day23)
1 parent 7c744da commit b01170e

File tree

2 files changed

+44
-18
lines changed

2 files changed

+44
-18
lines changed

2024/Day23/Day23.hs

-9
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,13 @@
11
module Main where
22

3-
import Data.Bits
43
import Data.Function
54
import Data.List
6-
import Data.List.Split
7-
import Data.List.Unique
85
import Data.Map (Map)
96
import Data.Map qualified as M
10-
import Data.Matrix (Matrix, (!))
11-
import Data.Matrix qualified as Mat
127
import Data.Set (Set)
138
import Data.Set qualified as S
149
import Data.Tuple.Extra
15-
import Debug.Trace
1610
import System.Environment
17-
import Text.Regex.TDFA ((=~))
18-
19-
-- TODO: Cleanup imports after day done
2011

2112
type Input = Map String (Set String)
2213

2024/README.md

+44-9
Original file line numberDiff line numberDiff line change
@@ -545,30 +545,65 @@ I might try that later just to see for part2 though.
545545

546546
Base version
547547
```hs
548-
isLan s = all (\e -> S.isSubsetOf s $ (S.insert e) $ input M.! e) s
549-
lansOf k = S.filter isLan . S.powerSet . S.insert k $ (input M.! k)
550-
lans = S.unions . map lansOf $ M.keys input
548+
part2 :: Input -> String
549+
part2 input = join "," . sort $ S.toList biggest
550+
where
551+
isLan s = all (\e -> S.isSubsetOf s $ (S.insert e) $ input M.! e) s
552+
lansOf k = S.filter isLan . S.powerSet . S.insert k $ (input M.! k)
553+
lans = S.unions . map lansOf $ M.keys input
554+
biggest = maximumBy (compare `on` S.size) lans
555+
551556
```
552557
Time: 18s
553558

554559
To try I tried to change the `S.insert` to the opposite `S.delete`
555560

556561
```hs
557-
isLan s = {-# SCC isLan #-} all (\e -> S.isSubsetOf (S.delete e s) $ input M.! e) s
558-
lansOf k = {-# SCC lansOf #-} S.filter isLan . S.powerSet . S.insert k $ (input M.! k)
559-
lans = {-# SCC lans #-} S.unions . map lansOf $ M.keys input
562+
part2 :: Input -> String
563+
part2 input = join "," . sort $ S.toList biggest
564+
where
565+
isLan s = all (\e -> S.isSubsetOf (S.delete e s) $ input M.! e) s
566+
lansOf k = S.filter isLan . S.powerSet . S.insert k $ (input M.! k)
567+
lans = S.unions . map lansOf $ M.keys input
568+
biggest = maximumBy (compare `on` S.size) lans
569+
560570
```
561571

562572
Time: 16s
563573

564574
Then I tried to remove the number of calls to `isLan`
565575

566576
```hs
567-
isLan s = {-# SCC isLan #-} all (\e -> S.isSubsetOf (S.delete e s) $ input M.! e) s
568-
lansOf k = {-# SCC lansOf #-} S.powerSet . S.insert k $ (input M.! k)
569-
lans = {-# SCC lans #-} S.filter isLan . S.unions . map lansOf $ M.keys input
577+
part2 :: Input -> String
578+
part2 input = join "," . sort $ S.toList biggest
579+
where
580+
isLan s = all (\e -> S.isSubsetOf (S.delete e s) $ input M.! e) s
581+
lansOf k = S.powerSet . S.insert k $ (input M.! k)
582+
lans = S.filter isLan . S.unions . map lansOf $ M.keys input
583+
biggest = maximumBy (compare `on` S.size) lans
584+
570585
```
571586

572587
Time: 12.6s
573588

589+
Another idea to decrease the number of calls to `isLan` was to first sort by `S.size` then take the first valid lan.
590+
591+
```hs
592+
part2 :: Input -> String
593+
part2 input = join "," . sort $ S.toList biggest
594+
where
595+
isLan s = all (\e -> S.isSubsetOf (S.delete e s) $ input M.! e) s
596+
lansOf k = S.powerSet . S.insert k $ (input M.! k)
597+
lans = S.unions . map lansOf $ M.keys input
598+
biggest = head . filter isLan . reverse . sortBy (compare `on` S.size) $ S.toList lans
599+
```
600+
601+
The issue with this one is that the sorting takes more time than the calls to `isLan` so instead of 12s it actually takes longer.
602+
603+
Time: 19s
604+
605+
Anyway the time is not as much in isLan anymore:
606+
- `isLan`: 37%
607+
- `lans`: 54%
608+
574609
Could try and look further but I don't really have time now.

0 commit comments

Comments
 (0)