Guest User

Untitled

a guest
Dec 13th, 2018
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 3.65 KB | None | 0 0
  1. fid     = fopen('input.txt');
  2. part1   = false; % set to false for part 2
  3. s       = {};
  4. while 1
  5.     str = fgetl(fid);
  6.     if str==-1; break;end
  7.     s(end+1,:) = {str};
  8. end
  9. fclose(fid);
  10.  
  11. % extract cart positions
  12. c = []; % row from top, column from left,heading (N,E,S,W = 1,2,3,4),turnIdx (1,2,3),hasCrashed]
  13. for i=1:size(s,1)
  14.    
  15.     p1 = strfind(s{i},'^');
  16.     p2 = strfind(s{i},'v');
  17.     p3 = strfind(s{i},'<');
  18.     p4 = strfind(s{i},'>');
  19.    
  20.     for j=1:length(p1)
  21.         c = [c;[i,p1(j)],1,1,0];
  22.     end
  23.    
  24.     for j=1:length(p2)
  25.         c = [c;[i,p2(j)],3,1,0];
  26.     end
  27.    
  28.     for j=1:length(p3)
  29.         c = [c;[i,p3(j)],4,1,0];
  30.     end
  31.    
  32.     for j=1:length(p4)
  33.         c = [c;[i,p4(j)],2,1,0];
  34.     end
  35. end
  36.  
  37. % parse grid:  / = 3, \ = 4, + = 5
  38. g = zeros(size(s,1),length(s{1}));
  39. for i=1:size(s,1)
  40.     for j = 1:length(s{i})
  41.         switch s{i}(j)
  42.             case '/'
  43.                 g(i,j) = 3;
  44.             case '\'
  45.                 g(i,j) = 4;
  46.             case '+'
  47.                 g(i,j) = 5;
  48.         end
  49.     end
  50. end
  51.  
  52. %main loop over ticks
  53. crash = false;
  54. while ~crash
  55.    
  56.     % loop over carts in correct order
  57.     c = sortrows(c);
  58.     for i = 1:size(c,1)
  59.        
  60.         x = c(i,1);
  61.         y = c(i,2);
  62.         h = c(i,3);
  63.         t = c(i,4);
  64.        
  65.         % / = 3, \ = 4, + = 5
  66.         % First change heading:
  67.         switch g(x,y)
  68.             case 3 % /
  69.                 switch h
  70.                     case 1
  71.                         c(i,3) = 2;
  72.                     case 2
  73.                         c(i,3) = 1;
  74.                     case 3
  75.                         c(i,3) = 4;
  76.                     case 4
  77.                         c(i,3) = 3;
  78.                 end
  79.             case 4 %\
  80.                 switch h
  81.                     case 1
  82.                         c(i,3) = 4;
  83.                     case 2
  84.                         c(i,3) = 3;
  85.                     case 3
  86.                         c(i,3) = 2;
  87.                     case 4
  88.                         c(i,3) = 1;
  89.                 end
  90.             case 5 %+
  91.                 switch t
  92.                     case 1
  93.                         c(i,3) = h-1;
  94.                         if c(i,3)==0
  95.                             c(i,3) = 4;
  96.                         end
  97.                         c(i,4) = 2;
  98.                     case 2
  99.                         c(i,4) = 3;
  100.                     case 3
  101.                         c(i,3) = h+1;
  102.                         if c(i,3)==5
  103.                             c(i,3) = 1;
  104.                         end
  105.                         c(i,4) = 1;
  106.                 end
  107.         end
  108.        
  109.         % Then take a step:
  110.         switch c(i,3)
  111.             case 1
  112.                 c(i,1) = c(i,1)-1;
  113.             case 2
  114.                 c(i,2) = c(i,2)+1;
  115.             case 3
  116.                 c(i,1) = c(i,1)+1;
  117.             case 4
  118.                 c(i,2) = c(i,2)-1;
  119.         end
  120.        
  121.         % check collision
  122.         for m = 1:size(c,1)
  123.             for n = 1:size(c,1)
  124.                 if m~=n
  125.                     if c(m,1)==c(n,1) && c(m,2)==c(n,2) && c(m,5)==0 && c(n,5)==0
  126.                         c(m,5) = 1;
  127.                         c(n,5) = 1;
  128.                         if part1
  129.                             disp([c(m,2)-1,c(m,1)-1]) % Part1
  130.                             crash = true;
  131.                         else % Part2
  132.                             if sum(c(:,5))==16
  133.                                 disp([c(c(:,5)==0,2)-1,c(c(:,5)==0,1)-1]) % Part2
  134.                                 crash = true;
  135.                             end
  136.                         end
  137.                     end
  138.                 end
  139.             end
  140.         end
  141.     end
  142. end
Advertisement
Add Comment
Please, Sign In to add comment