--- /dev/null
+-- import Debug.Trace
+
+import Data.Text (Text)
+-- import qualified Data.Text as T
+import qualified Data.Text.IO as TIO
+
+import Data.Attoparsec.Text
+-- import Data.Attoparsec.Combinator
+-- import Control.Applicative
+
+
+data Direction = North | East | South | West
+ deriving (Show, Eq, Ord, Enum, Bounded)
+
+type Position = (Int, Int) -- (x, y)
+
+data Action a = N a | S a | E a | W a | L a | R a | F a
+ deriving (Show, Eq, Ord)
+
+data Ship = Ship { direction :: Direction, position :: Position }
+ deriving (Show, Eq, Ord)
+
+data ShipW = ShipW { positionW :: Position
+ , waypoint :: Position
+ }
+ deriving (Show, Eq, Ord)
+
+
+
+main :: IO ()
+main =
+ do text <- TIO.readFile "data/advent12.txt"
+ let actions = successfulParse text
+ -- print actions
+ print $ part1 actions
+ print $ part2 actions
+
+
+part1 actions = manhattan (position ship1) start
+ where start = (0, 0)
+ ship0 = Ship {position = start, direction = East }
+ ship1 = foldl act ship0 actions
+
+part2 actions = manhattan (positionW ship1) start
+ where start = (0, 0)
+ ship0 = ShipW {positionW = start, waypoint = (10, 1)}
+ ship1 = foldl actW ship0 actions
+
+apAc actions = ship1
+ where start = (0, 0)
+ ship0 = Ship {position = start, direction = East }
+ ship1 = foldl act ship0 actions
+
+apAcW actions = ship1
+ where start = (0, 0)
+ ship0 = ShipW {positionW = start, waypoint = (10, 1) }
+ ship1 = foldl actW ship0 actions
+
+act Ship{..} (N d) = Ship { position = dDelta d North position, ..}
+act Ship{..} (S d) = Ship { position = dDelta d South position, ..}
+act Ship{..} (W d) = Ship { position = dDelta d West position, ..}
+act Ship{..} (E d) = Ship { position = dDelta d East position, ..}
+act Ship{..} (L a) = Ship { direction = d, ..} where d = (iterate predW direction) !! (a `div` 90)
+act Ship{..} (R a) = Ship { direction = d, ..} where d = (iterate succW direction) !! (a `div` 90)
+act Ship{..} (F d) = Ship { position = dDelta d direction position, ..}
+ -- where (x, y) = position
+ -- (dx, dy) = (delta direction)
+ -- p' = (x + (d * dx), y + (d * dy))
+
+actW ShipW{..} (N d) = ShipW { waypoint = dDelta d North waypoint, ..}
+actW ShipW{..} (S d) = ShipW { waypoint = dDelta d South waypoint, ..}
+actW ShipW{..} (W d) = ShipW { waypoint = dDelta d West waypoint, ..}
+actW ShipW{..} (E d) = ShipW { waypoint = dDelta d East waypoint, ..}
+actW ShipW{..} (L a) = ShipW { waypoint = d, ..} where d = (iterate rotL waypoint) !! (a `div` 90)
+actW ShipW{..} (R a) = ShipW { waypoint = d, ..} where d = (iterate rotR waypoint) !! (a `div` 90)
+actW ShipW{..} (F d) = ShipW { positionW = p', ..}
+ where (x, y) = positionW
+ (dx, dy) = waypoint
+ p' = (x + (d* dx), y + (d * dy))
+
+rotL (x, y) = (-y, x)
+rotR (x, y) = (y, -x)
+
+delta North = ( 0, 1)
+delta South = ( 0, -1)
+delta East = ( 1, 0)
+delta West = (-1, 0)
+
+dDelta dist dir (x, y) = (x + (dist * dx), y + (dist * dy))
+ where (dx, dy) = delta dir
+
+manhattan (x1, y1) (x2, y2) = abs (x1 - x2) + abs (y1 - y2)
+
+
+-- | a `succ` that wraps
+succW :: (Bounded a, Enum a, Eq a) => a -> a
+succW dir | dir == maxBound = minBound
+ | otherwise = succ dir
+
+-- | a `pred` that wraps
+predW :: (Bounded a, Enum a, Eq a) => a -> a
+predW dir | dir == minBound = maxBound
+ | otherwise = pred dir
+
+-- Parse the input file
+
+actionsP = actionP `sepBy` endOfLine
+
+actionP = choice [nP, sP, eP, wP, lP, rP, fP]
+
+nP = N <$> ("N" *> decimal)
+sP = S <$> ("S" *> decimal)
+eP = E <$> ("E" *> decimal)
+wP = W <$> ("W" *> decimal)
+lP = L <$> ("L" *> decimal)
+rP = R <$> ("R" *> decimal)
+fP = F <$> ("F" *> decimal)
+
+successfulParse :: Text -> [Action Int]
+successfulParse input =
+ case parseOnly actionsP input of
+ Left _err -> [] -- TIO.putStr $ T.pack $ parseErrorPretty err
+ Right actions -> actions
--- /dev/null
+<!DOCTYPE html>
+<html lang="en-us">
+<head>
+<meta charset="utf-8"/>
+<title>Day 12 - Advent of Code 2020</title>
+<!--[if lt IE 9]><script src="/static/html5.js"></script><![endif]-->
+<link href='//fonts.googleapis.com/css?family=Source+Code+Pro:300&subset=latin,latin-ext' rel='stylesheet' type='text/css'/>
+<link rel="stylesheet" type="text/css" href="/static/style.css?25"/>
+<link rel="stylesheet alternate" type="text/css" href="/static/highcontrast.css?0" title="High Contrast"/>
+<link rel="shortcut icon" href="/favicon.png"/>
+</head><!--
+
+
+
+
+Oh, hello! Funny seeing you here.
+
+I appreciate your enthusiasm, but you aren't going to find much down here.
+There certainly aren't clues to any of the puzzles. The best surprises don't
+even appear in the source until you unlock them for real.
+
+Please be careful with automated requests; I'm not a massive company, and I can
+only take so much traffic. Please be considerate so that everyone gets to play.
+
+If you're curious about how Advent of Code works, it's running on some custom
+Perl code. Other than a few integrations (auth, analytics, social media), I
+built the whole thing myself, including the design, animations, prose, and all
+of the puzzles.
+
+The puzzles are most of the work; preparing a new calendar and a new set of
+puzzles each year takes all of my free time for 4-5 months. A lot of effort
+went into building this thing - I hope you're enjoying playing it as much as I
+enjoyed making it for you!
+
+If you'd like to hang out, I'm @ericwastl on Twitter.
+
+- Eric Wastl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+-->
+<body>
+<header><div><h1 class="title-global"><a href="/">Advent of Code</a></h1><nav><ul><li><a href="/2020/about">[About]</a></li><li><a href="/2020/events">[Events]</a></li><li><a href="https://teespring.com/stores/advent-of-code" target="_blank">[Shop]</a></li><li><a href="/2020/settings">[Settings]</a></li><li><a href="/2020/auth/logout">[Log Out]</a></li></ul></nav><div class="user">Neil Smith <a href="/2020/support" class="supporter-badge" title="Advent of Code Supporter">(AoC++)</a> <span class="star-count">24*</span></div></div><div><h1 class="title-event"> <span class="title-event-wrap">/*</span><a href="/2020">2020</a><span class="title-event-wrap">*/</span></h1><nav><ul><li><a href="/2020">[Calendar]</a></li><li><a href="/2020/support">[AoC++]</a></li><li><a href="/2020/sponsors">[Sponsors]</a></li><li><a href="/2020/leaderboard">[Leaderboard]</a></li><li><a href="/2020/stats">[Stats]</a></li></ul></nav></div></header>
+
+<div id="sidebar">
+<div id="sponsor"><div class="quiet">Our <a href="/2020/sponsors">sponsors</a> help make Advent of Code possible:</div><div class="sponsor"><a href="https://www.bjss.com/joinus/" target="_blank" onclick="if(ga)ga('send','event','sponsor','sidebar',this.href);" rel="noopener">BJSS</a> - Good luck all. Hoping to see some BJSSers top of the leaderboard!</div></div>
+</div><!--/sidebar-->
+
+<main>
+<script>window.addEventListener('click', function(e,s,r){if(e.target.nodeName==='CODE'&&e.detail===3){s=window.getSelection();s.removeAllRanges();r=document.createRange();r.selectNodeContents(e.target);s.addRange(r);}});</script>
+<article class="day-desc"><h2>--- Day 12: Rain Risk ---</h2><p>Your ferry made decent progress toward the island, but the storm came in <span title="At least it wasn't a Category Six!">faster than anyone expected</span>. The ferry needs to take <em>evasive actions</em>!</p>
+<p>Unfortunately, the ship's navigation computer seems to be malfunctioning; rather than giving a route directly to safety, it produced extremely circuitous instructions. When the captain uses the <a href="https://en.wikipedia.org/wiki/Public_address_system" target="_blank">PA system</a> to ask if anyone can help, you quickly volunteer.</p>
+<p>The navigation instructions (your puzzle input) consists of a sequence of single-character <em>actions</em> paired with integer input <em>values</em>. After staring at them for a few minutes, you work out what they probably mean:</p>
+<ul>
+<li>Action <em><code>N</code></em> means to move <em>north</em> by the given value.</li>
+<li>Action <em><code>S</code></em> means to move <em>south</em> by the given value.</li>
+<li>Action <em><code>E</code></em> means to move <em>east</em> by the given value.</li>
+<li>Action <em><code>W</code></em> means to move <em>west</em> by the given value.</li>
+<li>Action <em><code>L</code></em> means to turn <em>left</em> the given number of degrees.</li>
+<li>Action <em><code>R</code></em> means to turn <em>right</em> the given number of degrees.</li>
+<li>Action <em><code>F</code></em> means to move <em>forward</em> by the given value in the direction the ship is currently facing.</li>
+</ul>
+<p>The ship starts by facing <em>east</em>. Only the <code>L</code> and <code>R</code> actions change the direction the ship is facing. (That is, if the ship is facing east and the next instruction is <code>N10</code>, the ship would move north 10 units, but would still move east if the following action were <code>F</code>.)</p>
+<p>For example:</p>
+<pre><code>F10
+N3
+F7
+R90
+F11
+</code></pre>
+<p>These instructions would be handled as follows:</p>
+<ul>
+<li><code>F10</code> would move the ship 10 units east (because the ship starts by facing east) to <em>east 10, north 0</em>.</li>
+<li><code>N3</code> would move the ship 3 units north to <em>east 10, north 3</em>.</li>
+<li><code>F7</code> would move the ship another 7 units east (because the ship is still facing east) to <em>east 17, north 3</em>.</li>
+<li><code>R90</code> would cause the ship to turn right by 90 degrees and face <em>south</em>; it remains at <em>east 17, north 3</em>.</li>
+<li><code>F11</code> would move the ship 11 units south to <em>east 17, south 8</em>.</li>
+</ul>
+<p>At the end of these instructions, the ship's <a href="https://en.wikipedia.org/wiki/Manhattan_distance" target="_blank">Manhattan distance</a> (sum of the absolute values of its east/west position and its north/south position) from its starting position is <code>17 + 8</code> = <em><code>25</code></em>.</p>
+<p>Figure out where the navigation instructions lead. <em>What is the Manhattan distance between that location and the ship's starting position?</em></p>
+</article>
+<p>Your puzzle answer was <code>1106</code>.</p><article class="day-desc"><h2 id="part2">--- Part Two ---</h2><p>Before you can give the destination to the captain, you realize that the actual action meanings were printed on the back of the instructions the whole time.</p>
+<p>Almost all of the actions indicate how to move a <em>waypoint</em> which is relative to the ship's position:</p>
+<ul>
+<li>Action <em><code>N</code></em> means to move the waypoint <em>north</em> by the given value.</li>
+<li>Action <em><code>S</code></em> means to move the waypoint <em>south</em> by the given value.</li>
+<li>Action <em><code>E</code></em> means to move the waypoint <em>east</em> by the given value.</li>
+<li>Action <em><code>W</code></em> means to move the waypoint <em>west</em> by the given value.</li>
+<li>Action <em><code>L</code></em> means to rotate the waypoint around the ship <em>left</em> (<em>counter-clockwise</em>) the given number of degrees.</li>
+<li>Action <em><code>R</code></em> means to rotate the waypoint around the ship <em>right</em> (<em>clockwise</em>) the given number of degrees.</li>
+<li>Action <em><code>F</code></em> means to move <em>forward</em> to the waypoint a number of times equal to the given value.</li>
+</ul>
+<p>The waypoint starts <em>10 units east and 1 unit north</em> relative to the ship. The waypoint is relative to the ship; that is, if the ship moves, the waypoint moves with it.</p>
+<p>For example, using the same instructions as above:</p>
+<ul>
+<li><code>F10</code> moves the ship to the waypoint 10 times (a total of <em>100 units east and 10 units north</em>), leaving the ship at <em>east 100, north 10</em>. The waypoint stays 10 units east and 1 unit north of the ship.</li>
+<li><code>N3</code> moves the waypoint 3 units north to <em>10 units east and 4 units north of the ship</em>. The ship remains at <em>east 100, north 10</em>.</li>
+<li><code>F7</code> moves the ship to the waypoint 7 times (a total of <em>70 units east and 28 units north</em>), leaving the ship at <em>east 170, north 38</em>. The waypoint stays 10 units east and 4 units north of the ship.</li>
+<li><code>R90</code> rotates the waypoint around the ship clockwise 90 degrees, moving it to <em>4 units east and 10 units south of the ship</em>. The ship remains at <em>east 170, north 38</em>.</li>
+<li><code>F11</code> moves the ship to the waypoint 11 times (a total of <em>44 units east and 110 units south</em>), leaving the ship at <em>east 214, south 72</em>. The waypoint stays 4 units east and 10 units south of the ship.</li>
+</ul>
+<p>After these operations, the ship's Manhattan distance from its starting position is <code>214 + 72</code> = <em><code>286</code></em>.</p>
+<p>Figure out where the navigation instructions actually lead. <em>What is the Manhattan distance between that location and the ship's starting position?</em></p>
+</article>
+<p>Your puzzle answer was <code>107281</code>.</p><p class="day-success">Both parts of this puzzle are complete! They provide two gold stars: **</p>
+<p>At this point, you should <a href="/2020">return to your Advent calendar</a> and try another puzzle.</p>
+<p>If you still want to see it, you can <a href="12/input" target="_blank">get your puzzle input</a>.</p>
+<p>You can also <span class="share">[Share<span class="share-content">on
+ <a href="https://twitter.com/intent/tweet?text=I%27ve+completed+%22Rain+Risk%22+%2D+Day+12+%2D+Advent+of+Code+2020&url=https%3A%2F%2Fadventofcode%2Ecom%2F2020%2Fday%2F12&related=ericwastl&hashtags=AdventOfCode" target="_blank">Twitter</a>
+ <a href="javascript:void(0);" onclick="var mastodon_instance=prompt('Mastodon Instance / Server Name?'); if(typeof mastodon_instance==='string' && mastodon_instance.length){this.href='https://'+mastodon_instance+'/share?text=I%27ve+completed+%22Rain+Risk%22+%2D+Day+12+%2D+Advent+of+Code+2020+%23AdventOfCode+https%3A%2F%2Fadventofcode%2Ecom%2F2020%2Fday%2F12'}else{return false;}" target="_blank">Mastodon</a
+></span>]</span> this puzzle.</p>
+</main>
+
+<!-- ga -->
+<script>
+(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+ga('create', 'UA-69522494-1', 'auto');
+ga('set', 'anonymizeIp', true);
+ga('send', 'pageview');
+</script>
+<!-- /ga -->
+</body>
+</html>
\ No newline at end of file