Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Data.Char (isDigit)
- parse :: [String] -> [Int]
- parse xs =
- let splitOps [] = []
- splitOps os = case span isDigit os of
- (op, _ : rest) -> read op : splitOps rest
- (op, _) -> [read op]
- ops = splitOps (dropWhile (not . isDigit) $ last xs)
- in ops
- disassemble :: [Int] -> [String]
- disassemble (opcode : operand : xs) =
- let combo :: Int -> String
- combo 4 = "A"
- combo 5 = "B"
- combo 6 = "C"
- combo op | op >= 7 = "invalid opcode " ++ show op
- combo op = show op
- in ( case opcode of
- 0 -> "A <- A >> " ++ combo operand
- 1 -> "B <- B xor " ++ show operand
- 2 -> "B <- " ++ combo operand ++ " mod 8"
- 3 -> "IF A != 0 THEN JMP " ++ show operand -- jnz
- 4 -> "B <- B xor C"
- 5 -> "OUT <- " ++ combo operand ++ " mod 8"
- 6 -> "B <- A >> " ++ combo operand
- 7 -> "C <- A >> " ++ combo operand
- x -> error $ "invalid opcode " ++ show x
- )
- : disassemble xs
- disassemble _ = []
- main :: IO ()
- main = interact $ unlines . disassemble . parse . lines
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement