From c104561d8beca15cc2e9dc743e00e865a26c5120 Mon Sep 17 00:00:00 2001 From: Jens Kadenbach Date: Thu, 1 Dec 2022 15:57:27 +0100 Subject: [PATCH] day1 --- .gitignore | 5 + CHANGELOG.md | 11 + LICENSE | 30 + README.md | 1 + Setup.hs | 2 + aoc2022.cabal | 75 ++ app/Main.hs | 6 + package.yaml | 63 + ressources/day01-input | 2244 +++++++++++++++++++++++++++++++++++ ressources/day01-input-test | 14 + src/Day1.hs | 39 + src/Day1/Internal.hs | 66 ++ src/Lib.hs | 9 + stack.yaml | 67 ++ stack.yaml.lock | 13 + test/Spec.hs | 25 + 16 files changed, 2670 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 Setup.hs create mode 100644 aoc2022.cabal create mode 100644 app/Main.hs create mode 100644 package.yaml create mode 100644 ressources/day01-input create mode 100644 ressources/day01-input-test create mode 100644 src/Day1.hs create mode 100644 src/Day1/Internal.hs create mode 100644 src/Lib.hs create mode 100644 stack.yaml create mode 100644 stack.yaml.lock create mode 100644 test/Spec.hs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0eb242c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.stack-work/ +*~ +.idea/ +aoc2022.iml +out/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..49e6bc4 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +# Changelog for `aoc2022` + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to the +[Haskell Package Versioning Policy](https://pvp.haskell.org/). + +## Unreleased + +## 0.1.0.0 - YYYY-MM-DD diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8e69540 --- /dev/null +++ b/LICENSE @@ -0,0 +1,30 @@ +Copyright Jens Kadenbach (c) 2022 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Jens Kadenbach nor the names of other + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b9a022c --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# aoc2022 diff --git a/Setup.hs b/Setup.hs new file mode 100644 index 0000000..9a994af --- /dev/null +++ b/Setup.hs @@ -0,0 +1,2 @@ +import Distribution.Simple +main = defaultMain diff --git a/aoc2022.cabal b/aoc2022.cabal new file mode 100644 index 0000000..356674b --- /dev/null +++ b/aoc2022.cabal @@ -0,0 +1,75 @@ +cabal-version: 1.12 + +-- This file has been generated from package.yaml by hpack version 0.35.0. +-- +-- see: https://github.com/sol/hpack + +name: aoc2022 +version: 0.1.0.0 +description: Please see the README on GitHub at +homepage: https://github.com/audax/aoc2022#readme +bug-reports: https://github.com/audax/aoc2022/issues +author: Jens Kadenbach +maintainer: jens.kadenbach@smartsteuer.de +copyright: 2022 Jens Kadenbach +license: BSD3 +license-file: LICENSE +build-type: Simple +extra-source-files: + README.md + CHANGELOG.md + +source-repository head + type: git + location: https://github.com/audax/aoc2022 + +library + exposed-modules: + Day1 + Day1.Internal + Lib + other-modules: + Paths_aoc2022 + hs-source-dirs: + src + ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints + build-depends: + QuickCheck + , base >=4.7 && <5 + , hspec + , split + , text + default-language: Haskell2010 + +executable aoc2022-exe + main-is: Main.hs + other-modules: + Paths_aoc2022 + hs-source-dirs: + app + ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N + build-depends: + QuickCheck + , aoc2022 + , base >=4.7 && <5 + , hspec + , split + , text + default-language: Haskell2010 + +test-suite aoc2022-test + type: exitcode-stdio-1.0 + main-is: Spec.hs + other-modules: + Paths_aoc2022 + hs-source-dirs: + test + ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N + build-depends: + QuickCheck + , aoc2022 + , base >=4.7 && <5 + , hspec + , split + , text + default-language: Haskell2010 diff --git a/app/Main.hs b/app/Main.hs new file mode 100644 index 0000000..4c6b30f --- /dev/null +++ b/app/Main.hs @@ -0,0 +1,6 @@ +module Main (main) where + +import Lib + +main :: IO () +main = someFunc diff --git a/package.yaml b/package.yaml new file mode 100644 index 0000000..160f28f --- /dev/null +++ b/package.yaml @@ -0,0 +1,63 @@ +name: aoc2022 +version: 0.1.0.0 +github: "audax/aoc2022" +license: BSD3 +author: "Jens Kadenbach" +maintainer: "jens.kadenbach@smartsteuer.de" +copyright: "2022 Jens Kadenbach" + +extra-source-files: +- README.md +- CHANGELOG.md + +# Metadata used when publishing your package +# synopsis: Short description of your package +# category: Web + +# To avoid duplicated efforts in documentation and dealing with the +# complications of embedding Haddock markup inside cabal files, it is +# common to point users to the README.md file. +description: Please see the README on GitHub at + +dependencies: +- base >= 4.7 && < 5 +- hspec +- QuickCheck +- text +- split + +ghc-options: +- -Wall +- -Wcompat +- -Widentities +- -Wincomplete-record-updates +- -Wincomplete-uni-patterns +- -Wmissing-export-lists +- -Wmissing-home-modules +- -Wpartial-fields +- -Wredundant-constraints + +library: + source-dirs: src + +executables: + aoc2022-exe: + main: Main.hs + source-dirs: app + ghc-options: + - -threaded + - -rtsopts + - -with-rtsopts=-N + dependencies: + - aoc2022 + +tests: + aoc2022-test: + main: Spec.hs + source-dirs: test + ghc-options: + - -threaded + - -rtsopts + - -with-rtsopts=-N + dependencies: + - aoc2022 diff --git a/ressources/day01-input b/ressources/day01-input new file mode 100644 index 0000000..7be633e --- /dev/null +++ b/ressources/day01-input @@ -0,0 +1,2244 @@ +8890 +13468 +5519 +4939 + +4580 +3529 +2917 +1329 +4004 +3553 +5457 +1907 +2515 +4055 +4626 +3776 +1982 +2967 + +10118 +2688 +4629 +3054 +3911 +6680 +6988 +6471 + +2836 +7494 +7963 +8528 +8732 +1743 +4794 +1685 +1406 +2575 + +7606 +11935 +4792 +7040 +8684 +1131 +3000 + +5799 +4398 +3837 +2155 +1889 +5560 +6684 +2045 +1194 +1280 +4009 +6944 +4754 + +3932 +10114 +9039 +10597 +6889 +5807 +8786 +5376 + +5666 +8741 +2305 +3914 +4521 +6449 +6590 +5933 +2765 + +1417 +3584 +3304 +5605 +6249 +3195 +5905 +5308 +3920 +2912 +4028 +2897 +4737 +6224 + +4498 +6139 +6716 +9309 +6210 +4120 +6244 +9313 +3275 + +5602 +4336 +5174 +4592 +3676 +6700 +1903 +4623 +5393 +3743 +2397 +5207 +3445 + +2219 +3393 +4442 +5142 +4466 +6851 +1877 +4005 +4792 +1370 + +11433 +10337 +11711 +4342 +6693 +2626 +6245 + +10039 +11192 +7335 +13284 +13507 + +1989 +5218 +4411 +4440 +3563 +1714 +3617 +3068 +1167 +1222 +3567 +3888 +2634 +2289 +3410 + +6518 +5391 +12964 +13103 +9070 +9803 + +22560 + +4229 +2789 +2219 +1940 +2848 +4053 +5849 +5518 +1088 +6297 +6603 + +2889 +3452 +4254 +3624 +4293 +1511 +5150 +2890 +5834 +6345 +6399 +1164 +3561 + +46632 + +19171 + +2510 +21303 +15390 + +54375 + +22699 +36690 + +2240 +3329 +3299 +5978 +4641 +3499 +3515 +4915 +4613 +2785 +4757 +5394 +2339 +2574 +5073 + +1321 +3132 +5429 +5664 +4451 +1397 +3284 +6077 +4117 +4818 +4430 +3163 +2432 +3894 + +6726 +2851 +9582 + +32549 + +17153 +18102 +11467 +20051 + +7167 +4819 +4283 +1900 +1524 +3228 +1712 +7107 +7453 +1137 +1927 +3876 + +14437 +7952 + +5253 +7062 +1107 +5023 +2353 +7335 +2819 +4925 +2439 +5186 +3602 +2016 + +4129 +26383 + +3665 +5169 +6365 +4399 +3518 +2176 +6185 +1150 +1490 +3818 +6223 +2104 +4006 +1142 + +1138 +11986 +5920 +6371 +7888 +8197 +10859 + +4338 +4292 +1523 +1044 +2498 +2514 +3160 +5049 +2113 +5867 +1916 +5458 +4686 +2012 +5455 + +15587 + +4040 +4077 +5272 +4914 +6755 +6297 +2240 +1925 +2940 +2346 +5688 +5501 + +1476 +4270 +1252 +4783 +3661 +5353 +4596 +5400 +5916 +1685 +3307 +3915 +5624 +1371 +2001 + +42703 + +1250 +2902 +6414 +6487 +6368 +1200 +2759 +3307 +5551 +1216 +4097 +3174 +3758 +2470 + +4997 +1199 +4598 +2443 +2931 +4287 +1606 +5156 +4750 +4117 +2487 +3399 +4283 +4991 +4441 + +1789 + +4379 +10889 +6020 +1102 +5043 +10061 +11276 + +7586 +13962 + +10039 +2029 + +2150 +2431 +3646 +4601 +5105 +4254 +5469 +5844 +6856 +4529 +3557 +3043 +4944 + +6797 +1605 +6624 +4966 +1452 +2260 +6281 +3273 +5754 +6576 +6326 +6391 +4892 + +9772 +16686 +1032 +14594 + +2978 +4118 +2292 +6107 +7428 +2954 +3516 +2464 +4726 +5438 +3292 +2812 + +6953 +7372 +5775 +7550 +8449 +7315 +2872 +2442 + +2581 +7301 +1256 +3467 +2348 +6254 +5231 +3225 +8275 + +3065 +4110 +5259 +8646 +4515 +7431 +7086 +3650 +2445 + +5714 +4659 +6401 +1647 +7071 +1302 +8529 +1570 +7288 + +49901 + +6687 +1879 +4661 +6048 +6920 +5048 +1537 +3786 +1634 +3274 +4277 +2712 +2647 + +5597 +4194 +4058 +5329 +2484 +3420 +2607 +2953 +2580 +1093 +2609 +2299 +4805 +3426 +4101 + +2833 +6833 +1455 +9758 +2307 +3045 +10558 + +3380 +4149 +8715 +5262 +7564 +9620 +3331 +6581 +7674 + +3389 +2996 +1250 +9915 +1731 +7254 +3784 +10198 + +4210 +6612 +6253 +6874 +5858 +4349 +4845 +1119 +4695 +4496 +6276 +4234 +6679 + +16077 +6437 +18269 +14173 + +19739 +5489 +3345 +5798 + +4150 +5984 +5293 +5741 +3166 +5279 +5244 +5215 +5010 +3367 +1828 +4310 +4335 +3973 + +2144 +12157 +9069 +1615 +1826 +7195 + +12924 +6962 +11433 +3150 +7863 +7387 + +3113 +3604 +7814 +10587 +3098 +10913 + +4513 +9048 +10027 +3587 +7837 +3906 +2299 + +4370 +6152 +5473 +5866 +5358 +4265 +4487 +6664 +2347 +6075 +1481 +4074 +1962 + +7409 +7332 +11378 +7740 +8090 +3036 +1310 + +8351 +6202 +1420 +9306 +7410 +11169 +9201 + +6951 +2037 +8682 +5075 +9709 +4678 +8347 + +10537 +13081 +5447 +8707 +11933 + +10454 +2543 +10319 +8133 +2072 +9299 +1929 + +7770 +4904 +8452 +8625 +7675 +4126 +1015 +4921 +8517 +2709 + +10877 +7192 +9475 +4555 +5625 +5261 +5756 + +6150 +9451 +11426 +11464 +6334 +10003 +8686 + +1959 +1711 +5018 +4235 +4920 +4257 +2511 +2572 +1347 +1871 +2102 +4203 +6334 + +12058 +8690 +1875 +7697 +12351 +7669 + +32887 + +31015 + +6024 +2966 +3311 +7248 +6280 +4727 +6071 +6771 +1599 +1958 +7649 + +9066 +13179 +1857 +12410 +1404 +11676 + +6262 +7283 +4418 +1207 +7099 +2798 +6994 +5267 +7810 +6521 + +7144 +3828 +5528 +4676 +2311 +6429 +7064 +6601 +2846 +1611 +3188 + +4151 +6232 +5706 +7003 +3470 +8349 +8189 +4137 + +3055 +6091 +2008 +5977 +1909 +1192 +2149 +2983 +1219 +1025 +1537 +2635 +5461 +5570 +5620 + +25514 + +19363 +16402 + +6908 +4670 +3407 +4541 +5027 +5640 +1008 +5737 +2336 +2994 +3908 + +2788 +5117 +18397 +5362 + +2285 +1597 +1556 +1505 +1317 +1136 +3387 +4936 +6798 +7103 +5537 + +7045 +4354 +6071 +6734 +11077 +5863 +7177 + +5625 +3990 +6473 +3191 +1023 +3673 +2520 +5998 +2726 +5421 +1907 +7129 + +1302 +1703 +6858 +1329 +1933 +3438 +4088 +7955 + +8593 + +6686 +3483 +5829 +2240 +6810 +2964 +5400 +3826 +4753 +5525 +5395 +5127 +6010 + +9254 +37116 + +1487 +18037 +9573 +14918 + +6570 +3119 +1689 +3785 +4436 +6237 +4394 +4042 +1242 +7143 +1621 +5211 + +3851 +1651 +2177 +5699 +4866 +5048 +5174 +1271 +3971 +2695 +1051 +1670 +1372 +3959 +1264 + +8039 +1858 +9989 +8870 +7618 +5662 + +1059 +8999 +2214 +5310 +8052 +5807 +1963 +4282 +8489 + +1444 +2736 +3879 +2437 +3539 +3657 +2351 +4513 +4299 +4166 +5665 +4164 +3622 +1907 + +3638 +4328 +4562 +3285 +3200 +5909 +2542 +5197 +5104 +3570 +4323 + +1631 +2406 +2788 +1838 +4639 +2469 +6718 +3731 +2375 +4325 +3952 +1012 +1076 + +10733 +9085 +5074 +9984 +9990 +10107 +9274 +10464 + +13249 +10020 +4881 +12806 +11865 + +9852 +6248 +4916 +7066 +5297 +5475 +6530 +10364 + +2415 +5519 +2200 +3556 +5815 +2426 +6180 +2142 +6627 +7369 +6353 +4170 + +5507 +15832 +15699 +10635 +7997 + +1742 +4641 +4628 +4867 +8860 +1133 +3575 +7128 +8774 + +2808 +6117 +3760 +1327 +1224 +4959 +5456 +2801 +5944 +1961 +1194 +3734 +2937 +3793 +1888 + +21943 +35720 + +6563 +5000 +1710 +4021 +3273 +6155 +3198 +3661 +6309 +2331 +1631 +5646 +5734 + +9646 +3457 +8620 +5965 +3440 +6433 +1753 +9062 +8301 + +9192 +3284 +9181 +8566 +3759 +10184 +8911 +6998 + +19491 +10283 +13574 +12306 + +2916 +9083 +13398 +13239 +4749 +12853 + +7223 +3154 +2911 +7004 +3110 +3584 +6619 +5960 +8429 + +5878 +4929 +4709 +4932 +3023 +1011 +2193 +4264 +5282 +1657 +4360 +6109 +5031 +3785 +5017 + +16065 +2923 +11281 + +7340 +3319 +5766 +1660 +7947 +7012 +2739 +1395 +8273 + +3887 +5538 +4771 +3770 +1504 +2681 +4066 +3406 +3487 +3098 +3611 +6234 +3449 + +12281 +11291 +11367 +10405 +4223 + +17411 +8453 + +36173 + +3431 +3627 +4047 +2512 +6628 +1229 +4812 +3961 +2389 +4747 +1799 +4291 + +2176 +7287 +6468 +3056 +9632 +1027 +3251 +1517 +1853 + +4727 +2417 +4544 +5949 +4289 +2237 +2861 +4284 +6912 +2843 +5773 +4423 + +3093 +6501 +1259 +4975 +4357 +2940 +2435 +2939 +1772 +3876 +5008 +2909 +5641 +5710 + +4559 +6522 +5781 +1343 +2062 +2392 +1852 +5135 +7668 +7240 +3028 + +11607 +9525 +7332 +11307 + +4941 +5277 +2311 +5738 +3029 +2709 +5448 +1724 +2982 +1082 +1515 +1854 +4762 +4514 +2015 + +51097 + +2814 +5593 +6576 +10591 +4809 +4469 +3790 +8186 + +7656 +10163 +19430 + +1928 +5626 +3418 +6785 +2781 +3549 +2884 +6656 +6210 +4950 +3598 +2669 +5185 + +8768 +5221 +7404 +9630 +3371 +9450 +1837 +3100 +4494 + +3987 +3179 +2415 +2074 +1172 +3192 +5874 +5869 +4404 +5842 +1987 +2526 +4094 + +5792 +6056 +1689 +5643 +4068 +2259 +1461 +1764 +3453 +2344 +6118 +5844 +2014 +1184 + +13505 +8242 +1358 +3817 +12030 +11105 + +7333 +9427 +10385 +3458 +6340 +10804 + +3152 +1364 +3371 +6000 +3032 +3326 +4046 +1890 +4321 +3986 +3309 +4021 +1683 +2198 +2003 + +2592 +8354 +13452 +12440 +7966 + +1593 +1143 +6246 +4105 +6164 +6425 +3904 +1143 +5966 +3100 +5215 +4256 +2090 +3413 + +4382 +6229 +2368 +1780 +5658 +1452 +6359 +1802 +3800 +6433 +3866 +3038 +4699 +4137 + +5395 +2426 +5621 +9156 +6250 +9008 +2966 +3226 +6709 + +5387 +7267 +6067 +6468 +5833 +5241 +7204 +1419 +6037 +5938 + +2390 +4300 +4787 +3656 +5976 +1879 +3964 +3314 +3076 +5158 +5612 +2846 +5231 + +2205 +3652 +5211 +1711 +2113 +5988 +1310 +5333 +2253 +2897 +5234 +3809 +3640 +2995 +2197 + +6695 +5930 +6118 +5463 +3750 +2440 +7006 +4073 +5663 +1369 +2721 +1961 + +5270 +4851 +5199 +1976 +4128 +5527 +2998 +1567 +6398 +4163 +1484 +6077 +3035 +3860 + +6698 +3081 +6805 + +13122 +4106 +6919 +6595 + +1608 +7971 +10279 +7856 +3503 + +7405 +6658 +3512 +3913 +6137 +2617 +2776 +8255 +7034 + +8368 +5163 +6566 +5481 +4059 +10560 + +5801 +5394 +2081 +2927 +1775 +1635 +1180 +5834 +7652 +2365 +6525 + +7192 +13806 +12580 +6935 +3136 +7820 + +2371 +7237 +5197 +1561 +2418 +1742 +5540 +7836 +1613 +4012 + +45767 + +6825 +6014 +7571 +3393 +2050 +8230 +4178 +5378 +4878 +5446 + +1412 +2156 +4877 +5604 +3149 +7585 +7922 +6811 +6971 +4493 + +12948 +32336 + +2512 +13073 +12030 +12851 +8951 + +3070 +10259 +2650 +6091 +5889 +4857 + +5483 +6813 +4208 +4999 +3708 +1955 +8588 +5416 +6235 +7920 + +2521 +7180 +7558 + +8285 +2208 +6058 +2839 +9653 +8078 +5862 +5711 +4847 + +3792 +1778 +3755 +13541 +12325 +9599 + +7431 +2814 +3828 +2468 +5499 +6822 +5190 +7279 +7939 +8488 + +5469 +3086 +8098 +12450 + +3182 +4307 +4150 +2802 +3857 +5331 +1045 +1111 +3983 +2606 +1077 + +3219 +2931 +4166 +2250 +5225 +1704 +3895 +6286 +1394 +5564 +1498 +3343 +5912 +2884 + +3874 +5309 +2941 +2109 +5322 +2994 +3922 +7538 +4666 +6223 +4754 + +4409 +6975 +8829 +4301 +1730 +2092 +2385 +1288 +9627 + +8849 +7371 +3259 +8823 +8963 +3901 +7003 +2250 +7492 + +7619 +16991 +7511 +5747 + +6361 +2401 +6509 +3429 +1276 +5120 +1852 +1706 +2373 +6117 +1967 +4655 +6193 + +3186 +10336 +12548 +7692 +1422 +7148 + +8898 +15230 +7468 +2349 +7214 + +18114 +7557 +10634 + +6755 +1045 +7326 +6511 +1691 +4966 +7367 +3305 +7083 +3105 +4262 + +6806 +8767 +6339 +4159 +11619 +8959 +10729 + +9070 +9027 +8532 + +2493 +1949 +5519 + +4637 +5893 +6617 +2710 +4712 +3514 +2828 +5131 +4756 +4772 +2488 +2540 +6593 + +4500 +9306 +3847 +8792 +4766 +10598 +5259 +1837 + +7936 +7125 +5091 + +4087 +6428 +3093 +5529 +2092 +5734 +1532 +1615 +5175 +4149 +6050 +2863 + +10505 +11702 +13870 +6381 + +12380 +6172 +16863 +9492 + +2406 +7906 +1139 +6866 +3963 +8280 +3315 +1645 +7885 +8315 + +2744 +10964 +9192 +6889 +11554 +4587 +5537 + +27485 +2819 + +67997 + +6372 +1910 +7440 +9638 +5161 +9354 +1063 +7999 +2712 + +6375 +6398 +2185 +11875 +1458 +11978 +9621 + +7326 +6319 +4988 +5326 +7844 +3876 +7311 +1920 +2865 +7959 +6890 + +5086 +3457 +3398 +6534 +5661 +1592 +4249 +1477 +3174 +3134 +6130 +2097 +5922 + +1854 +7848 +10289 +9261 +9692 +4814 +7798 +2634 + +13448 +10236 +11977 +4645 +12188 +11118 + +1681 +2162 +7349 +3198 +5725 +1151 +4940 +3481 +5896 +7245 +7424 +5630 + +3626 +3856 +4655 +1412 +2466 +5810 +4395 +1762 +4465 +3614 +3439 +6441 +4400 + +5037 +2450 +1870 +2191 +2145 +9754 +4259 +5762 + +9373 +3564 +7177 +1445 +8672 +4098 +6468 +1394 + +1675 +6754 +1996 +5894 +6449 +4644 +5642 +1338 +1087 +4989 +2467 +1192 +6368 + +34156 +12437 + +4394 +5648 +7691 +5598 +5720 +6414 +10089 +2116 + +9460 +2078 +7811 +13011 +5597 +1628 + +3772 +1201 +1174 +5884 +3720 +1120 +3830 +5809 +6269 +2548 +3212 +1924 +3951 +5178 + +1543 +7155 +5204 +7480 +9747 + +4029 +10517 +6776 +6978 +3517 +5746 +7683 +5939 + +5484 +1669 +1250 +3036 +3822 +5246 +1648 +5676 +1591 +1624 +3525 +4862 +2834 +5814 +4006 + +9610 +10230 +1473 +8541 +2163 +4706 +6919 +10514 + +46165 + +4618 +4867 +3750 +4578 +5498 +3468 +2663 +3003 +2777 +4434 +7386 + +18475 +5479 +15616 + +4810 +6199 +5905 +7014 +3903 +2404 +6955 +1290 +6328 +4729 +1567 +2070 + +1426 +6652 +7274 +3535 +1873 +8830 +6465 +3091 + +11667 +1824 +1749 + +6031 +1589 +6764 +5294 +2658 +7540 +2285 +5290 +3052 +4809 + +9275 +3219 +9205 +9367 +6695 +1620 +1418 +9589 +6985 + +4961 +1893 +4204 +4158 +2488 +6562 +6862 +7443 +5180 +6382 +5930 +2819 + +9225 +17113 +2562 +11634 + +9490 +5720 +2413 +13607 +12761 +4473 + +10788 +18449 +9511 + +11498 +3288 +9304 +4951 +10878 + +13888 +23233 +18690 + +5112 +9811 +9336 +4030 +11021 +3585 +1534 + +6026 +5618 +3065 +2909 +8887 +8052 +3524 +7783 +5793 + +3573 +5391 +1887 +6295 +3311 +8235 +3985 +2222 +2594 + +2807 +3623 +2622 +6466 +2272 +2181 +5550 +4568 +1172 +2579 +1020 +5542 +2653 +1080 + +4874 +10296 +5421 + +3743 +5053 +5510 +1401 +4173 +7968 +5999 +6482 +7019 +7916 +3752 + +8718 +7969 +6072 +3223 +5924 +2642 +8274 +1985 +3342 +2036 + +1706 +8655 +3521 +7502 +7955 + +1915 +5083 +1668 +11457 +2011 +9998 +9885 + +10592 +25078 +17582 + +2596 +2198 +8811 +7464 +5711 +7197 +8744 +5382 +6179 +3769 + +3713 +6012 +7951 +10750 +5580 +3426 +11019 + +5536 +7943 +5163 +7703 +14144 + +3169 +5475 +2367 +3666 +6042 +4279 +1699 +3129 +3294 +1813 +6465 +3591 +3332 +2155 + +1305 +9537 +9805 +2172 +8665 +8386 +7718 +10709 + +4645 +6242 +8462 +6619 +3165 +7797 +5664 +5058 +1339 +3749 + +3365 +5018 +3278 +3403 +4138 +4521 +1797 +3791 +1401 +3748 +6039 +1513 +2696 diff --git a/ressources/day01-input-test b/ressources/day01-input-test new file mode 100644 index 0000000..2094f91 --- /dev/null +++ b/ressources/day01-input-test @@ -0,0 +1,14 @@ +1000 +2000 +3000 + +4000 + +5000 +6000 + +7000 +8000 +9000 + +10000 diff --git a/src/Day1.hs b/src/Day1.hs new file mode 100644 index 0000000..dbb89d6 --- /dev/null +++ b/src/Day1.hs @@ -0,0 +1,39 @@ +module Day1 ( + day1, + findElfWithHighestCalorieCount, + findCaloriesOfTop3Elves +) where + +import qualified Data.Text as T +import Day1.Internal + +day1 :: IO () +day1 = do + putStrLn "Day1" + calorieCount <- day1_1 + putStrLn ("Highest calorie count = " ++ calorieCount) + caloriesOfTop3Elves <- day1_2 + putStrLn ("Calories of top 3 elves = " ++ caloriesOfTop3Elves) + putStrLn "-----------" + + +day1_1 :: IO String +day1_1 = do + input <- readFile "ressources/day01-input" + return (show $ findElfWithHighestCalorieCount $ T.pack input) + +day1_2 :: IO String +day1_2 = do + input <- readFile "ressources/day01-input" + return (show $ findCaloriesOfTop3Elves $ T.pack input) + + +findCaloriesOfTop3Elves :: T.Text -> CalorieCount +findCaloriesOfTop3Elves = + calories . sumCalories . take 3 . sortElves . elfToCalories + where + sumCalories :: [Elf] -> Int + sumCalories = sum . map caloriesOf + +findElfWithHighestCalorieCount :: T.Text -> Elf +findElfWithHighestCalorieCount = head .sortElves . elfToCalories diff --git a/src/Day1/Internal.hs b/src/Day1/Internal.hs new file mode 100644 index 0000000..33d9846 --- /dev/null +++ b/src/Day1/Internal.hs @@ -0,0 +1,66 @@ +{-# LANGUAGE OverloadedStrings #-} +module Day1.Internal ( + elfToCalories, + Elf, + CalorieCount, + calories, + elf, + parseElfGroups, + intOrZero, + sortElves, + caloriesOf +) where + +import qualified Data.Text as T +import qualified Data.Text.Read as R +import Data.List.Split +import qualified Data.List as L +import Data.Either + +newtype CalorieCount = CalorieCount Int +newtype Elf = Elf CalorieCount + +instance Show CalorieCount where + show (CalorieCount c) = "Calories[" ++ show c ++ "]" + +instance Show Elf where + show (Elf (CalorieCount c)) = "Elf[" ++ show c ++ "]" + +instance Eq CalorieCount where + (==) (CalorieCount c1) (CalorieCount c2) = c1 == c2 + +instance Eq Elf where + (==) (Elf (CalorieCount c1)) (Elf (CalorieCount c2)) = c1 == c2 + +instance Ord Elf where + compare (Elf (CalorieCount c1)) (Elf (CalorieCount c2)) = compare c1 c2 + +elf :: Int -> Elf +elf c = Elf (CalorieCount c) + +calories :: Int -> CalorieCount +calories = CalorieCount + +caloriesOf :: Elf -> Int +caloriesOf (Elf (CalorieCount c)) = c + +sortElves :: [Elf] -> [Elf] +sortElves = L.reverse . L.sort + +elfToCalories :: T.Text -> [Elf] +elfToCalories input = map elf sums + where + groups = parseElfGroups input + sums = map sum groups + +parseElfGroups :: T.Text -> [[Int]] +parseElfGroups input = map (map intOrZero) groups + where + groups = splitWhen (== "") $ T.lines input + + +intOrZero:: T.Text -> Int +intOrZero text = val + where + (val, _) = fromRight (0, "") $ R.decimal text + diff --git a/src/Lib.hs b/src/Lib.hs new file mode 100644 index 0000000..dce638b --- /dev/null +++ b/src/Lib.hs @@ -0,0 +1,9 @@ +module Lib + ( someFunc + ) where + +import Day1 + +someFunc :: IO () +someFunc = day1 + diff --git a/stack.yaml b/stack.yaml new file mode 100644 index 0000000..1e9b68a --- /dev/null +++ b/stack.yaml @@ -0,0 +1,67 @@ +# This file was automatically generated by 'stack init' +# +# Some commonly used options have been documented as comments in this file. +# For advanced use and comprehensive documentation of the format, please see: +# https://docs.haskellstack.org/en/stable/yaml_configuration/ + +# Resolver to choose a 'specific' stackage snapshot or a compiler version. +# A snapshot resolver dictates the compiler version and the set of packages +# to be used for project dependencies. For example: +# +# resolver: lts-3.5 +# resolver: nightly-2015-09-21 +# resolver: ghc-7.10.2 +# +# The location of a snapshot can be provided as a file or url. Stack assumes +# a snapshot provided as a file might change, whereas a url resource does not. +# +# resolver: ./custom-snapshot.yaml +# resolver: https://example.com/snapshots/2018-01-01.yaml +resolver: + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/20/2.yaml + +# User packages to be built. +# Various formats can be used as shown in the example below. +# +# packages: +# - some-directory +# - https://example.com/foo/bar/baz-0.0.2.tar.gz +# subdirs: +# - auto-update +# - wai +packages: +- . +# Dependency packages to be pulled from upstream that are not in the resolver. +# These entries can reference officially published versions as well as +# forks / in-progress versions pinned to a git hash. For example: +# +# extra-deps: +# - acme-missiles-0.3 +# - git: https://github.com/commercialhaskell/stack.git +# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a +# +# extra-deps: [] + +# Override default flag values for local packages and extra-deps +# flags: {} + +# Extra package databases containing global packages +# extra-package-dbs: [] + +# Control whether we use the GHC we find on the path +# system-ghc: true +# +# Require a specific version of stack, using version ranges +# require-stack-version: -any # Default +# require-stack-version: ">=2.9" +# +# Override the architecture used by stack, especially useful on Windows +# arch: i386 +# arch: x86_64 +# +# Extra directories used by stack for building +# extra-include-dirs: [/path/to/dir] +# extra-lib-dirs: [/path/to/dir] +# +# Allow a newer minor version of GHC than the snapshot specifies +# compiler-check: newer-minor diff --git a/stack.yaml.lock b/stack.yaml.lock new file mode 100644 index 0000000..d4efa5f --- /dev/null +++ b/stack.yaml.lock @@ -0,0 +1,13 @@ +# This file was autogenerated by Stack. +# You should not edit this file by hand. +# For more information, please see the documentation at: +# https://docs.haskellstack.org/en/stable/lock_files + +packages: [] +snapshots: +- completed: + sha256: fc39d8afc97531d53d87b10abdef593bce503c0c1e46c2e9a84ebcbc78bf8470 + size: 648432 + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/20/2.yaml + original: + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/20/2.yaml diff --git a/test/Spec.hs b/test/Spec.hs new file mode 100644 index 0000000..9e21a77 --- /dev/null +++ b/test/Spec.hs @@ -0,0 +1,25 @@ +{-# LANGUAGE OverloadedStrings #-} +import Test.Hspec +import Day1 +import Day1.Internal +import qualified Data.Text as T + +main :: IO () +main = hspec $ do + describe "Day1" $ do + it "sorts elves" $ do + let input = [ elf 6000, elf 4000, elf 11000] + sortElves input `shouldBe` [ elf 11000, elf 6000, elf 4000] + it "converts a list of strings to a list of either int or caloriecount" $ do + input <- readFile "ressources/day01-input-test" + elfToCalories (T.pack input) `shouldBe` + [ elf 6000, elf 4000, elf 11000, elf 24000, elf 10000 ] + it "parser text to int" $ do + intOrZero "1000" `shouldBe` 1000 + it "finds the elf with the highest calorie count" $ do + input <- readFile "ressources/day01-input-test" + findElfWithHighestCalorieCount (T.pack input) `shouldBe` elf 24000 + it "sums the calorie counts" $ do + input <- readFile "ressources/day01-input-test" + findCaloriesOfTop3Elves (T.pack input) `shouldBe` calories 45000 +