Guest User

Untitled

a guest
Dec 17th, 2018
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 2.76 KB | None | 0 0
  1. x = importdata('input.txt');
  2. z = zeros(size(x,1),4);
  3. for i=1:size(x,1)
  4.     p = strrep(x{i},'..',',');
  5.     t = sscanf(p,'x=%f, y=%f,%f');
  6.     if isempty(t)
  7.         t = sscanf(p,'y=%f, x=%f,%f');
  8.         z(i,:)=[t(2),t(3),t(1),t(1)];
  9.     else
  10.         z(i,:)=[t(1),t(1),t(2),t(3)];
  11.     end
  12. end
  13.  
  14. minX = min(min(z(:,1:2)));
  15. minY = min(min(z(:,3:4)));
  16. maxX = max(max(z(:,1:2)));
  17. maxY = max(max(z(:,3:4)));
  18.  
  19. % 0 = sand, 1 = clay, 2 = wet sand, 3 = resting water, 4 = moving water
  20. g = zeros(maxY+1,maxX-minX+3);
  21. g(1,500-minX+2) = 2; % source
  22.  
  23. for i=1:L
  24.     g(z(i,3)+1:z(i,4)+1,z(i,1)-minX+2:z(i,2)-minX+2)=1;
  25. end
  26.  
  27. g_old = g;
  28. while 1
  29.     g_old = g;
  30.     while 1
  31.         % dry sand under wet sand becomes wet sand
  32.         gUP = [zeros(1,size(g,2));g(1:end-1,:)];
  33.         g( g==0 & gUP==2 ) = 2;
  34.        
  35.         % dry sand next to wet sand on left that is above clay or resting water becomes wet sand
  36.         gLeft       = [zeros(size(g,1),1),g(:,1:end-1)];
  37.         gLeftDown   = [gLeft(2:end,:);zeros(1,size(gLeft,2))];
  38.         g( g==0 & gLeft==2 & (gLeftDown==1 | gLeftDown==3) ) = 2;
  39.        
  40.         % dry sand next to wet sand on right that is above clay becomes wet sand
  41.         gRight       = [g(:,2:end),zeros(size(g,1),1)];
  42.         gRightDown   = [gRight(2:end,:);zeros(1,size(gRight,2))];
  43.         g( g==0 & gRight==2 & (gRightDown==1 | gRightDown==3 ) ) = 2;
  44.        
  45.         if g==g_old
  46.             break
  47.         else
  48.             g_old = g;
  49.         end
  50.     end
  51.    
  52.     % wet sand inbetween wet-sand or clay turn into moving water
  53.     gLeft       = [zeros(size(g,1),1),g(:,1:end-1)];
  54.     gRight      = [g(:,2:end),zeros(size(g,1),1)];
  55.     g( g==2 & gRight==4  & gLeft==4 ) = 4;
  56.    
  57.     % wet sand inbetween moving water becomes resting water
  58.     gLeft       = [zeros(size(g,1),1),g(:,1:end-1)];
  59.     gRight      = [g(:,2:end),zeros(size(g,1),1)];
  60.     g( g==2 & (gRight==1 | gRight==2) & (gLeft==1 | gLeft==2 )) = 3;
  61.    
  62.     % moving water inbetween moving water becomes resting water
  63.     gLeft       = [zeros(size(g,1),1),g(:,1:end-1)];
  64.     gRight      = [g(:,2:end),zeros(size(g,1),1)];
  65.     g( g==4 & (gRight==1 | gRight==4) & (gLeft==1 | gLeft==4 )) = 3;
  66.    
  67.     % But resting water next to wet-sand is not possible, give new
  68.     % status (4) moving water can never stabilize
  69.     g_tmp = g;
  70.     while 1
  71.         gLeft       = [zeros(size(g,1),1),g(:,1:end-1)];
  72.         gRight      = [g(:,2:end),zeros(size(g,1),1)];
  73.         g( g==3 & (gRight==2 | gLeft==2 | gRight==4 | gLeft==4) ) = 4;
  74.         if g==g_tmp
  75.             break
  76.         else
  77.             g_tmp = g;
  78.         end
  79.     end
  80.     if g==g_old
  81.         break
  82.     else
  83.         g_old = g;
  84.     end
  85. end
  86. disp(sum(sum(g(minY+1:maxY+1,:)>1)))  %part 1
  87. disp(sum(sum(g(minY+1:maxY+1,:)==3))) %part 2
Advertisement
Add Comment
Please, Sign In to add comment