112 lines
2.8 KiB
Text
112 lines
2.8 KiB
Text
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"puzzle <- readFile \"04.txt\"\n",
|
|
"plines = lines puzzle\n",
|
|
"\n",
|
|
"int x = read x :: Int"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Day 04"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Puzzle 1"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"200"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"import qualified Data.Map as Map\n",
|
|
"import Data.List.Split\n",
|
|
"\n",
|
|
"valid fields = all (`Map.member` fields) [\"byr\",\"iyr\",\"eyr\",\"hgt\",\"hcl\",\"ecl\",\"pid\"]\n",
|
|
"length $ filter valid [Map.fromList . map ((\\[a,b]->(a,b)) . splitOn \":\") $ concatMap words $ lines pp | pp <- splitOn \"\\n\\n\" puzzle]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Puzzle 2"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"116"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"import qualified Data.Map as Map\n",
|
|
"import Data.List.Split\n",
|
|
"import Data.Maybe\n",
|
|
"\n",
|
|
"checkField fields (f, k) = k `Map.member` fields && f (fromMaybe \"\" $ Map.lookup k fields)\n",
|
|
"valid fields = all (checkField fields) [\n",
|
|
" (\\x -> 1920 <= int x && int x <= 2002, \"byr\"),\n",
|
|
" (\\x -> 2010 <= int x && int x <= 2020, \"iyr\"),\n",
|
|
" (\\x -> 2020 <= int x && int x <= 2030, \"eyr\"),\n",
|
|
" (\\x -> case head (reads x :: [(Int, String)]) of (h,\"cm\") -> 150 <= h && h <= 193\n",
|
|
" (h,\"in\") -> 59 <= h && h <= 76\n",
|
|
" _ -> False, \"hgt\"),\n",
|
|
" (\\x -> head x == '#' && all (`elem` \"0123456789abcdef\") (tail x), \"hcl\"),\n",
|
|
" ((`elem` words \"amb blu brn gry grn hzl oth\"), \"ecl\"),\n",
|
|
" (\\x -> length x == 9, \"pid\")\n",
|
|
" ]\n",
|
|
"length $ filter valid [Map.fromList . map ((\\[a,b]->(a,b)) . splitOn \":\") $ concatMap words $ lines pp | pp <- splitOn \"\\n\\n\" puzzle]"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Haskell",
|
|
"language": "haskell",
|
|
"name": "haskell"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": "Haskell",
|
|
"file_extension": ".hs",
|
|
"mimetype": "text/x-haskell",
|
|
"name": "haskell",
|
|
"pygments_lexer": "Haskell",
|
|
"version": "8.8.4"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 4
|
|
}
|