Advertisement
Guest User

Untitled

a guest
Dec 17th, 2024
1,496
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Haskell 1.10 KB | Source Code | 0 0
  1. import Data.Char (isDigit)
  2.  
  3. parse :: [String] -> [Int]
  4. parse xs =
  5.   let splitOps [] = []
  6.       splitOps os = case span isDigit os of
  7.         (op, _ : rest) -> read op : splitOps rest
  8.         (op, _) -> [read op]
  9.       ops = splitOps (dropWhile (not . isDigit) $ last xs)
  10.    in ops
  11.  
  12. disassemble :: [Int] -> [String]
  13. disassemble (opcode : operand : xs) =
  14.   let combo :: Int -> String
  15.       combo 4 = "A"
  16.       combo 5 = "B"
  17.       combo 6 = "C"
  18.       combo op | op >= 7 = "invalid opcode " ++ show op
  19.       combo op = show op
  20.    in ( case opcode of
  21.           0 -> "A <- A >> " ++ combo operand
  22.           1 -> "B <- B xor " ++ show operand
  23.           2 -> "B <- " ++ combo operand ++ " mod 8"
  24.           3 -> "IF A != 0 THEN JMP " ++ show operand -- jnz
  25.           4 -> "B <- B xor C"
  26.           5 -> "OUT <- " ++ combo operand ++ " mod 8"
  27.           6 -> "B <- A >> " ++ combo operand
  28.           7 -> "C <- A >> " ++ combo operand
  29.           x -> error $ "invalid opcode " ++ show x
  30.       )
  31.         : disassemble xs
  32. disassemble _ = []
  33.  
  34. main :: IO ()
  35. main = interact $ unlines . disassemble . parse . lines
  36.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement