From 133559acebf7fdefd20a0653833311ea1a6f8811 Mon Sep 17 00:00:00 2001 From: Neil Smith <NeilNjae@users.noreply.github.com> Date: Sun, 30 Jul 2023 09:26:10 +0100 Subject: [PATCH 1/4] Solved adventure game --- .gitignore | 42 +++++ CoinSolver.hs | 19 ++ README.md | 137 +++++++++++++++ adventure_input.txt | 9 + all_coins.txt | 49 ++++++ challenge.bin | Bin 0 -> 60100 bytes coins_used.txt | 63 +++++++ found_teleporter.txt | 72 ++++++++ login-details.txt | 2 + red_blue_coin.txt | 37 ++++ red_coin.txt | 30 ++++ src/Main.hs | 177 +++++++++++++++++++ src/SynacorEngine.hs | 295 ++++++++++++++++++++++++++++++++ src/synacor_codes.txt | 17 ++ synacor-challenge.tgz | Bin 0 -> 52985 bytes synacor.cabal | 117 +++++++++++++ synacor.sublime-project | 8 + test1.txt | 2 + test2.txt | 11 ++ twisty_passages.txt | 15 ++ twisty_passages_can.txt | 20 +++ twisty_passages_code.txt | 25 +++ twisty_passages_lit_lantern.txt | 22 +++ 23 files changed, 1169 insertions(+) create mode 100644 .gitignore create mode 100644 CoinSolver.hs create mode 100644 README.md create mode 100644 adventure_input.txt create mode 100644 all_coins.txt create mode 100644 challenge.bin create mode 100644 coins_used.txt create mode 100644 found_teleporter.txt create mode 100644 login-details.txt create mode 100644 red_blue_coin.txt create mode 100644 red_coin.txt create mode 100644 src/Main.hs create mode 100644 src/SynacorEngine.hs create mode 100644 src/synacor_codes.txt create mode 100644 synacor-challenge.tgz create mode 100644 synacor.cabal create mode 100644 synacor.sublime-project create mode 100644 test1.txt create mode 100644 test2.txt create mode 100644 twisty_passages.txt create mode 100644 twisty_passages_can.txt create mode 100644 twisty_passages_code.txt create mode 100644 twisty_passages_lit_lantern.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1a0ee39 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +# Extensionless files +* +!/**/ +!*.* + +# Haskell bits +dist +dist-* +cabal-dev +*.o +*.hi +*.chi +*.chs.h +*.dyn_o +*.dyn_hi +.hpc +.hsenv +.cabal-sandbox/ +cabal.sandbox.config +*.prof +*.aux +*.hp +*.eventlog +cabal.project.local +.HTF/ + + +# IPython / IHaskell notebook checkpoints +.ipynb* + +# Sublime text +*.sublime-workspace + +# Logs +*.log + +# Profile exports +*.ps + +# KDE +.directory + diff --git a/CoinSolver.hs b/CoinSolver.hs new file mode 100644 index 0000000..d3a9e13 --- /dev/null +++ b/CoinSolver.hs @@ -0,0 +1,19 @@ +import Data.Map.Strict as M +import Data.Map.Strict ((!)) +import Data.List + +data Coins = Red | Blue | Shiny | Corroded | Concave + deriving (Ord, Eq, Show, Enum, Bounded) + +allCoins = [Red .. Concave] + +main = print solve + +coins :: M.Map Coins Int +coins = M.fromList $ zip [Red .. Concave] [2, 9, 5, 3, 7] + +solve :: [[Coins]] +solve = [ [a, b, c, d, e] + | [a, b, c, d, e] <- permutations allCoins + , (coins ! a) + (coins ! b) * (coins ! c) ^2 + (coins ! d) ^3 - (coins ! e) == 399 + ] diff --git a/README.md b/README.md new file mode 100644 index 0000000..a617b7c --- /dev/null +++ b/README.md @@ -0,0 +1,137 @@ +--- +title: "Advent of Code 2022" +output: html_document +css: modest.css +--- +Code to solve the [Advent of Code](http://adventofcode.com/2022/) puzzles. This year, I'm using the puzzles to develop my skills in [Haskell](https://wiki.haskell.org/Haskell). I'm writing up a [commentary on these puzzles and my solutions](https://work.njae.me.uk/tag/advent-of-code/) on my blog. + +[Learn you a Haskell](http://learnyouahaskell.com/chapters), [Introduction to Haskell 98](https://www.haskell.org/tutorial/index.html), and [Hackage](https://hackage.haskell.org/) are good resources. + +The [Cabal user guide](https://cabal.readthedocs.io/en/latest/index.html) and [How I Start: Haskell](http://howistart.org/posts/haskell/1/) are good sources of using the tools. + +# Toolchain + +Install Ghcup following [the instructions](https://www.haskell.org/ghcup/install/#installation), making sure to load the updated environment with + +```bash +source /home/neil/.ghcup/env +``` + +and then set the default GHC to use with `ghcup set ghc 9.0.1` . + +Install [Haskell Language Server](https://haskell-language-server.readthedocs.io/en/latest/configuration.html) for Sublime Text + + +## Creating the repository and project +Create the repository as normal: create the project in Gitolite, clone it, and insert the `.gitignore` and `README.md` files. + +There's one package per day, with the code for each package in sub-directories of the root directory. + +Create the basic `cabal` project. + +``` +cabal init +``` + +Modify the `advent-of-code21.cabal` file as needed, such as updating the Cabal version and writing the `common` stanzas. + +## Creating subsequent days + +Each day lives in a separate directory, with code in the `src` directory. + +Compile with +``` +cabal build +``` +or +``` +cabal build advent01 +``` + +Run with +``` +cabal run advent01 +``` + +If you want to pass in additional RTS parameters, do it like this: +``` +cabal run advent01 -- +RTS -K0 -RTS +``` + +Run interactively with +``` +cabal repl advent01 +``` +or +``` +stack ghci advent01:exe:advent01 +``` +if the first form is ambiguous. + +## Profiling + +To profile, use + +``` +cabal run advent01 --enable-profiling -- +RTS -N -p -s -hT +``` + +Or, you can simplify the RTS options by adding them to a new stanza in the cabal file: + +``` +executable advent01prof + import: common-extensions, build-directives + main-is: advent01/Main.hs + build-depends: text, containers, linear, array, pqueue, mtl, lens + ghc-options: -O2 + -Wall + -threaded + -eventlog + -rtsopts "-with-rtsopts=-N -p -s -hT" +``` + +Only include the `-eventlog` directive if you want to use Threadscope to investigate parallel behaviour. + +then running + +``` +cabal run advent01prof --enable-profiling +``` + + +Generate the profile graph with +``` +hp2ps -M advent01.hp +``` + + +# Packages + +Packages I used a lot: + +* [Containers](https://hackage.haskell.org/package/containers) (and some [better documentation](https://haskell-containers.readthedocs.io/en/latest/intro.html)); [Unordered containers](https://hackage.haskell.org/package/unordered-containers) is a mostly-equivalent alternative. +* [Attoparsec](https://hackage.haskell.org/package/attoparsec) (and [Megaparsec](https://hackage.haskell.org/package/megaparsec), and [ReadP](https://hackage.haskell.org/package/base-4.14.1.0/docs/Text-ParserCombinators-ReadP.html) once). + +There are somewhat decent [tutorials on Megaparsec](https://markkarpov.com/tutorial/megaparsec.html) and [Attoparsec](https://www.schoolofhaskell.com/school/starting-with-haskell/libraries-and-frameworks/text-manipulation/attoparsec). + +Packages I didn't use much, but need to remember: + +* [Arithmoi](https://hackage.haskell.org/package/arithmoi) for number theory +* [Pointed List](https://hackage.haskell.org/package/pointedlist-0.6.1) for zipper lists (sometimes circular) +* [Vector](https://hackage.haskell.org/package/vector) for array-like things +* [Linear](https://hackage.haskell.org/package/linear) for coordinate-vector like things +* [Grid](https://hackage.haskell.org/package/grid) for 2-d grids +* [Graph-wrapper](https://hackage.haskell.org/package/graph-wrapper) for graphs +* [Lens](https://hackage.haskell.org/package/lens) (and a [summary of operators](https://github.com/ekmett/lens/wiki/Operators)). I didn't use these much this year, but did a lot last year. +* [RWS](https://hackage.haskell.org/package/mtl-2.2.2/docs/Control-Monad-RWS-Lazy.html) (Reader-Writer-State monad stack); again, used a lot last year but not this year +* [Monad loops](https://hackage.haskell.org/package/monad-loops-0.4.3/docs/Control-Monad-Loops.html), and [a description](https://conscientiousprogrammer.com/blog/2015/12/11/24-days-of-hackage-2015-day-11-monad-loops-avoiding-writing-recursive-functions-by-refactoring/) +* [Replace-Megaparsec](https://github.com/jamesdbrock/replace-megaparsec), for using Mpc for all sorts of things traditionally done with regex substitutions. + +# Readme + +Build this readme file wth +``` +pandoc -s README.md > README.html +``` + +(Using the [Modest style](https://github.com/markdowncss/modest).) diff --git a/adventure_input.txt b/adventure_input.txt new file mode 100644 index 0000000..c3ac999 --- /dev/null +++ b/adventure_input.txt @@ -0,0 +1,9 @@ +take tablet +go doorway +go north +go north +go bridge +continue +down +west +passage diff --git a/all_coins.txt b/all_coins.txt new file mode 100644 index 0000000..3122ffd --- /dev/null +++ b/all_coins.txt @@ -0,0 +1,49 @@ +take tablet +use tablet +doorway +north +north +bridge +continue +down +east +take empty lantern +west +west +passage +ladder +west +south +north +take can +use can +use lantern +west +ladder +darkness +continue +west +west +west +west +north +take red coin +north +north +west +take blue coin +up +take shiny coin +down +east +east +take concave coin +down +take corroded coin +up +west +look red coin +look blue coin +look shiny coin +look corroded coin +look concave coin diff --git a/challenge.bin b/challenge.bin new file mode 100644 index 0000000000000000000000000000000000000000..ffe2d2a5447a07eb52e6ff147238ae9ddb12f4cd GIT binary patch literal 60100 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	xk4GIyc{ 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 DlmwAK literal 0 HcmV?d00001 diff --git a/coins_used.txt b/coins_used.txt new file mode 100644 index 0000000..ad7f95d --- /dev/null +++ b/coins_used.txt @@ -0,0 +1,63 @@ +take tablet +doorway + +use tablet +doorway +look +north +north +bridge +continue +down +east +take empty lantern +west +west +passage +ladder +west +south +north +take can +use can +use lantern +west +ladder +darkness +continue +west +west +west +west +north +take red coin +north +north +west +take blue coin +up +take shiny coin +down +east +east +take concave coin +inv +down +take corroded coin +up +west +look monument +look +look red coin +look blue coin +look shiny coin +look corroded coin +look concave coin +help +drop blue coin +take blue coin +use blue coin +use red coin +use shiny coin +use concave coin +use corroded coin diff --git a/found_teleporter.txt b/found_teleporter.txt new file mode 100644 index 0000000..95d38c9 --- /dev/null +++ b/found_teleporter.txt @@ -0,0 +1,72 @@ +take tablet +# get first code +use tablet +doorway +north +north +bridge +continue +down +east +take empty lantern +west +west +passage +ladder +west +south +north +take can +use can +use lantern +west +west +south +north +# get second code +west +ladder +darkness +continue +west +west +west +west +north +take red coin +north +north +west +take blue coin +up +take shiny coin +down +east +east +take concave coin +inv +down +take corroded coin +up +west +look monument +look +look red coin +look blue coin +look shiny coin +look corroded coin +look concave coin +use blue coin +use red coin +use shiny coin +use concave coin +use corroded coin +# now got coin puzzle code +north +take teleporter +use teleporter +take business card +take strange book +look bookshelf +look business card +look strange book diff --git a/login-details.txt b/login-details.txt new file mode 100644 index 0000000..f5ad418 --- /dev/null +++ b/login-details.txt @@ -0,0 +1,2 @@ +email: neil.synacor@njae.me.uk +password: Wfffj&ZlQ#n£ZF9£ diff --git a/red_blue_coin.txt b/red_blue_coin.txt new file mode 100644 index 0000000..9cd005f --- /dev/null +++ b/red_blue_coin.txt @@ -0,0 +1,37 @@ +take tablet +doorway + +use tablet +doorway +look +north +north +bridge +continue +down +east +take empty lantern +west +west +passage +ladder +west +south +north +take can +use can +use lantern +west +ladder +darkness +continue +west +west +west +west +north +take red coin +north +north +west +take blue coin diff --git a/red_coin.txt b/red_coin.txt new file mode 100644 index 0000000..c954274 --- /dev/null +++ b/red_coin.txt @@ -0,0 +1,30 @@ +take tablet +use tablet +go doorway +north +north +bridge +continue +down +east +take empty lantern +west +west +passage +ladder +west +south +north +take can +west +use can +use lantern +ladder +darkness +continue +west +west +west +west +north +take red coin diff --git a/src/Main.hs b/src/Main.hs new file mode 100644 index 0000000..0c9ceea --- /dev/null +++ b/src/Main.hs @@ -0,0 +1,177 @@ +import SynacorEngine + +import Debug.Trace + +import Numeric +import System.IO +import Data.Char +import Data.List +import qualified Data.Map.Strict as M +import Data.Map.Strict ((!)) +import Control.Lens -- hiding ((<|), (|>), (:>), (:<), indices) + +import Control.Monad.State.Strict +import Control.Monad.Reader +import Control.Monad.Writer +import Control.Monad.RWS.Strict + +-- import Data.Bits +import Data.Word +import Data.Binary.Get +import qualified Data.ByteString.Lazy as BL + + +data SynacorState = SynacorState + { _ssMachines :: [Machine] + , _ssInputs :: [String] + , _ssOutputs :: [String] + , _ssContinue :: Bool + , _ssUnsaved :: Bool + , _ssState :: [ExecutionState] + } deriving (Ord, Eq) +makeLenses ''SynacorState + +instance Show SynacorState + where + show state = + intercalate ", " + [ "SynacorState" + , (show (length (state ^. ssMachines)) ++ " machines") + , "inputs " ++ (intercalate ":" $ state ^. ssInputs) + , "outputs " ++ (intercalate ":" $ fmap (take 20) $ state ^. ssOutputs) + , "conts " ++ (show $ state ^. ssContinue) + , "unsaved " ++ (show $ state ^. ssUnsaved) + , "states " ++ (show $ state ^. ssState) + ] + +main :: IO () +main = + do -- mem <- getMemory + -- print $ [(n, showHex (mem ! n) "") | n <- [0..5] ] + -- machineInput <- readFile "adventure_input.txt" + -- let mInp = wordify machineInput + -- let machine = makeMachine mem + -- let (exState, _machine, output) = runMachine mInp machine + -- print exState + -- putStrLn $ showOutput output + + state0 <- emptyState + let state1 = runWithoutInput state0 + let newOutput = head $ state1 ^. ssOutputs + putStrLn newOutput + -- let state1 = runOneInput state "take tablet" + -- print state0 + -- print state + -- print state1 + + stateF <- adventureHarness state1 + return () + -- print $ stateF ^. ssInputs + -- print $ stateF ^. ssOutputs + -- print $ stateF ^. ssState + -- let machs = stateF ^. ssMachines + -- let machPairs = zipWith (==) machs $ tail machs + -- print $ machPairs + +emptyState :: IO SynacorState +emptyState = + do mem <- getMemory + let machine = makeMachine mem + return $ SynacorState [machine] [] [] True False [Runnable] + +adventureHarness :: SynacorState -> IO SynacorState +adventureHarness state = + do command <- prompt "> " + state' <- handleCommand command state + let newOutput = head $ state' ^. ssOutputs + putStrLn newOutput + if (state' ^. ssContinue) + then (adventureHarness state') + else return state' + + +handleCommand :: String -> SynacorState -> IO SynacorState +handleCommand ":quit" state = return $ state & ssContinue .~ False +handleCommand ":save" state = + do filename <- prompt "Save as? " + let inputs = unlines $ tail $ reverse $ state ^. ssInputs + writeFile filename inputs + return $ state & ssUnsaved .~ True +handleCommand ":load" state = + do filename <- prompt "From? " + machineInput <- readFile filename + let inputs = lines machineInput + initialState <- emptyState + let nonComments = filter (\i -> head i == '#') inputs + let state = foldl' runOneInput initialState ("" : nonComments) + return $ state & ssUnsaved .~ False +handleCommand ":undo" state = + return $ state & ssMachines %~ tail + & ssInputs %~ tail + & ssOutputs %~ tail + & ssContinue .~ True + & ssUnsaved .~ True + & ssState %~ tail +handleCommand ":recap" state = + do let inputs = take 3 $ state ^. ssInputs + let outputs = "" : (tail $ take 3 $ state ^. ssOutputs) + let inOuts = reverse $ zip inputs outputs + forM_ inOuts (\(i, o) -> + do putStrLn ("#> " ++ i) + putStrLn o + ) + return state +handleCommand command state = return $ runOneInput state command + + +runWithoutInput :: SynacorState -> SynacorState +runWithoutInput state = state & ssMachines %~ (machine' :) + -- & ssInputs %~ (input :) + & ssOutputs %~ ((showOutput output) :) + & ssContinue .~ True + & ssUnsaved .~ True + & ssState %~ (exState :) + where machine = head $ state ^. ssMachines + (exState, machine', output) = runMachine [] (machine & inputIndex .~ 0) + +runOneInput :: SynacorState -> String -> SynacorState +runOneInput state input = state & ssMachines %~ (machine' :) + & ssInputs %~ (input :) + & ssOutputs %~ ((showOutput output) :) + & ssContinue .~ True + & ssUnsaved .~ True + & ssState %~ (exState :) + where machine = head $ state ^. ssMachines + inputW = wordify (input ++ "\n") + (exState, machine', output) = runMachine inputW (machine & inputIndex .~ 0) + -- output' = trace ("runone " ++ (show (machine == machine')) ++ " " ++ (show exState) ++ " " ++ (showOutput output)) output + + +prompt :: String -> IO String +prompt text = do + putStr text + hFlush stdout + getLine + +wordify :: String -> [Word16] +wordify cs = fmap (fromIntegral . ord) cs + +showOutput :: [Word16] -> String +showOutput output = fmap (chr . fromInteger . fromIntegral) output + +getMemory :: IO Memory +getMemory = do + input <- BL.readFile "challenge.bin" + let cells = runGet getCells input + return $ M.fromList $ zip [0..] cells + +getCells :: Get [Word16] +getCells = do + empty <- isEmpty + if empty + then return [] + else do cell <- getWord16le + cells <- getCells + return (cell:cells) + + diff --git a/src/SynacorEngine.hs b/src/SynacorEngine.hs new file mode 100644 index 0000000..e036f5c --- /dev/null +++ b/src/SynacorEngine.hs @@ -0,0 +1,295 @@ +module SynacorEngine where + +import Debug.Trace + +-- import System.Environment +import Data.Bits +import Data.Word +-- import Data.Binary.Get +-- import qualified Data.ByteString.Lazy as BL +import qualified Data.Map.Strict as M +import Data.Map.Strict ((!)) +import Control.Lens +import Data.List +import Numeric + +import Control.Monad.State.Strict +import Control.Monad.Reader +import Control.Monad.Writer +import Control.Monad.RWS.Strict + +type Memory = M.Map Word16 Word16 + + + +data Machine = Machine { _memory :: Memory + , _ip :: Word16 + , _registers :: Memory + , _inputIndex :: Int + , _stack :: [Word16] + } + deriving (Show, Eq, Ord) +makeLenses ''Machine + +type ProgrammedMachine = RWS [Word16] [Word16] Machine + +data ExecutionState = Runnable | Blocked | Terminated deriving (Ord, Eq, Show) + +-- returns (returnValue, finalMachine, outputs) + +runMachine :: [Word16] -> Machine -> (ExecutionState, Machine, [Word16]) +runMachine inputs machine = runRWS runAll inputs machine + + +makeMachine :: Memory -> Machine +makeMachine memory = Machine + { _ip = 0 + , _inputIndex = 0 + , _registers = M.fromList [ (r, 0) | r <- [0..7] ] + , _memory = memory + , _stack = [] + } + +-- traceMachine x = +-- do cip <- gets _ip +-- opcode <- getLocation cip +-- arg1 <- getValue (cip + 1) +-- arg2 <- getValue (cip + 2) +-- arg3 <- getValue (cip + 3) +-- mem <- gets _memory +-- regs <- gets _registers +-- let raw1 = mem ! (cip + 1) +-- let raw2 = mem ! (cip + 2) +-- let raw3 = mem ! (cip + 3) +-- let x' = trace ( +-- intercalate ": " +-- [ "IP Addr" +-- , show (showHex (cip * 2) "") +-- , "IP" +-- , (show (showHex cip "")) +-- , "Op" +-- , show (opcode) +-- , "Args" +-- , show (showHex arg1 "") +-- , show (showHex arg2 "") +-- , show (showHex arg3 "") +-- , "Raw" +-- , show (showHex raw1 "") +-- , show (showHex raw2 "") +-- , show (showHex raw3 "") +-- , show (M.elems regs) +-- ] +-- ) x +-- return x' + +runAll :: ProgrammedMachine ExecutionState +runAll = do cip <- gets _ip + opcode <- getLocation cip + -- opcode' <- traceMachine opcode + -- exState <- runStep opcode' + exState <- runStep opcode + case exState of + Terminated -> return Terminated + Blocked -> return Blocked + _ -> runAll + + +runStep :: Word16 -> ProgrammedMachine ExecutionState +-- runStep n | trace (show n) False = undefined +runStep 0 = return Terminated +runStep 1 = + do cip <- gets _ip + regR <- getLocation (cip + 1) + let reg = regR .&. 7 + value <- getValue (cip + 2) + advanceIP 3 + modify (\m -> m & registers . ix reg .~ value) + return Runnable +runStep 2 = + do cip <- gets _ip + value <- getValue (cip + 1) + advanceIP 2 + modify (\m -> m & stack %~ (value :) ) + return Runnable +runStep 3 = + do cip <- gets _ip + tgt <- getLocation (cip + 1) + val <- gets (\m -> head $ m ^. stack) + modify (\m -> m & stack %~ tail ) + putValue tgt val + advanceIP 2 + return Runnable +runStep 4 = + do cip <- gets _ip + tgt <- getLocation (cip + 1) + b <- getValue (cip + 2) + c <- getValue (cip + 3) + putValue tgt (if b == c then 1 else 0) + modify (\m -> m & ip %~ (+ 4)) + return Runnable +runStep 5 = + do cip <- gets _ip + tgt <- getLocation (cip + 1) + b <- getValue (cip + 2) + c <- getValue (cip + 3) + putValue tgt (if b > c then 1 else 0) + advanceIP 4 + return Runnable +runStep 6 = + do cip <- gets _ip + tgt <- getLocation (cip + 1) + modify (\m -> m & ip .~ tgt) + return Runnable +runStep 7 = + do cip <- gets _ip + a <- getValue (cip + 1) + tgt <- getLocation (cip + 2) + if a /= 0 + then modify (\m -> m & ip .~ tgt) + else advanceIP 3 + return Runnable +runStep 8 = + do cip <- gets _ip + a <- getValue (cip + 1) + tgt <- getLocation (cip + 2) + if a == 0 + then modify (\m -> m & ip .~ tgt) + else advanceIP 3 + return Runnable + +runStep 9 = + do cip <- gets _ip + a <- getLocation (cip + 1) + b <- getValue (cip + 2) + c <- getValue (cip + 3) + putValue a (b + c) + advanceIP 4 + return Runnable +runStep 10 = + do cip <- gets _ip + a <- getLocation (cip + 1) + b <- getValue (cip + 2) + c <- getValue (cip + 3) + putValue a (b * c) + advanceIP 4 + return Runnable +runStep 11 = + do cip <- gets _ip + a <- getLocation (cip + 1) + b <- getValue (cip + 2) + c <- getValue (cip + 3) + putValue a (b `mod` c) + advanceIP 4 + return Runnable +runStep 12 = + do cip <- gets _ip + a <- getLocation (cip + 1) + b <- getValue (cip + 2) + c <- getValue (cip + 3) + putValue a (b .&. c) + advanceIP 4 + return Runnable +runStep 13 = + do cip <- gets _ip + a <- getLocation (cip + 1) + b <- getValue (cip + 2) + c <- getValue (cip + 3) + putValue a (b .|. c) + advanceIP 4 + return Runnable +runStep 14 = + do cip <- gets _ip + a <- getLocation (cip + 1) + b <- getValue (cip + 2) + putValue a (complement b) + advanceIP 3 + return Runnable + +runStep 15 = + do cip <- gets _ip + a <- getLocation (cip + 1) + b <- getValue (cip + 2) + v <- getValue b + putValue a v + advanceIP 3 + return Runnable +runStep 16 = + do cip <- gets _ip + a <- getValue (cip + 1) + b <- getValue (cip + 2) + putValue a b + advanceIP 3 + return Runnable + +runStep 17 = + do cip <- gets _ip + a <- getValue (cip + 1) + modify (\m -> m & stack %~ ((cip + 2) :) + & ip .~ a) + return Runnable + +runStep 18 = + do val <- gets (\m -> head $ m ^. stack) + modify (\m -> m & stack %~ tail + & ip .~ val) + return Runnable + +runStep 19 = + do cip <- gets _ip + v <- getValue (cip + 1) + tell [v] + advanceIP 2 + return Runnable + +runStep 20 = + do iIndex <- gets _inputIndex + inputs <- ask + cip <- gets _ip + tgt <- getLocation (cip + 1) + if (iIndex + 1) > (length inputs) + then return Blocked + else do let char = (inputs!!iIndex) + putValue tgt char + modify (\m -> m & inputIndex %~ (+ 1)) + advanceIP 2 + return Runnable + +runStep 21 = + do advanceIP 1 + return Runnable +runStep _ = + do advanceIP 1 + return Runnable + + +getValue :: Word16 -> ProgrammedMachine Word16 +getValue loc = + do mem <- gets _memory + regs <- gets _registers + let val = mem ! loc + if val < (2 ^ 15) + then return val + else return (regs ! (val .&. 7)) + + + + -- | loc < 32768 = + -- do mem <- gets _memory + -- return $ mem ! loc + -- | otherwise = + -- do regs <- gets _registers + -- return $ regs ! (loc `shiftR` 15) + +getLocation :: Word16 -> ProgrammedMachine Word16 +getLocation loc = + do mem <- gets _memory + return $ mem ! loc + +putValue :: Word16 -> Word16 -> ProgrammedMachine () +putValue loc value + | loc < (2 ^ 15) = modify (\m -> m & memory . ix loc .~ v) + | otherwise = modify (\m -> m & registers . ix (loc .&. 7) .~ v) + where v = value `mod` (2 ^ 15) + +advanceIP :: Word16 -> ProgrammedMachine () +advanceIP delta = modify (\m -> m & ip %~ (+ delta)) diff --git a/src/synacor_codes.txt b/src/synacor_codes.txt new file mode 100644 index 0000000..f32d370 --- /dev/null +++ b/src/synacor_codes.txt @@ -0,0 +1,17 @@ +Please record your progress by putting codes like +this one into the challenge website: hORWzmTEPkRE + +The self-test completion code is: YSDJvoycpDhu + +You find yourself writing "PRfkKApjpukS" on the tablet. Perhaps it's some kind of code? + +Chiseled on the wall of one of the passageways, you see: + + MSVFHKWMXrVA + +You take note of this and keep walking. + + +You activate the teleporter! As you spiral through time and space, you think you see a pattern in the stars... + + QiAHRHuQGxPx diff --git a/synacor-challenge.tgz b/synacor-challenge.tgz new file mode 100644 index 0000000000000000000000000000000000000000..840a2e0e14e56b4981e70d0e314e922fabdfa55a GIT binary patch literal 52985 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 W-h1!8_uhN&|NB4oM+m?G7y$r7TP<4v literal 0 HcmV?d00001 diff --git a/synacor.cabal b/synacor.cabal new file mode 100644 index 0000000..11f7b23 --- /dev/null +++ b/synacor.cabal @@ -0,0 +1,117 @@ +cabal-version: 3.6 +name: synacor-challenge +version: 0.1.0.0 + +-- A short (one-line) description of the package. +synopsis: Synacor challenge + +-- A longer description of the package. +-- description: + +-- A URL where users can report bugs. +-- bug-reports: + +-- The license under which the package is released. +-- license: +author: Neil Smith +maintainer: NeilNjae@users.noreply.github.com + +-- A copyright notice. +-- copyright: +-- category: +extra-source-files: + CHANGELOG.md + README.md + +common common-extensions + default-extensions: AllowAmbiguousTypes + , ApplicativeDo + , BangPatterns + , BlockArguments + , DataKinds + , DeriveFoldable + , DeriveFunctor + , DeriveGeneric + , DeriveTraversable + -- , DuplicateRecordFields + , EmptyCase + , FlexibleContexts + , FlexibleInstances + , FunctionalDependencies + , GADTs + , GeneralizedNewtypeDeriving + , ImplicitParams + , KindSignatures + , LambdaCase + , MonadComprehensions + , MonoLocalBinds + , MultiParamTypeClasses + , MultiWayIf + , NamedFieldPuns + , NegativeLiterals + , NumDecimals + -- , NoFieldSelectors + -- , OverloadedLists + -- , OverloadedRecordDot + , OverloadedStrings + , PartialTypeSignatures + , PatternGuards + , PatternSynonyms + , PolyKinds + , RankNTypes + , RecordWildCards + , ScopedTypeVariables + , TemplateHaskell + -- , TransformListComp + , TupleSections + , TypeApplications + , TypeFamilies + , TypeInType + , TypeOperators + , ViewPatterns + +common build-directives + build-depends: base >=4.16 + default-language: Haskell2010 + hs-source-dirs: ., app, src + other-modules: SynacorEngine + ghc-options: -O2 + -Wall + -threaded + -rtsopts "-with-rtsopts=-N" + +executable synacor + import: common-extensions, build-directives + main-is: Main.hs + build-depends: split + main-is: Main.hs + + -- Modules included in this executable, other than Main. + -- other-modules: + + -- LANGUAGE extensions used by modules in this package. + -- other-extensions: + build-depends: containers, binary, bytestring, mtl, lens + hs-source-dirs: app, src + default-language: Haskell2010 + +executable coinsolver + import: common-extensions + main-is: Main.hs + build-depends: split + main-is: CoinSolver.hs + build-depends: base >=4.16, containers + hs-source-dirs: app, src + default-language: Haskell2010 + hs-source-dirs: ., app, src + ghc-options: -O2 + -Wall + -threaded + -rtsopts "-with-rtsopts=-N" + + +library + import: common-extensions + build-depends: base >=4.16, containers, binary, bytestring, mtl, lens + hs-source-dirs: ., app, src + exposed-modules: SynacorEngine diff --git a/synacor.sublime-project b/synacor.sublime-project new file mode 100644 index 0000000..24db303 --- /dev/null +++ b/synacor.sublime-project @@ -0,0 +1,8 @@ +{ + "folders": + [ + { + "path": "." + } + ] +} diff --git a/test1.txt b/test1.txt new file mode 100644 index 0000000..558f944 --- /dev/null +++ b/test1.txt @@ -0,0 +1,2 @@ +take tablet +doorway diff --git a/test2.txt b/test2.txt new file mode 100644 index 0000000..b14ced5 --- /dev/null +++ b/test2.txt @@ -0,0 +1,11 @@ + +take tablet +inv +go south +go north +go doorway +north +north +bridge +continue +down diff --git a/twisty_passages.txt b/twisty_passages.txt new file mode 100644 index 0000000..8110a03 --- /dev/null +++ b/twisty_passages.txt @@ -0,0 +1,15 @@ + +take tablet +inv +go doorway +north +north +bridge +continue +down +east +take empty lantern +west +west +passage +ladder diff --git a/twisty_passages_can.txt b/twisty_passages_can.txt new file mode 100644 index 0000000..eaa9080 --- /dev/null +++ b/twisty_passages_can.txt @@ -0,0 +1,20 @@ + +take tablet +inv +go doorway +north +north +bridge +continue +down +east +take empty lantern +west +west +passage +ladder +west +south +north +take can +west diff --git a/twisty_passages_code.txt b/twisty_passages_code.txt new file mode 100644 index 0000000..540cf57 --- /dev/null +++ b/twisty_passages_code.txt @@ -0,0 +1,25 @@ +take tablet +use tablet +go doorway +north +north +bridge +continue +down +east +take empty lantern +west +west +passage +ladder +west +south +north +take can +west +use can +use lantern +west +south +north +west diff --git a/twisty_passages_lit_lantern.txt b/twisty_passages_lit_lantern.txt new file mode 100644 index 0000000..d8ab10f --- /dev/null +++ b/twisty_passages_lit_lantern.txt @@ -0,0 +1,22 @@ + +take tablet +inv +go doorway +north +north +bridge +continue +down +east +take empty lantern +west +west +passage +ladder +west +south +north +take can +west +use can +use lantern -- 2.43.0 From a0df5c6aec6ff0271ab47205f915e4647fbad4ec Mon Sep 17 00:00:00 2001 From: Neil Smith <NeilNjae@users.noreply.github.com> Date: Sun, 30 Jul 2023 15:42:39 +0100 Subject: [PATCH 2/4] Done tracing --- src/Main.hs | 49 ++++++++++++++++++++++++++++++++++++++---- src/SynacorEngine.hs | 51 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 95 insertions(+), 5 deletions(-) diff --git a/src/Main.hs b/src/Main.hs index 0c9ceea..be6e522 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -28,6 +28,8 @@ data SynacorState = SynacorState , _ssContinue :: Bool , _ssUnsaved :: Bool , _ssState :: [ExecutionState] + , _ssTracing :: Bool + , _ssDumpFile :: String } deriving (Ord, Eq) makeLenses ''SynacorState @@ -42,6 +44,8 @@ instance Show SynacorState , "conts " ++ (show $ state ^. ssContinue) , "unsaved " ++ (show $ state ^. ssUnsaved) , "states " ++ (show $ state ^. ssState) + , "tracing " ++ (show $ state ^. ssTracing) + , "dumping to " ++ (state ^. ssDumpFile) ] main :: IO () @@ -77,19 +81,43 @@ emptyState :: IO SynacorState emptyState = do mem <- getMemory let machine = makeMachine mem - return $ SynacorState [machine] [] [] True False [Runnable] + return $ SynacorState + { _ssMachines = [machine] + , _ssInputs = [] + , _ssOutputs = [] + , _ssContinue = True + , _ssUnsaved = False + , _ssState = [Runnable] + , _ssTracing = False + , _ssDumpFile = "" + } + -- [machine] [] [] True False [Runnable] adventureHarness :: SynacorState -> IO SynacorState adventureHarness state = do command <- prompt "> " state' <- handleCommand command state - let newOutput = head $ state' ^. ssOutputs + let traceAndOutput = head $ state' ^. ssOutputs + let (newOutput, tracing) = spliceOut traceAndOutput putStrLn newOutput + when (state' ^. ssTracing) + (appendFile (state' ^. ssDumpFile) $ unlines tracing) if (state' ^. ssContinue) then (adventureHarness state') else return state' +spliceOut :: String -> (String, [String]) +spliceOut s = doingOut s "" [] + where doingOut s out traces + | null s = (reverse out, reverse traces) + | ">> " `isPrefixOf` s = doingTrace (drop 3 s) out traces "" + | otherwise = doingOut (tail s) (head s : out) traces + doingTrace s out traces tr + | "<<" `isPrefixOf` s = doingOut (drop 2 s) out (reverse tr : traces) + | otherwise = doingTrace (tail s) out traces (head s : tr) + + handleCommand :: String -> SynacorState -> IO SynacorState handleCommand ":quit" state = return $ state & ssContinue .~ False handleCommand ":save" state = @@ -102,7 +130,7 @@ handleCommand ":load" state = machineInput <- readFile filename let inputs = lines machineInput initialState <- emptyState - let nonComments = filter (\i -> head i == '#') inputs + let nonComments = filter (\i -> head i /= '#') inputs let state = foldl' runOneInput initialState ("" : nonComments) return $ state & ssUnsaved .~ False handleCommand ":undo" state = @@ -121,6 +149,16 @@ handleCommand ":recap" state = putStrLn o ) return state +handleCommand ":trace" state = + do filename <- prompt "Dump to? " + return $ state & ssTracing .~ True & ssDumpFile .~ filename +handleCommand ":untrace" state = + return $ state & ssTracing .~ False & ssDumpFile .~ "" +handleCommand ":poke8" state = + do let machines = state ^. ssMachines + let machine = head machines + let machine' = machine & registers . ix 7 .~ 1 + return $ state & ssMachines .~ (machine' : (tail machines)) handleCommand command state = return $ runOneInput state command @@ -141,7 +179,10 @@ runOneInput state input = state & ssMachines %~ (machine' :) & ssContinue .~ True & ssUnsaved .~ True & ssState %~ (exState :) - where machine = head $ state ^. ssMachines + where machine0 = head $ state ^. ssMachines + machine = if (state ^. ssTracing) + then machine0 & tracing .~ True + else machine0 & tracing .~ False inputW = wordify (input ++ "\n") (exState, machine', output) = runMachine inputW (machine & inputIndex .~ 0) -- output' = trace ("runone " ++ (show (machine == machine')) ++ " " ++ (show exState) ++ " " ++ (showOutput output)) output diff --git a/src/SynacorEngine.hs b/src/SynacorEngine.hs index e036f5c..cbd5e04 100644 --- a/src/SynacorEngine.hs +++ b/src/SynacorEngine.hs @@ -11,6 +11,7 @@ import qualified Data.Map.Strict as M import Data.Map.Strict ((!)) import Control.Lens import Data.List +import Data.Char import Numeric import Control.Monad.State.Strict @@ -27,6 +28,7 @@ data Machine = Machine { _memory :: Memory , _registers :: Memory , _inputIndex :: Int , _stack :: [Word16] + , _tracing :: Bool } deriving (Show, Eq, Ord) makeLenses ''Machine @@ -48,6 +50,7 @@ makeMachine memory = Machine , _registers = M.fromList [ (r, 0) | r <- [0..7] ] , _memory = memory , _stack = [] + , _tracing = False } -- traceMachine x = @@ -85,6 +88,7 @@ makeMachine memory = Machine runAll :: ProgrammedMachine ExecutionState runAll = do cip <- gets _ip opcode <- getLocation cip + traceMachine -- opcode' <- traceMachine opcode -- exState <- runStep opcode' exState <- runStep opcode @@ -251,7 +255,7 @@ runStep 20 = else do let char = (inputs!!iIndex) putValue tgt char modify (\m -> m & inputIndex %~ (+ 1)) - advanceIP 2 + advanceIP 2 return Runnable runStep 21 = @@ -262,6 +266,51 @@ runStep _ = return Runnable +traceMachine :: ProgrammedMachine () +traceMachine = do + isTracing <- gets _tracing + when isTracing + do cip <- gets _ip + opcode <- getLocation cip + a <- getLocation (cip + 1) + b <- getLocation (cip + 2) + c <- getLocation (cip + 3) + let sa = show a + let sb = show b + let sc = show c + va <- getValue (cip + 1) + vb <- getValue (cip + 2) + vc <- getValue (cip + 3) + let sva = show va + let svb = show vb + let svc = show vc + let traceText = + case opcode of + 0 -> ["halt"] + 1 -> ["set", sa, sb, "*", sva, svb] + 2 -> ["push", sa, "*", sva] + 3 -> ["pop", sa, "*", sva] + 4 -> ["eq", sa, sb, sc, "*", sva, svb, svc] + 5 -> ["gt", sa, sb, sc, "*", sva, svb, svc] + 6 -> ["jmp", sa, "*", sva] + 7 -> ["jt", sa, sb, "*", sva, svb] + 8 -> ["jf", sa, sb, "*", sva, svb] + 9 -> ["add", sa, sb, sc, "*", sva, svb, svc] + 10 -> ["mul", sa, sb, sc, "*", sva, svb, svc] + 11 -> ["mod", sa, sb, sc, "*", sva, svb, svc] + 12 -> ["and", sa, sb, sc, "*", sva, svb, svc] + 13 -> ["or", sa, sb, sc, "*", sva, svb, svc] + 14 -> ["not", sa, sb, "*", sva, svb] + 15 -> ["rmem", sa, sb, "*", sva, svb] + 16 -> ["wmem", sa, sb, "*", sva, svb] + 17 -> ["call", sa, "*", sva] + 18 -> ["ret"] + 19 -> ["out", sa, "*", sva] + 20 -> ["in", sa, "*", sva] + 21 -> ["noop", sa, sb, sc, "*", sva, svb, svc] + _ -> ["illegal", sa, sb, sc, "*", sva, svb, svc] + tell $ fmap (fromIntegral . ord) (">> " ++ (show cip) ++ ": " ++ (intercalate " " traceText) ++ "<<") + getValue :: Word16 -> ProgrammedMachine Word16 getValue loc = do mem <- gets _memory -- 2.43.0 From 56796d54a5048d5f38ac06b1fdea48c045bb626e Mon Sep 17 00:00:00 2001 From: Neil Smith <NeilNjae@users.noreply.github.com> Date: Tue, 1 Aug 2023 17:30:42 +0100 Subject: [PATCH 3/4] Done teleporter code --- codes_found.md | 18 ++++++ coins_used.txt | 2 - found_teleporter.txt | 12 ++-- full_solution.txt | 88 ++++++++++++++++++++++++++++++ got_orb.txt | 78 ++++++++++++++++++++++++++ src/Ackermann.hs | 64 ++++++++++++++++++++++ CoinSolver.hs => src/CoinSolver.hs | 0 src/Main.hs | 14 ++++- src/SynacorEngine.hs | 69 +++++++++++++++++------ synacor.cabal | 16 +++++- test1.txt | 2 - test2.txt | 11 ---- 12 files changed, 332 insertions(+), 42 deletions(-) create mode 100644 codes_found.md create mode 100644 full_solution.txt create mode 100644 got_orb.txt create mode 100644 src/Ackermann.hs rename CoinSolver.hs => src/CoinSolver.hs (100%) delete mode 100644 test1.txt delete mode 100644 test2.txt diff --git a/codes_found.md b/codes_found.md new file mode 100644 index 0000000..0cb6907 --- /dev/null +++ b/codes_found.md @@ -0,0 +1,18 @@ +## First code +From arch.spec hint section +> pwiuBbPSgwrt + +## Second code +After self-test +> hORWzmTEPkRE + +## Third code +After using the tablet +> PRfkKApjpukS + +## Fourth code +Lighting the lantern in the cavern +> MSVFHKWMXrVA + +## Using the teleporter +> PLqwUDZxwKuh diff --git a/coins_used.txt b/coins_used.txt index ad7f95d..c109ba4 100644 --- a/coins_used.txt +++ b/coins_used.txt @@ -1,6 +1,4 @@ take tablet -doorway - use tablet doorway look diff --git a/found_teleporter.txt b/found_teleporter.txt index 95d38c9..734b6c2 100644 --- a/found_teleporter.txt +++ b/found_teleporter.txt @@ -1,5 +1,5 @@ take tablet -# get first code +# get third code use tablet doorway north @@ -23,7 +23,7 @@ west west south north -# get second code +# get fourth code west ladder darkness @@ -61,12 +61,12 @@ use red coin use shiny coin use concave coin use corroded coin -# now got coin puzzle code +# now got fifth code code north take teleporter use teleporter take business card take strange book -look bookshelf -look business card -look strange book +# issue :poke8 command here +# this gets the sixth code +use teleporter diff --git a/full_solution.txt b/full_solution.txt new file mode 100644 index 0000000..ea1511d --- /dev/null +++ b/full_solution.txt @@ -0,0 +1,88 @@ +take tablet +# get third code +use tablet +doorway +north +north +bridge +continue +down +east +take empty lantern +west +west +passage +ladder +west +south +north +take can +use can +use lantern +west +west +south +north +# get fourth code +west +ladder +darkness +continue +west +west +west +west +north +take red coin +north +north +west +take blue coin +up +take shiny coin +down +east +east +take concave coin +inv +down +take corroded coin +up +west +look monument +look +look red coin +look blue coin +look shiny coin +look corroded coin +look concave coin +use blue coin +use red coin +use shiny coin +use concave coin +use corroded coin +# now got fifth code code +north +take teleporter +use teleporter +take business card +take strange book +look business card +look strange book +# issue :poke8 command here +:poke8 +# this gets the sixth code +use teleporter +north +north +north +north +north +north +north +east +take journal +west +north +north +take orb diff --git a/got_orb.txt b/got_orb.txt new file mode 100644 index 0000000..8420e94 --- /dev/null +++ b/got_orb.txt @@ -0,0 +1,78 @@ +use tablet +doorway +north +bridge +north +bridge +continue +down +east +take empty lantern +west +west +passage +ladder +west +south +north +take can +use can +use lantern +west +west +south +north +west +ladder +darkness +continue +west +west +west +west +north +take red coin +north +north +west +take blue coin +up +take shiny coin +down +east +east +take concave coin +down +take corroded coin +up +west +use blue coin +use red coin +use shiny coin +use concave coin +use corroded coin +north +take teleporter +use teleporter +take business card +take strange book +look strange book +use teleporter +north +north +north +north +north +north +north +north +north +take orb +look orb +north +north +north +east +east +east +vault diff --git a/src/Ackermann.hs b/src/Ackermann.hs new file mode 100644 index 0000000..4dc3b20 --- /dev/null +++ b/src/Ackermann.hs @@ -0,0 +1,64 @@ + +-- import Debug.Trace + +import Data.List +import qualified Data.Map.Strict as M +import Data.Map.Strict ((!)) +-- import Data.Maybe + +import Control.Monad.State.Strict +-- import Control.Monad.Reader +-- import Control.Monad.Writer +-- import Control.Monad.RWS.Strict + +import Control.Parallel.Strategies + + +type Memo = M.Map (Int, Int) Int + +type MemoF = State Memo + +main :: IO () +main = + do let resultPairs = fmap evalAck [0 .. (2 ^ 15 - 1)] `using` parList rdeepseq + let result = filter ((== 6) . snd) resultPairs + print result + +r7Gives6 :: Int -> Bool +r7Gives6 r7 = result == 6 + where result = evalState (ackermann 4 1 r7) M.empty + +evalAck :: Int -> (Int, Int) +evalAck r7 = (r7, evalState (ackermann 4 1 r7) M.empty) + + +ackermann :: Int -> Int -> Int -> MemoF Int +ackermann r0 r1 r7 = do + memoResult <- memoLookup r0 r1 + case memoResult of + Just r -> return r + Nothing -> + do if r0 == 0 + then do let res = ((r1 + 1) `mod` (2 ^ 15)) + memoStore r0 r1 res + return res + else if r1 == 0 + then do res <- ackermann (r0 - 1) r7 r7 + memoStore r0 r1 res + return res + else do subResult <- ackermann r0 (r1 - 1) r7 + res <- ackermann (r0 - 1) subResult r7 + memoStore r0 r1 res + return res + +memoLookup :: Int -> Int -> MemoF (Maybe Int) +memoLookup r0 r1 = + do table <- get + return $ M.lookup (r0, r1) table + +memoStore :: Int -> Int -> Int -> MemoF () +memoStore r0 r1 result = + do table <- get + let table' = M.insert (r0, r1) result table + put table' + diff --git a/CoinSolver.hs b/src/CoinSolver.hs similarity index 100% rename from CoinSolver.hs rename to src/CoinSolver.hs diff --git a/src/Main.hs b/src/Main.hs index be6e522..d7ad6f3 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -157,7 +157,11 @@ handleCommand ":untrace" state = handleCommand ":poke8" state = do let machines = state ^. ssMachines let machine = head machines - let machine' = machine & registers . ix 7 .~ 1 + let machine' = machine & registers . ix 7 .~ 25734 + & memory . ix 5489 .~ 21 + & memory . ix 5490 .~ 21 + & memory . ix 5495 .~ 7 + -- let machine' = machine & memory . ix 5451 .~ 7 return $ state & ssMachines .~ (machine' : (tail machines)) handleCommand command state = return $ runOneInput state command @@ -173,6 +177,14 @@ runWithoutInput state = state & ssMachines %~ (machine' :) (exState, machine', output) = runMachine [] (machine & inputIndex .~ 0) runOneInput :: SynacorState -> String -> SynacorState +runOneInput state ":poke8" = state & ssMachines .~ ssMAchinesNew + where machine0 = head $ state ^. ssMachines + machine = machine0 & registers . ix 7 .~ 25734 + & memory . ix 5489 .~ 21 + & memory . ix 5490 .~ 21 + & memory . ix 5495 .~ 7 + ssMAchinesNew = machine : (tail $ state ^. ssMachines) + runOneInput state input = state & ssMachines %~ (machine' :) & ssInputs %~ (input :) & ssOutputs %~ ((showOutput output) :) diff --git a/src/SynacorEngine.hs b/src/SynacorEngine.hs index cbd5e04..757bd5f 100644 --- a/src/SynacorEngine.hs +++ b/src/SynacorEngine.hs @@ -40,7 +40,7 @@ data ExecutionState = Runnable | Blocked | Terminated deriving (Ord, Eq, Show) -- returns (returnValue, finalMachine, outputs) runMachine :: [Word16] -> Machine -> (ExecutionState, Machine, [Word16]) -runMachine inputs machine = runRWS runAll inputs machine +runMachine inputs machine = runRWS (runAll (10 ^ 6)) inputs machine makeMachine :: Memory -> Machine @@ -85,17 +85,20 @@ makeMachine memory = Machine -- ) x -- return x' -runAll :: ProgrammedMachine ExecutionState -runAll = do cip <- gets _ip - opcode <- getLocation cip - traceMachine - -- opcode' <- traceMachine opcode - -- exState <- runStep opcode' - exState <- runStep opcode - case exState of - Terminated -> return Terminated - Blocked -> return Blocked - _ -> runAll +runAll :: Int -> ProgrammedMachine ExecutionState +runAll executionLimit + | executionLimit == 0 = return Terminated + | otherwise = + do cip <- gets _ip + opcode <- getLocation cip + traceMachine + -- opcode' <- traceMachine opcode + -- exState <- runStep opcode' + exState <- runStep opcode + case exState of + Terminated -> return Terminated + Blocked -> return Blocked + _ -> runAll (executionLimit - 1) runStep :: Word16 -> ProgrammedMachine ExecutionState @@ -270,11 +273,33 @@ traceMachine :: ProgrammedMachine () traceMachine = do isTracing <- gets _tracing when isTracing - do cip <- gets _ip + do cip <- gets _ip + (l, _) <- dissembleInstruction cip + registers <- gets _registers + let regVals = intercalate "; " $ fmap show $ M.elems registers + stack <- gets _stack + let stackVals = intercalate "; " $ fmap show $ take 10 stack + tell $ fmap (fromIntegral . ord) (">> " ++ l ++ " : r> " ++ regVals ++ " : s> " ++ stackVals ++ "<<") + +runDissemble :: Word16 -> Int -> Machine -> [String] +runDissemble startAt num machine =fst $ evalRWS (dissemble startAt num) [] machine + + +dissemble :: Word16 -> Int -> ProgrammedMachine [String] +dissemble startAt num = go startAt num [] + where go _ 0 ls = return $ reverse ls + go here n ls = + do (line, step) <- dissembleInstruction here + go (here + step) (n - 1) (line : ls) + +dissembleInstruction :: Word16 -> ProgrammedMachine (String, Word16) +dissembleInstruction cip = + do -- cip <- gets _ip opcode <- getLocation cip - a <- getLocation (cip + 1) - b <- getLocation (cip + 2) - c <- getLocation (cip + 3) + mem <- gets _memory + let a = mem ! (cip + 1) + let b = mem ! (cip + 2) + let c = mem ! (cip + 3) let sa = show a let sb = show b let sc = show c @@ -307,9 +332,17 @@ traceMachine = do 18 -> ["ret"] 19 -> ["out", sa, "*", sva] 20 -> ["in", sa, "*", sva] - 21 -> ["noop", sa, sb, sc, "*", sva, svb, svc] + 21 -> ["noop"] _ -> ["illegal", sa, sb, sc, "*", sva, svb, svc] - tell $ fmap (fromIntegral . ord) (">> " ++ (show cip) ++ ": " ++ (intercalate " " traceText) ++ "<<") + let stepSize = + if | opcode `elem` [0, 18, 21] -> 1 + | opcode `elem` [2, 3, 6, 17, 19, 20] -> 2 + | opcode `elem` [1, 7, 8, 14, 15, 16] -> 3 + | opcode `elem` [4, 5, 9, 10, 11, 12, 13] -> 4 + | otherwise -> 1 + return ( ((show cip) ++ ": " ++ (intercalate " " traceText)) + , stepSize + ) getValue :: Word16 -> ProgrammedMachine Word16 getValue loc = diff --git a/synacor.cabal b/synacor.cabal index 11f7b23..60ac8f5 100644 --- a/synacor.cabal +++ b/synacor.cabal @@ -95,10 +95,23 @@ executable synacor hs-source-dirs: app, src default-language: Haskell2010 +executable ackermann + import: common-extensions + main-is: Main.hs + main-is: Ackermann.hs + build-depends: base >=4.16, containers, mtl, parallel + hs-source-dirs: app, src + default-language: Haskell2010 + hs-source-dirs: ., app, src + ghc-options: -O2 + -Wall + -threaded + -rtsopts "-with-rtsopts=-N" + + executable coinsolver import: common-extensions main-is: Main.hs - build-depends: split main-is: CoinSolver.hs build-depends: base >=4.16, containers hs-source-dirs: app, src @@ -109,7 +122,6 @@ executable coinsolver -threaded -rtsopts "-with-rtsopts=-N" - library import: common-extensions build-depends: base >=4.16, containers, binary, bytestring, mtl, lens diff --git a/test1.txt b/test1.txt deleted file mode 100644 index 558f944..0000000 --- a/test1.txt +++ /dev/null @@ -1,2 +0,0 @@ -take tablet -doorway diff --git a/test2.txt b/test2.txt deleted file mode 100644 index b14ced5..0000000 --- a/test2.txt +++ /dev/null @@ -1,11 +0,0 @@ - -take tablet -inv -go south -go north -go doorway -north -north -bridge -continue -down -- 2.43.0 From 3836f842a8794a2d25cc5f8558d70becae8b7396 Mon Sep 17 00:00:00 2001 From: Neil Smith <NeilNjae@users.noreply.github.com> Date: Thu, 3 Aug 2023 14:25:59 +0100 Subject: [PATCH 4/4] Completed puzzle --- codes_found.md | 3 ++ full_solution.txt | 15 ++++++ src/Main.hs | 23 ++++---- src/OrbMaze.hs | 125 +++++++++++++++++++++++++++++++++++++++++++ src/SynacorEngine.hs | 16 +++--- synacor.cabal | 21 ++++++-- 6 files changed, 180 insertions(+), 23 deletions(-) create mode 100644 src/OrbMaze.hs diff --git a/codes_found.md b/codes_found.md index 0cb6907..e8e1ae5 100644 --- a/codes_found.md +++ b/codes_found.md @@ -16,3 +16,6 @@ Lighting the lantern in the cavern ## Using the teleporter > PLqwUDZxwKuh + +## After the orb maze +"qiwTT8UxHYxp" or mirrored to qxYHxU8TTwip diff --git a/full_solution.txt b/full_solution.txt index ea1511d..cbf3da8 100644 --- a/full_solution.txt +++ b/full_solution.txt @@ -86,3 +86,18 @@ west north north take orb +north +east +east +north +west +south +east +east +west +north +north +east +vault +take mirror +use mirror diff --git a/src/Main.hs b/src/Main.hs index d7ad6f3..101714e 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -1,19 +1,19 @@ import SynacorEngine -import Debug.Trace +-- import Debug.Trace -import Numeric +-- import Numeric import System.IO import Data.Char import Data.List import qualified Data.Map.Strict as M -import Data.Map.Strict ((!)) +-- import Data.Map.Strict ((!)) import Control.Lens -- hiding ((<|), (|>), (:>), (:<), indices) -import Control.Monad.State.Strict -import Control.Monad.Reader -import Control.Monad.Writer -import Control.Monad.RWS.Strict +import Control.Monad.State.Strict hiding (state) +-- import Control.Monad.Reader +-- import Control.Monad.Writer +-- import Control.Monad.RWS.Strict hiding (state) -- import Data.Bits import Data.Word @@ -69,6 +69,7 @@ main = -- print state1 stateF <- adventureHarness state1 + print stateF return () -- print $ stateF ^. ssInputs -- print $ stateF ^. ssOutputs @@ -98,17 +99,17 @@ adventureHarness state = do command <- prompt "> " state' <- handleCommand command state let traceAndOutput = head $ state' ^. ssOutputs - let (newOutput, tracing) = spliceOut traceAndOutput + let (newOutput, traces) = spliceOut traceAndOutput putStrLn newOutput when (state' ^. ssTracing) - (appendFile (state' ^. ssDumpFile) $ unlines tracing) + (appendFile (state' ^. ssDumpFile) $ unlines traces) if (state' ^. ssContinue) then (adventureHarness state') else return state' spliceOut :: String -> (String, [String]) -spliceOut s = doingOut s "" [] +spliceOut st = doingOut st "" [] where doingOut s out traces | null s = (reverse out, reverse traces) | ">> " `isPrefixOf` s = doingTrace (drop 3 s) out traces "" @@ -125,7 +126,7 @@ handleCommand ":save" state = let inputs = unlines $ tail $ reverse $ state ^. ssInputs writeFile filename inputs return $ state & ssUnsaved .~ True -handleCommand ":load" state = +handleCommand ":load" _state = do filename <- prompt "From? " machineInput <- readFile filename let inputs = lines machineInput diff --git a/src/OrbMaze.hs b/src/OrbMaze.hs new file mode 100644 index 0000000..b9888da --- /dev/null +++ b/src/OrbMaze.hs @@ -0,0 +1,125 @@ + +import qualified Debug.Trace as DT + +import Data.List +import Data.Maybe +import qualified Data.Map.Strict as M +import Data.Map.Strict ((!)) +import Linear +import Control.Lens + +-- type Position = V2 Int -- x, y, origin bottom left +newtype Position = Pos (V2 Int) -- x, y, origin bottom left + deriving (Show, Eq, Ord) + + +instance Semigroup Position where + (Pos p) <> (Pos q) = Pos $ p ^+^ q + +instance Monoid Position where + mempty = Pos (V2 0 0) + +data Operator = Times | Divide | Plus | Minus + deriving (Show, Eq, Ord) + +data Cell = Literal Int | Op Operator + deriving (Show, Eq, Ord) + +type Grid = M.Map Position Cell + +data SearchState = SearchState + { _path :: [Position] + , _value :: Int + , _operator :: Maybe Operator + } + deriving (Show, Eq, Ord) +makeLenses ''SearchState + +main :: IO () +main = + do -- print grid + let s = initialSearchState + -- print s + -- print $ neighbours s + let ps = bfs [s] + print ps + print $ presentPath $ (fromMaybe s ps) ^. path + +grid :: Grid +grid = M.fromList $ fmap (\(p, v) -> (Pos p, v)) + [ (V2 0 3, Op Times), (V2 1 3, Literal 8), (V2 2 3, Op Minus), (V2 3 3, Literal 1) + , (V2 0 2, Literal 4), (V2 1 2, Op Times), (V2 2 2, Literal 11), (V2 3 2, Op Times) + , (V2 0 1, Op Plus), (V2 1 1, Literal 4), (V2 2 1, Op Minus), (V2 3 1, Literal 18) + , (V2 0 0, Literal 22), (V2 1 0, Op Minus), (V2 2 0, Literal 9), (V2 3 0, Op Times) + ] + +initialSearchState :: SearchState +initialSearchState = SearchState {_path = [], _value = 22, _operator = Nothing} + +deltas :: [Position] +deltas = fmap Pos [V2 -1 0, V2 1 0, V2 0 -1, V2 0 1] + +-- adjacents :: Position -> Grid -> [Position] +-- adjacents here grid = filter (flip M.member grid) $ fmap (here <>) deltas + +neighbours :: SearchState -> [SearchState] +neighbours state = catMaybes $ fmap (step state) deltas + -- where here = mconcat $ state ^. path + +step :: SearchState -> Position -> Maybe SearchState +step state d = + do d' <- notStart state d + destination <- M.lookup ((currentPosition state) <> d') grid + state' <- addTerm state destination + return $ state' & path %~ (d' : ) + + +notStart :: SearchState -> Position -> Maybe Position +notStart state delta + | (mconcat (state ^. path)) <> delta == mempty = Nothing + | otherwise = Just delta + +bfs :: [SearchState] -> Maybe SearchState +-- bfs a | DT.trace (show a) False = undefined +bfs [] = Nothing +bfs (s:agenda) + | isGoal s = Just s + | currentPosition s == Pos (V2 3 3) = bfs agenda + | length (s ^. path) == 15 = bfs agenda + | s ^. value < 0 = bfs agenda + | s ^. value > (2 ^ 16) = bfs agenda + | otherwise = bfs (agenda ++ nexts) + where nexts = neighbours s + + +isGoal :: SearchState -> Bool +isGoal s = (currentPosition s == Pos (V2 3 3)) && (s ^. value == 30) + +currentPosition :: SearchState -> Position +currentPosition s = mconcat $ s ^. path + +currentValue :: SearchState -> Maybe Int +currentValue s + | (s ^. operator) == Nothing = Just $ s ^. value + | otherwise = Nothing + +addTerm :: SearchState -> Cell -> Maybe SearchState +-- addTerm s c | DT.trace (show (s, c)) False = undefined +addTerm s (Literal i) = + go (s ^. operator) i s + where + go Nothing _ _ = Nothing + go (Just Times) i s = Just $ s & value %~ (* i) & operator .~ Nothing + go (Just Divide) i s = Just $ s & value %~ (`div` i) & operator .~ Nothing + go (Just Plus) i s = Just $ s & value %~ (+ i) & operator .~ Nothing + go (Just Minus) i s = Just $ s & value %~ (+ (-i)) & operator .~ Nothing +addTerm s (Op op) + | (s ^. operator) == Nothing = Just $ s & operator .~ (Just op) + | otherwise = Nothing + +presentPath ps = fmap presentStep $ reverse ps + where + presentStep (Pos (V2 0 1)) = "north" + presentStep (Pos (V2 0 -1)) = "south" + presentStep (Pos (V2 1 0)) = "east" + presentStep (Pos (V2 -1 0)) = "west" diff --git a/src/SynacorEngine.hs b/src/SynacorEngine.hs index 757bd5f..63fb20c 100644 --- a/src/SynacorEngine.hs +++ b/src/SynacorEngine.hs @@ -1,6 +1,6 @@ module SynacorEngine where -import Debug.Trace +-- import Debug.Trace -- import System.Environment import Data.Bits @@ -12,7 +12,7 @@ import Data.Map.Strict ((!)) import Control.Lens import Data.List import Data.Char -import Numeric +-- import Numeric import Control.Monad.State.Strict import Control.Monad.Reader @@ -44,11 +44,11 @@ runMachine inputs machine = runRWS (runAll (10 ^ 6)) inputs machine makeMachine :: Memory -> Machine -makeMachine memory = Machine +makeMachine mem = Machine { _ip = 0 , _inputIndex = 0 , _registers = M.fromList [ (r, 0) | r <- [0..7] ] - , _memory = memory + , _memory = mem , _stack = [] , _tracing = False } @@ -275,10 +275,10 @@ traceMachine = do when isTracing do cip <- gets _ip (l, _) <- dissembleInstruction cip - registers <- gets _registers - let regVals = intercalate "; " $ fmap show $ M.elems registers - stack <- gets _stack - let stackVals = intercalate "; " $ fmap show $ take 10 stack + regs <- gets _registers + let regVals = intercalate "; " $ fmap show $ M.elems regs + stk <- gets _stack + let stackVals = intercalate "; " $ fmap show $ take 10 stk tell $ fmap (fromIntegral . ord) (">> " ++ l ++ " : r> " ++ regVals ++ " : s> " ++ stackVals ++ "<<") runDissemble :: Word16 -> Int -> Machine -> [String] diff --git a/synacor.cabal b/synacor.cabal index 60ac8f5..196d3f4 100644 --- a/synacor.cabal +++ b/synacor.cabal @@ -72,7 +72,7 @@ common common-extensions common build-directives build-depends: base >=4.16 - default-language: Haskell2010 + default-language: GHC2021 hs-source-dirs: ., app, src other-modules: SynacorEngine ghc-options: -O2 @@ -93,7 +93,7 @@ executable synacor -- other-extensions: build-depends: containers, binary, bytestring, mtl, lens hs-source-dirs: app, src - default-language: Haskell2010 + default-language: GHC2021 executable ackermann import: common-extensions @@ -101,7 +101,7 @@ executable ackermann main-is: Ackermann.hs build-depends: base >=4.16, containers, mtl, parallel hs-source-dirs: app, src - default-language: Haskell2010 + default-language: GHC2021 hs-source-dirs: ., app, src ghc-options: -O2 -Wall @@ -115,7 +115,20 @@ executable coinsolver main-is: CoinSolver.hs build-depends: base >=4.16, containers hs-source-dirs: app, src - default-language: Haskell2010 + default-language: GHC2021 + hs-source-dirs: ., app, src + ghc-options: -O2 + -Wall + -threaded + -rtsopts "-with-rtsopts=-N" + +executable orbmaze + import: common-extensions + main-is: Main.hs + main-is: OrbMaze.hs + build-depends: base >=4.16, containers, linear, lens + hs-source-dirs: app, src + default-language: GHC2021 hs-source-dirs: ., app, src ghc-options: -O2 -Wall -- 2.43.0