Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- part1 = true;
- part2 = true;
- fid = fopen('input.txt','r');
- s = {};
- while 1
- str = fgetl(fid);
- if str==-1; break;end
- s(end+1,:) = {str};
- end
- fclose(fid);
- %extract samples: S = [before,opcode,after]
- idx = 1;
- S = [];
- while 1
- if strfind(s{idx},'Before')
- S = [S;[str2num(s{idx}(9:end)),str2num(s{idx+1}),str2num(s{idx+2}(9:end))]];
- idx = idx+4;
- else
- break
- end
- end
- if part1
- cnt = 0;
- for s_idx = 1:size(S,1)
- R = zeros(16,4);
- for opCodeNum = 1:16
- R(opCodeNum,:) = applyOpCodeP2(S(s_idx,1:4),[opCodeNum-1,S(s_idx,6:8)]);
- end
- if sum(all(R == S(s_idx,9:end),2))>2
- cnt = cnt+1;
- end
- end
- disp(cnt)% Part 1
- end
- if part2
- R = [0,0,0,0];
- for idx = size(S,1)*4+3 : size(s,1)
- R = applyOpCodeP2(R,str2num(s{idx,:}));
- end
- disp(R(1))% Part 2
- end
- function y = applyOpCodeP2(x,opCode)
- y = x;
- switch opCode(1)
- case 14 %addr
- y(opCode(4)+1) = x(opCode(2)+1) + x(opCode(3)+1);
- case 4 %addi
- y(opCode(4)+1) = x(opCode(2)+1) + opCode(3);
- case 15 %mulr
- y(opCode(4)+1) = x(opCode(2)+1) * x(opCode(3)+1);
- case 8 %muli
- y(opCode(4)+1) = x(opCode(2)+1) * opCode(3);
- case 13 %banr
- y(opCode(4)+1) = bitand(x(opCode(2)+1),x(opCode(3)+1));
- case 10 %bani
- y(opCode(4)+1) = bitand(x(opCode(2)+1),opCode(3));
- case 11 %borr
- y(opCode(4)+1) = bitor(x(opCode(2)+1),x(opCode(3)+1));
- case 9 %bori
- y(opCode(4)+1) = bitor(x(opCode(2)+1),opCode(3));
- case 5 %setr
- y(opCode(4)+1) = x(opCode(2)+1);
- case 1 %seti
- y(opCode(4)+1) = opCode(2);
- case 12 %gtir
- y(opCode(4)+1) = opCode(2) > x(opCode(3)+1);
- case 7 %gtri
- y(opCode(4)+1) = x(opCode(2)+1) > opCode(3);
- case 6 %gtrr
- y(opCode(4)+1) = x(opCode(2)+1) > x(opCode(3)+1);
- case 0 %eqir
- y(opCode(4)+1) = opCode(2) == x(opCode(3)+1);
- case 2 %eqri
- y(opCode(4)+1) = x(opCode(2)+1) == opCode(3);
- case 3 %eqrr
- y(opCode(4)+1) = x(opCode(2)+1) == x(opCode(3)+1);
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment