Guest User

Untitled

a guest
Dec 16th, 2018
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 2.15 KB | None | 0 0
  1. part1   = true;
  2. part2   = true;
  3. fid     = fopen('input.txt','r');
  4. s       = {};
  5. while 1
  6.     str = fgetl(fid);
  7.     if str==-1; break;end
  8.     s(end+1,:) = {str};
  9. end
  10. fclose(fid);
  11.  
  12. %extract samples: S = [before,opcode,after]
  13. idx = 1;
  14. S   = [];
  15. while 1
  16.     if strfind(s{idx},'Before')
  17.         S = [S;[str2num(s{idx}(9:end)),str2num(s{idx+1}),str2num(s{idx+2}(9:end))]];
  18.         idx = idx+4;
  19.     else
  20.         break
  21.     end
  22. end
  23.  
  24. if part1
  25.     cnt = 0;
  26.     for s_idx = 1:size(S,1)
  27.         R = zeros(16,4);
  28.         for opCodeNum = 1:16
  29.             R(opCodeNum,:) = applyOpCodeP2(S(s_idx,1:4),[opCodeNum-1,S(s_idx,6:8)]);
  30.         end
  31.         if sum(all(R == S(s_idx,9:end),2))>2
  32.             cnt = cnt+1;
  33.         end
  34.     end
  35.     disp(cnt)% Part 1
  36. end
  37.  
  38. if part2
  39.     R = [0,0,0,0];
  40.     for idx = size(S,1)*4+3 : size(s,1)
  41.         R = applyOpCodeP2(R,str2num(s{idx,:}));
  42.     end
  43.     disp(R(1))% Part 2
  44. end
  45.  
  46. function y = applyOpCodeP2(x,opCode)
  47. y = x;
  48. switch opCode(1)
  49.     case 14 %addr
  50.         y(opCode(4)+1) = x(opCode(2)+1) + x(opCode(3)+1);
  51.     case 4  %addi
  52.         y(opCode(4)+1) = x(opCode(2)+1) + opCode(3);
  53.     case 15 %mulr
  54.         y(opCode(4)+1) = x(opCode(2)+1) * x(opCode(3)+1);
  55.     case 8  %muli
  56.         y(opCode(4)+1) = x(opCode(2)+1) * opCode(3);
  57.     case 13 %banr
  58.         y(opCode(4)+1) = bitand(x(opCode(2)+1),x(opCode(3)+1));
  59.     case 10 %bani
  60.         y(opCode(4)+1) = bitand(x(opCode(2)+1),opCode(3));
  61.     case 11 %borr
  62.         y(opCode(4)+1) = bitor(x(opCode(2)+1),x(opCode(3)+1));
  63.     case 9  %bori
  64.         y(opCode(4)+1) = bitor(x(opCode(2)+1),opCode(3));
  65.     case 5  %setr
  66.         y(opCode(4)+1) = x(opCode(2)+1);
  67.     case 1  %seti
  68.         y(opCode(4)+1) = opCode(2);
  69.     case 12 %gtir
  70.         y(opCode(4)+1) = opCode(2) > x(opCode(3)+1);
  71.     case 7  %gtri
  72.         y(opCode(4)+1) = x(opCode(2)+1) > opCode(3);
  73.     case 6  %gtrr
  74.         y(opCode(4)+1) = x(opCode(2)+1) > x(opCode(3)+1);
  75.     case 0  %eqir
  76.         y(opCode(4)+1) = opCode(2) == x(opCode(3)+1);
  77.     case 2  %eqri
  78.         y(opCode(4)+1) = x(opCode(2)+1) == opCode(3);
  79.     case 3  %eqrr
  80.         y(opCode(4)+1) = x(opCode(2)+1) == x(opCode(3)+1);
  81. end
  82. end
Advertisement
Add Comment
Please, Sign In to add comment