{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "{-# LANGUAGE NegativeLiterals #-}\n", "{-# LANGUAGE FlexibleContexts #-}" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [], "source": [ "import Data.List.Split (splitOn, chunksOf)\n", "import Data.Char (ord, chr)\n", "import Data.Bits\n", "import Numeric (showHex)\n", "import Text.Printf" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "extract items from len = take len $ drop from $ items ++ items" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "-- replace original replacement from \n", "-- | from + length replacement <= length original = replacement ++ drop (length replacement) original\n", "-- | otherwise = drop (length original) extended ++ \n", "-- where extended = take from original ++ replacement ++ drop suflen original\n", "-- suflen = from + length replacement - length original " ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "replace original replacement from = take (length original) (start ++ replacement ++ remainder)\n", " where excess = drop (length original - from) replacement\n", " stub = drop (length excess) original\n", " start = take from (excess ++ stub)\n", " remainder = drop (length $ start ++ replacement) original " ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0,1,2]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "extract [0, 1, 2, 3, 4] 0 3" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[2,1,0]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "reverse [0,1,2]" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "l0 = [0,1,2,3,4]" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[2,1,0,3,4]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "replace l0 (reverse $ extract l0 0 3) 0" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[4,0,1]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "extract l0 4 3" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0,4,2,3,1]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "replace l0 (reverse $ extract l0 4 3) 4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "0 1 2 3 4\n", "0 1 2 3 [4]\n", "0 1) 2 3 ([4]\n", "0 4) 2 3 (1\n", "\n", "0 1 2 3 4 | 0 1 2 3 4\n", "0 1 2 3 [4] | 0 1 2 3 4\n", "0 1 2 3 ([4] | 0 1) 2 3 4\n", "0 1 2 3 ( 1 | 0 4) 2 3 4\n", "\n", "\n", " 0 1 2 3 4 | 0 1 2 3 4\n", " [0] 1 2 3 4 | 0 1 2 3 4\n", "([0] 1 2) 3 4 | 0 1 2 3 4\n", "( 2 1 0) 3 4 | 0 1 2 3 4" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "tie original start len = replace original replacement start\n", " where replacement = reverse $ extract original start len" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Redundant bracket
Found:
(start + len + skip) `mod` (length original)
Why Not:
(start + len + skip) `mod` length original
" ], "text/plain": [ "Line 3: Redundant bracket\n", "Found:\n", "(start + len + skip) `mod` (length original)\n", "Why not:\n", "(start + len + skip) `mod` length original" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "step (original, start, skip) len = (replaced, start', skip + 1)\n", " where replaced = tie original start len\n", " start' = (start + len + skip) `mod` (length original)" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0,1,2,3,4]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "[0..4]" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "([2,1,0,3,4],3,1)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "step ([0..4], 0, 0) 3" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "([3,4,2,1,0],4,4)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "foldl step ([0..4], 0, 0) [3, 4, 1, 5]" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [], "source": [ "part1 :: [Int] -> Int\n", "part1 lengths = (tied!!0) * (tied!!1)\n", " where (tied, _, _) = foldl step ([0..255], 0, 0) lengths" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [], "source": [ "part2 text = tied\n", " where lengths = p2lengths text\n", " (tied, _, _) = foldl step ([0..255], 0, 0) lengths" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [], "source": [ "main :: IO ()\n", "main = do \n", " text <- readFile \"../../data/advent10.txt\"\n", " let instrs = map read $ splitOn \",\" text\n", " print $ part1 instrs\n", " print $ part2 text" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "38415\n", "[166,221,219,74,89,118,226,182,77,185,188,87,238,181,229,173,45,68,84,147,10,194,196,201,55,80,171,119,186,54,154,46,52,161,9,149,135,255,180,210,129,214,127,18,51,236,56,78,24,187,97,25,131,70,143,106,211,218,189,224,179,220,41,141,240,233,76,26,253,207,159,172,86,241,136,215,12,197,112,62,23,138,0,169,99,50,235,205,122,103,116,71,251,160,206,22,4,202,252,40,234,242,193,39,32,191,63,217,152,117,33,163,61,213,164,133,6,16,110,58,102,43,126,67,31,30,95,199,2,183,1,208,239,96,20,13,57,66,38,132,177,195,44,203,247,65,14,227,100,82,151,3,28,150,98,146,140,37,42,120,168,91,83,27,209,148,176,250,101,162,145,79,115,15,228,192,142,104,155,29,19,53,49,35,128,5,184,248,222,123,124,216,178,64,113,198,244,245,246,167,47,11,170,212,109,114,237,94,144,69,243,254,121,231,59,108,17,153,249,34,72,7,130,21,200,175,81,134,105,137,75,165,156,174,232,125,92,88,8,93,157,223,225,48,111,85,107,204,36,158,90,139,190,230,60,73]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "main" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "97" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ord 'a'" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'a'" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "chr 97" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "7 `xor` 3" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"ff\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "showHex 255 \"\"" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ff" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "printf \"%02x\" 255" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [], "source": [ "p2lengths text = take (length chunk * 64) $ cycle chunk\n", " where chunk = map ord text ++ [17, 31, 73, 47, 23]" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [], "source": [ "densify ns = concatMap (printf \"%02x\") codes\n", " where chunks = chunksOf 16 ns\n", " compress = foldl1 xor\n", " codes = map compress chunks" ] }, { "cell_type": "code", "execution_count": 126, "metadata": {}, "outputs": [], "source": [ "part2 :: String -> String\n", "part2 text = densify tied\n", " where lengths = p2lengths text\n", " (tied, _, _) = foldl step ([0..255], 0, 0) lengths" ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "a2582a3a0e66e6e86e3812dcb672a272" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "putStrLn $ part2 \"\"" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "33efeb34ea91902bb2f59c9920caa6cd" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "putStrLn $ part2 \"AoC 2017\"" ] }, { "cell_type": "code", "execution_count": 123, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3efbe78a8d82f29979031a4aa0b16a9d" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "putStrLn $ part2 \"1,2,3\"" ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "63960835bcdc130f0b66d7ff4f6a5a8e" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "putStrLn $ part2 \"1,2,4\"" ] }, { "cell_type": "code", "execution_count": 129, "metadata": {}, "outputs": [], "source": [ "main :: IO ()\n", "main = do \n", " text <- readFile \"../../data/advent10.txt\"\n", " let instrs = map read $ splitOn \",\" text\n", " print $ part1 instrs\n", " putStrLn $ part2 text" ] }, { "cell_type": "code", "execution_count": 130, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "38415\n", "9de8846431eef262be78f590e39a4848" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "main" ] }, { "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 }