X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=8%2Fone.icl;h=4365516c592027106106ef99414a211febe02718;hb=755844d13e3e1c3521c4d8c5033706d6abfe0b81;hp=6b4fde37202fce61fa258b815042b970a9fdb74f;hpb=da0c22ac2091714d35b3c5bca5b30a4a74f9e496;p=aoc20.git diff --git a/8/one.icl b/8/one.icl index 6b4fde3..4365516 100644 --- a/8/one.icl +++ b/8/one.icl @@ -21,22 +21,20 @@ Start w = (one instr, two instr) one = fst o interpret -two = hd o filter snd o map interpret o nopjump 0 - -nopjump :: Int {Instr} -> [{Instr}] -nopjump pc is - | pc == size is = [] - = case is.[pc] of - Nop i = [update {i\\i<-:is} pc (Jmp i):nopjump (pc+1) is] - Jmp i = [update {i\\i<-:is} pc (Nop i):nopjump (pc+1) is] - _ = nopjump (pc+1) is +two is = [ acc \\i<-:is & pc<-[0..] + , let (acc, t) = interpret (update {i\\i<-:is} pc (swapnop i)) + | t] +where + swapnop (Nop i) = Jmp i + swapnop (Jmp i) = Nop i + swapnop i = i interpret :: {Instr} -> (Int, Bool) interpret instr = int [] 0 0 where int vis pc acc - | pc >= size instr = (acc, True) - | isMember pc vis = (acc, False) + | pc >= size instr = (acc, True) // terminated + | isMember pc vis = (acc, False) // inf loop = case instr.[pc] of Nop _ = int [pc:vis] (1 + pc) acc Acc i = int [pc:vis] (1 + pc) (i + acc)