Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- x = importdata('input.txt');
- z = zeros(size(x,1),4);
- for i=1:size(x,1)
- p = strrep(x{i},'..',',');
- t = sscanf(p,'x=%f, y=%f,%f');
- if isempty(t)
- t = sscanf(p,'y=%f, x=%f,%f');
- z(i,:)=[t(2),t(3),t(1),t(1)];
- else
- z(i,:)=[t(1),t(1),t(2),t(3)];
- end
- end
- minX = min(min(z(:,1:2)));
- minY = min(min(z(:,3:4)));
- maxX = max(max(z(:,1:2)));
- maxY = max(max(z(:,3:4)));
- % 0 = sand, 1 = clay, 2 = wet sand, 3 = resting water, 4 = moving water
- g = zeros(maxY+1,maxX-minX+3);
- g(1,500-minX+2) = 2; % source
- for i=1:L
- g(z(i,3)+1:z(i,4)+1,z(i,1)-minX+2:z(i,2)-minX+2)=1;
- end
- g_old = g;
- while 1
- g_old = g;
- while 1
- % dry sand under wet sand becomes wet sand
- gUP = [zeros(1,size(g,2));g(1:end-1,:)];
- g( g==0 & gUP==2 ) = 2;
- % dry sand next to wet sand on left that is above clay or resting water becomes wet sand
- gLeft = [zeros(size(g,1),1),g(:,1:end-1)];
- gLeftDown = [gLeft(2:end,:);zeros(1,size(gLeft,2))];
- g( g==0 & gLeft==2 & (gLeftDown==1 | gLeftDown==3) ) = 2;
- % dry sand next to wet sand on right that is above clay becomes wet sand
- gRight = [g(:,2:end),zeros(size(g,1),1)];
- gRightDown = [gRight(2:end,:);zeros(1,size(gRight,2))];
- g( g==0 & gRight==2 & (gRightDown==1 | gRightDown==3 ) ) = 2;
- if g==g_old
- break
- else
- g_old = g;
- end
- end
- % wet sand inbetween wet-sand or clay turn into moving water
- gLeft = [zeros(size(g,1),1),g(:,1:end-1)];
- gRight = [g(:,2:end),zeros(size(g,1),1)];
- g( g==2 & gRight==4 & gLeft==4 ) = 4;
- % wet sand inbetween moving water becomes resting water
- gLeft = [zeros(size(g,1),1),g(:,1:end-1)];
- gRight = [g(:,2:end),zeros(size(g,1),1)];
- g( g==2 & (gRight==1 | gRight==2) & (gLeft==1 | gLeft==2 )) = 3;
- % moving water inbetween moving water becomes resting water
- gLeft = [zeros(size(g,1),1),g(:,1:end-1)];
- gRight = [g(:,2:end),zeros(size(g,1),1)];
- g( g==4 & (gRight==1 | gRight==4) & (gLeft==1 | gLeft==4 )) = 3;
- % But resting water next to wet-sand is not possible, give new
- % status (4) moving water can never stabilize
- g_tmp = g;
- while 1
- gLeft = [zeros(size(g,1),1),g(:,1:end-1)];
- gRight = [g(:,2:end),zeros(size(g,1),1)];
- g( g==3 & (gRight==2 | gLeft==2 | gRight==4 | gLeft==4) ) = 4;
- if g==g_tmp
- break
- else
- g_tmp = g;
- end
- end
- if g==g_old
- break
- else
- g_old = g;
- end
- end
- disp(sum(sum(g(minY+1:maxY+1,:)>1))) %part 1
- disp(sum(sum(g(minY+1:maxY+1,:)==3))) %part 2
Advertisement
Add Comment
Please, Sign In to add comment