summaryrefslogtreecommitdiff
path: root/src/Fractran/Interpreter.hs
blob: 1393991974d9b1bba55a04b8c43b1d31dddb6e43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
module Fractran.Interpreter (
    fractran
	) where


import Fractran.Parser




fractran :: FractranProgram -> [Int]
fractran program =
    let prog = map (\(x,y) -> (fromIntegral x, fromIntegral y)) (fractions program)
        f = (\p v -> if (p == [])
                     then []
                     else let (curX, curY) = head p
                              newV = v * curX / curY
                          in if (isInt newV)
                             then newV : (f prog newV)
                             else f (tail p) v)
        result = map round (f prog (fromIntegral (initialValue program)))
    in (initialValue program) : result



isInt :: (RealFrac a) => a -> Bool
isInt x =
    x == fromInteger (round x)