{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "{-# LANGUAGE NegativeLiterals #-}\n", "{-# LANGUAGE FlexibleContexts #-}" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "import Text.Parsec \n", "import Text.ParserCombinators.Parsec.Number" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "sFile = sLine `sepEndBy` newline \n", "sLine = int `sepBy` onlySpaces" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "onlySpaces = many (oneOf \" \\t\")" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "parseFile :: String -> Either ParseError [[Int]]\n", "parseFile input = parse sFile \"(unknown)\" input\n", "\n", "parseLine :: String -> Either ParseError [Int]\n", "parseLine input = parse sLine \"(unknown)\" input\n", "\n", "successfulParse :: Either ParseError [a] -> [a]\n", "successfulParse (Left _) = []\n", "successfulParse (Right a) = a" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [], "source": [ "main :: IO ()\n", "main = do \n", " text <- readFile \"../../data/advent02.txt\"\n", " let sheet = successfulParse $ parseFile text\n", "-- print sheet\n", " print $ part1 sheet\n", " print $ part2 sheet" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "39126\n", "258" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "main" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Right [179,2358,5197,867,163,4418,3135,5049,187,166,4682,5080,5541,172,4294,1397]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "parseLine \"179 2358 5197 867 163 4418 3135 5049 187 166 4682 5080 5541 172 4294 1397\"" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Right [[1,2],[8,9]]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "parseFile \"1 2\\n8 9\"" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[[1,2],[8,9]]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "successfulParse $ parseFile \"1 2\\n8 9\"" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "cSum :: [Int] -> Int\n", "cSum row = (maximum row) - (minimum row)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "check :: [[Int]] -> Int\n", "check = sum . (map cSum)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "check $ successfulParse $ parseFile \"1 2\\n8 9\"" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "part1 = check" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(2,1),(3,1),(4,1),(4,2)]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "digits = [1,2,3,4]\n", "[(a, b) | a <- digits, b <- digits, a /= b, a `mod` b == 0]" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(1,1),(2,2),(3,3),(4,4)]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "zip digits digits" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[179,2358,5197,867,163,4418,3135,5049,187,166,4682,5080,5541,172,4294,1397]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "Right digits = parseLine \"179 2358 5197 867 163 4418 3135 5049 187 166 4682 5080 5541 172 4294 1397\"\n", "digits" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "27" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sum [a `div` b | a <- digits, b <- digits, a /= b, a `mod` b == 0]" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "p2cSum digits = sum [a `div` b | a <- digits, b <- digits, a /= b, a `mod` b == 0]" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [], "source": [ "part2 = sum . map p2cSum" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Haskell", "language": "haskell", "name": "haskell" }, "language_info": { "codemirror_mode": "ihaskell", "file_extension": ".hs", "name": "haskell", "version": "8.0.2" } }, "nbformat": 4, "nbformat_minor": 2 }