5 read :: *File -> [Instr]
8 | l.[size l - 1] <> '\n' = []
9 = [toInstr [c\\c<-:l | c <> '\n']:read f]
11 toInstr ['nop ':rs] = Nop (toInt (toString rs))
12 toInstr ['acc ':rs] = Acc (toInt (toString rs))
13 toInstr ['jmp ':rs] = Jmp (toInt (toString rs))
15 :: Instr = Nop Int | Acc Int | Jmp Int
20 # instr = {c\\c<-instr}
21 = (one instr, two instr)
24 two is = [ acc \\i<-:is & pc<-[0..]
25 , let (acc, t) = interpret (update {i\\i<-:is} pc (swapnop i))
28 swapnop (Nop i) = Jmp i
29 swapnop (Jmp i) = Nop i
32 interpret :: {Instr} -> (Int, Bool)
33 interpret instr = int [] 0 0
36 | pc >= size instr = (acc, True) // terminated
37 | isMember pc vis = (acc, False) // inf loop
39 Nop _ = int [pc:vis] (1 + pc) acc
40 Acc i = int [pc:vis] (1 + pc) (i + acc)
41 Jmp i = int [pc:vis] (i + pc) acc