Guest User

Untitled

a guest
Dec 19th, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 2.25 KB | None | 0 0
  1. part1   = false;
  2. part2   = true;
  3. fid     = fopen('input.txt','r');
  4. % Note: #ip 2 stripped from input before loading
  5. s       = {};
  6. while 1
  7.     str = fgetl(fid);
  8.     if str==-1; break;end
  9.     s(end+1,:) = {str};
  10. end
  11. fclose(fid);
  12.  
  13. %extract program
  14. instr = cell(size(s,1),1);
  15. for i=1:size(s,1)
  16.     tmp = str2num(s{i}(5:end));
  17.     instr{i,1} = s{i}(1:4);
  18.     instr{i,2} = tmp(1);
  19.     instr{i,3} = tmp(2);
  20.     instr{i,4} = tmp(3);
  21. end
  22.  
  23. R  = [0,0,0,0,0,0];
  24. if part2
  25.     R(1) = 1;
  26. end
  27.  
  28. if part1
  29.     IP  = 0;
  30.     IPR = 2;
  31.     cnt = 1;
  32.     while IP > -1 && IP < size(instr,1)
  33.         cnt =cnt+1;
  34.         R   = applyOpCode(R,instr(IP+1,:));
  35.         IP  = R(IPR+1);
  36.         IP  = IP+1;
  37.         R(IPR+1) = IP;
  38.     end
  39.     disp(R(1))% Part 1
  40. end
  41.  
  42. if part2
  43.     IP  = 0;
  44.     IPR = 2;
  45.     cnt = 1;
  46.     for i=1:20
  47.         cnt = cnt+1;
  48.         R   = applyOpCode(R,instr(IP+1,:));
  49.         IP  = R(IPR+1);
  50.         IP  = IP+1;
  51.         R(IPR+1) = IP;
  52.     end
  53.      disp(sum(divisors(R(2)))) % Part 2
  54. end
  55.  
  56.  
  57. toc
  58. disp('Finished')
  59.  
  60. function y = applyOpCode(x,opCode)
  61. y = x;
  62. switch opCode{1}
  63.     case 'addr'
  64.         y(opCode{4}+1) = x(opCode{2}+1) + x(opCode{3}+1);
  65.     case 'addi'
  66.         y(opCode{4}+1) = x(opCode{2}+1) + opCode{3};
  67.     case 'mulr'
  68.         y(opCode{4}+1) = x(opCode{2}+1) * x(opCode{3}+1);
  69.     case 'muli'
  70.         y(opCode{4}+1) = x(opCode{2}+1) * opCode{3};
  71.     case 'banr'
  72.         y(opCode{4}+1) = bitand(x(opCode{2}+1),x(opCode{3}+1));
  73.     case 'bani'
  74.         y(opCode{4}+1) = bitand(x(opCode{2}+1),opCode{3});
  75.     case 'borr'
  76.         y(opCode{4}+1) = bitor(x(opCode{2}+1),x(opCode{3}+1));
  77.     case 'bori'
  78.         y(opCode{4}+1) = bitor(x(opCode{2}+1),opCode{3});
  79.     case 'setr'
  80.         y(opCode{4}+1) = x(opCode{2}+1);
  81.     case 'seti'
  82.         y(opCode{4}+1) = opCode{2};
  83.     case 'gtir'
  84.         y(opCode{4}+1) = opCode{2} > x(opCode{3}+1);
  85.     case 'gtri'
  86.         y(opCode{4}+1) = x(opCode{2}+1) > opCode{3};
  87.     case 'gtrr'
  88.         y(opCode{4}+1) = x(opCode{2}+1) > x(opCode{3}+1);
  89.     case 'eqir'
  90.         y(opCode{4}+1) = opCode{2} == x(opCode{3}+1);
  91.     case 'eqri'
  92.         y(opCode{4}+1) = x(opCode{2}+1) == opCode{3};
  93.     case 'eqrr'
  94.         y(opCode{4}+1) = x(opCode{2}+1) == x(opCode{3}+1);
  95. end
  96. end
Advertisement
Add Comment
Please, Sign In to add comment