@@ -545,30 +545,65 @@ I might try that later just to see for part2 though.
545
545
546
546
Base version
547
547
``` 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
+
551
556
```
552
557
Time: 18s
553
558
554
559
To try I tried to change the ` S.insert ` to the opposite ` S.delete `
555
560
556
561
``` 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
+
560
570
```
561
571
562
572
Time: 16s
563
573
564
574
Then I tried to remove the number of calls to ` isLan `
565
575
566
576
``` 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
+
570
585
```
571
586
572
587
Time: 12.6s
573
588
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
+
574
609
Could try and look further but I don't really have time now.
0 commit comments