Guest User

Untitled

a guest
Sep 27th, 2014
451
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. main :: [Int]
  2. = letrec eval' :: ([Int] -> [Int] -> Int -> Int -> Int -> [Int]) output mem r0 r1 ip =
  3. if getMem mem ip == 0 then output else evalInstruction output mem r0 r1 ip;
  4. eval :: ([Int] -> [Int]) inp =
  5. eval' Nil inp 0 0 0;
  6. input :: ([Int]) =
  7. (Cons 3 (Cons 3 (Cons 3 (Cons 3
  8. (Cons 8 (Cons 0 (Cons 7 (Cons 11
  9. (Cons 0 (Cons 8 (Cons 0 (Cons 13
  10. (Cons 0 (Cons 0 (Cons 14 (Cons 0
  11. (Nil)))))))))))))))));
  12. ding :: ([Int] -> [Int]) output =
  13. (Cons (-1) output);
  14. print :: ([Int] -> Int -> [Int]) output x =
  15. (Cons x output);
  16. constrain :: (Int -> Int) x =
  17. x % 16;
  18. getMem :: ([Int] -> Int -> Int) mem index =
  19. if index == 0 then (head mem) else (getMem (tail mem) (index - 1));
  20. setMem :: ([Int] -> Int -> Int -> [Int]) mem index value =
  21. if index == 0 then (Cons value (tail mem)) else (Cons (head mem) (setMem (tail mem) (index - 1) value));
  22. evalInstruction :: ([Int] -> [Int] -> Int -> Int -> Int -> [Int]) output mem r0 r1 ip =
  23. if (getMem mem ip) == 0 then eval' output mem r0 r1 ip else
  24. if (getMem mem ip) == 1 then eval' output mem (constrain (r0 + r1)) r1 (constrain ip + 1) else
  25. if (getMem mem ip) == 2 then eval' output mem (constrain (r0 - r1)) r1 (constrain ip + 1) else
  26. if (getMem mem ip) == 3 then eval' output mem (constrain (r0 + 1)) r1 (constrain ip + 1) else
  27. if (getMem mem ip) == 4 then eval' output mem r0 (constrain (r1 + 1)) (constrain ip + 1) else
  28. if (getMem mem ip) == 5 then eval' output mem (constrain (r0 - 1)) r1 (constrain ip + 1) else
  29. if (getMem mem ip) == 6 then eval' output mem r0 (constrain (r1 - 1)) (constrain ip + 1) else
  30. if (getMem mem ip) == 7 then eval' (ding output) mem r0 r1 (constrain ip + 1) else
  31. if (getMem mem ip) == 8 then eval' (print output (getMem mem (getMem mem (constrain (ip + 1))))) mem r0 r1 (constrain ip + 2) else
  32. if (getMem mem ip) == 9 then eval' output mem (getMem mem (constrain (ip + 1))) r1 (constrain ip + 2) else
  33. if (getMem mem ip) == 10 then eval' output mem r0 (getMem mem (getMem mem (getMem mem (constrain (ip + 1))))) (constrain ip + 2) else
  34. if (getMem mem ip) == 11 then eval' output (setMem mem (getMem mem (constrain ip + 1)) r0) r0 r1 (constrain ip + 2) else
  35. if (getMem mem ip) == 12 then eval' output (setMem mem (getMem mem (constrain ip + 1)) r1) r0 r1 (constrain ip + 2) else
  36. if (getMem mem ip) == 13 then eval' output mem r0 r1 (getMem mem (constrain (ip + 1))) else
  37. if (getMem mem ip) == 14 then eval' output mem r0 r1 (if r0 == 0 then (getMem mem (constrain (ip + 1))) else (constrain ip + 2)) else
  38. if (getMem mem ip) == 15 then eval' output mem r0 r1 (if r0 > 0 then (getMem mem (constrain (ip + 1))) else (constrain ip + 2)) else
  39. (Nil);
  40. in eval input;
Advertisement
Add Comment
Please, Sign In to add comment