30 lines
1.0 KiB
Haskell
30 lines
1.0 KiB
Haskell
{-# LANGUAGE FlexibleContexts #-}
|
|
import Control.Monad.State
|
|
import Data.Char (chr, ord)
|
|
import Data.IntMap
|
|
|
|
subleq = loop 0
|
|
where
|
|
loop ip =
|
|
when (ip >= 0) $
|
|
do m0 <- gets (! ip)
|
|
m1 <- gets (! (ip + 1))
|
|
if m0 < 0
|
|
then do modify . insert m1 ch . ord =<< liftIO getChar
|
|
loop (ip + 3)
|
|
else if m1 < 0
|
|
then do liftIO . putChar . chr =<< gets (! m0)
|
|
loop (ip + 3)
|
|
else do v <- (-) <$> gets (! m1) <*> gets (! m0)
|
|
modify $ insert m1 v
|
|
if v <= 0
|
|
then loop =<< gets (! (ip + 2))
|
|
else loop (ip + 3)
|
|
|
|
main = evalStateT subleq helloWorld
|
|
where
|
|
helloWorld =
|
|
fromList $
|
|
zip [0..]
|
|
[15, 17, -1, 17, -1, -1, 16, 1, -1, 16, 3, -1, 15, 15, 0, 0, -1, 72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33, 10, 0]
|