Advent of Code 2021
Objective: Get better at Haskell, and at functional programming in general. Picks up from Haskell learnings in Project Euler 021 and Project Euler 022 .
The source code is available on Github .
Dated Feb 18, 2022; last modified on Fri, 18 Feb 2022
Objective: Get better at Haskell, and at functional programming in general. Picks up from Haskell learnings in Project Euler 021 and Project Euler 022 .
The source code is available on Github .
Random Link ¯\_(ツ)_/¯ | ||
Feb 19, 2022 | » | Learning Haskell via AoC 2021
17 min; updated Feb 19, 2022
This page contains remarks on Haskell that I encountered when working with source files that span multiple AoC 2021 problems. and have Haskell solutions. It’ll be nice to compare how they solved the problems. I don’t want to end up perfecting the wrong approach! Setting Up Haskell Env for AoC To manage dependencies, Cabal and Stack are pretty popular. Stack incorporates the Cabal build system.... |
Feb 18, 2022 | » | AoC 2021 Day 01: Sonar Sweep
6 min; updated Feb 18, 2022
Day 1 - Advent of Code 2021: Sonar Sweep. adventofcode.com . Accessed Feb 18, 2022. Part One As the submarine drops below the surface of the ocean, it automatically performs a sonar sweep of the nearby sea floor. On a small screen, the sonar weep report (your puzzle input) appears: each line is a measurement of the sea floor depth as the sweep looks further and further away from the submarine.... |
Feb 19, 2022 | » | AoC 2021 Day 02: Dive!
12 min; updated Feb 19, 2022
Day 2 - Advent of Code 2021. adventofcode.com . Accessed Feb 19, 2022. Problem Statement Part One Now, you need to figure out how to pilot this thing. It seems like the submarine can take a series of commands like forward 1, down 2, or up 3: forward X increases the horizontal position by X units. down X increases the depth by X units. up X decreases the depth by X units.... |
Feb 23, 2022 | » | AoC 2021 Day 03: Binary Diagnostic
14 min; updated Feb 23, 2022
Day 3 - Advent of Code 2021. adventofcode.com . Accessed Feb 23, 2022. Problem Description Part One The submarine has been making some odd creaking noises, so you ask it to produce a diagnostic report just in case. The diagnostic report (your puzzle input) consists of a list of binary numbers which, when decoded properly, can tell you many useful things about the conditions of the submarine.... |
Feb 25, 2022 | » | AoC 2021 Day 04: Giant Squid
6 min; updated Feb 25, 2022
Day 4 - Advent of Code 2021. adventofcode.com . Accessed Feb 25, 2022. Part One You’re already almost 1.5km (almost a mile) below the surface of the ocean, already so deep that you can’t see any sunlight. What you can see, however, is a giant squid that has attached itself to the outside of your submarine. Maybe it wants to play bingo ?... |
Feb 27, 2022 | » | AoC 2021 Day 05: Hydrothermal Venture
4 min; updated Feb 27, 2022
Problem Statement Part One You come across a field of hydrothermal vents on the ocean floor! These vents constantly produce large, opaque clouds, so it would be best to avoid them if possible. They tend to form in lines; the submarine hopefully produces a list of nearby lines of vents (your puzzle input) for you to review. Each line of vents is given as a line segment in the format (x1, y1 -> x2, y2), where x1,y1 are the coordinates of one end of the line segment, and x2,y2 are the coordinates of the other end.... |
Mar 1, 2022 | » | AoC 2021 Day 06: Lanternfish
12 min; updated Mar 1, 2022
Day 6 - Advent of Code 2021. adventofcode.com . Accessed Mar 2, 2022. Part I Description The sea floor is getting steeper. Maybe the sleigh keys got carried this way? A massive school of glowing lanternfish swims past. They must spawn quickly to reach such large numbers - maybe exponentially quickly? You should model their growth to be sure. Although you know nothing about this specific species of lanternfish, you make some guesses about their attributes.... |
Mar 5, 2022 | » | AoC 2021 Day 07: The Treachery of Whales
7 min; updated Mar 5, 2022
Day 7 - Advent of Code 2021. adventofcode.com . Accessed Mar 5, 2022. Part I Description A giant whale has decided that your submarine is its next meal, and it’s much faster than you are. There’s nowhere to run! Suddenly, a swarm of crabs (each in its own tiny submarine - it’s too deep for them otherwise) zooms in to rescue you! They seem to be preparing to blast a hole in the ocean floor; sensors indicate a massive underground cave system just beyond where they’re aiming!... |
Mar 7, 2022 | » | AoC 2021 Day 08: Seven Segment Search
15 min; updated Mar 7, 2022
Day 8 - Advent of Code 2021. adventofcode.com . Accessed Mar 7, 2022. Part I Description You barely reach the safety of the cave when the whale smashes into the cave mouth, collapsing it. Sensors indicate another exit to this cave at a much greater depth, so you have no choice but to press on. As your submarine slowly makes its way through the cave system, you notice that the four-digit seven-segment displays in your submarine are malfunctioning; they must have been damaged during the escape.... |
Mar 16, 2022 | » | AoC 2021 Day 09: Smoke Basin
13 min; updated Mar 16, 2022
Multi-dimensional arrays using |
Apr 12, 2022 | » | AoC 2021 Day 10: Syntax Scoring
2 min; updated Apr 12, 2022
Day 10 - Advent of Code 2021. adventofcode.com . Accessed Apr 12, 2022. Part I You ask the submarine to determine the best route out of the deep-sea cave, but it only replies: Syntax error in navigation subsystem on line: all of them The navigation subsystem is made of several lines containing chunks. There are one or more chunks on each line, and chunks contain zero or more other chunks.... |
Mar 7, 2022 | » | AoC 2021 Input Parser
8 min; updated Mar 7, 2022
{-# OPTIONS_GHC -Wall #-} -- {-# LANGUAGE FlexibleContexts #-} -- The `(..)` syntax represents all of the constructors for the data type. [1] -- Without that export, we can pattern-match in BinaryDiagnostic.hs because we -- run into a "Not in scope: data constructor ‘BinaryDiagnostics’" error. -- -- [1]: https://stackoverflow.com/a/34548070/7812406 module AoC2021InputParser ( parseBinaryDiagnosticInput, parseBingoInput, parseHydrothermalVents, parseLanternfishInternalTimers, parseHorizontalCrabPositions, parseSevenSegmentsDisplay, parseHeightMap, ) where import BinaryDiagnostic.BinaryDiagnostic (BinaryDiagnostics (..), diagNums, diagWidth) import Control.DeepSeq (($!!)) import Data.... |
Apr 11, 2022 | » | AoC 2021 Main
1 min; updated Apr 11, 2022
module Main where import qualified AoC2021 (runSolution) import AoC2021Args (Args(..), aocArgParser) import Options.Applicative main :: IO () main = runAoCSolutions =<< execParser opts where opts = info (aocArgParser <**> helper) ( fullDesc <> progDesc "Run solutions for a given DAY of AoC 2021" <> header "A module for running solutions for AoC 2021") runAoCSolutions :: Args -> IO () runAoCSolutions (Args d) = AoC2021.runSolution d |
Apr 11, 2022 | » | AoC 2021 Solution Runner
4 min; updated Apr 11, 2022
{-# OPTIONS_GHC -Wall #-} module AoC2021 (runSolution) where -- https://cabal.readthedocs.io/en/3.4/cabal-package.html#accessing-data-files-from-package-code import AoC2021InputParser ( parseBinaryDiagnosticInput, parseBingoInput, parseHydrothermalVents, parseLanternfishInternalTimers, parseHorizontalCrabPositions, parseSevenSegmentsDisplay, parseHeightMap ) import BinaryDiagnostic.BinaryDiagnostic (lifeSupportRating, powerConsumption) import Data.String (IsString (fromString)) import Dive.Dive (productOfFinalPosition, productOfFinalPositionWithNewIntepretation) import GiantSquid (scoreOfFirstWinningBoard, scoreOfLastWinningBoard) import HydrothermalVenture.HydrothermalVenture ( pointsWithAtLeastTwoRightSegmentOverlaps, pointsWithAtLeastTwoSegmentOverlaps, ) import qualified AoC2021.Lanternfish (numOfFishIn80Days, numOfFishIn256Days) import qualified AoC2021.TreacheryOfWhales as TreacheryOfWhales ( minFuelForAlignmentWithConstantBurnRate, minFuelForAlignmentWithIncreasingBurnRate ) import Paths_advent_of_code_y2021 (getDataFileName) import SonarSweep ( num3MeasurementIncreases, numIncreases ) import System.IO (IOMode (ReadMode), hGetContents, withFile) import qualified AoC2021.... |
Apr 11, 2022 | » | AoC 2021 Test Code
4 min; updated Apr 11, 2022
module Main (main) where import AoC2021InputParser ( parseBinaryDiagnosticInput, parseBingoInput, parseHydrothermalVents, parseLanternfishInternalTimers, parseHorizontalCrabPositions, parseSevenSegmentsDisplay, parseHeightMap ) import BinaryDiagnostic.BinaryDiagnostic (lifeSupportRating, powerConsumption) import Data.String (IsString (fromString)) import Dive.Dive (productOfFinalPosition, productOfFinalPositionWithNewIntepretation) import GiantSquid (scoreOfFirstWinningBoard, scoreOfLastWinningBoard) import HydrothermalVenture.HydrothermalVenture ( pointsWithAtLeastTwoRightSegmentOverlaps, pointsWithAtLeastTwoSegmentOverlaps, ) import qualified AoC2021.Lanternfish (numOfFishIn80Days, numOfFishIn256Days) import qualified AoC2021.TreacheryOfWhales as TreacheryOfWhales ( minFuelForAlignmentWithConstantBurnRate, minFuelForAlignmentWithIncreasingBurnRate ) import qualified AoC2021.SevenSegmentSearch as SevenSegmentSearch (numOf1478AppearancesInOutput, sumOfOutputValues) import qualified AoC2021.SmokeBasin as SmokeBasin ( sumOfRiskLevelsOfLowPoints, productOf3LargestBasins ) import Paths_advent_of_code_y2021 (getDataFileName) import SonarSweep ( num3MeasurementIncreases, numIncreases ) import System.... |
Apr 11, 2022 | » | AoC 2021 Parsing Arguments
2 min; updated Apr 11, 2022
Parsing the Command Line lists a couple of libraries. and are the most popular options. Going with as it’s slightly more popular. {-# OPTIONS_GHC -Wall #-} module AoC2021Args (Args(..), aocArgParser) where import Options.Applicative import Data.Semigroup ((<>)) data Args = Args { day :: Int } aocArgParser :: Parser Args aocArgParser = Args <$> option auto ( long "day" <> help "The day to run code for. Use '0' to run all of the solutions.... |