Guest User

Untitled

a guest
Dec 17th, 2020
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 4.11 KB | None | 0 0
  1. clc
  2. clear
  3. close all
  4.  
  5. tic
  6. disp('starting...')
  7.  
  8. x = importdata('input.txt');
  9. z = expandZ4(cell2mat(x)=='#');
  10.  
  11. for i=1:6
  12.     s       = sumActiveNeighbours(z);
  13.     zNew1   =  z & ((s==2)|(s==3));
  14.     zNew2   = ~z & (s==3);
  15.     z       = zNew1 | zNew2;
  16.     z       = expandZ4(z);
  17. end
  18. disp(sum(sum(sum(sum(z)))))
  19.  
  20. toc
  21. disp('Finished')
  22.  
  23. %functions
  24. function z = expandZ4(z)
  25. % if any face of the shape contains nonzero elements, this function will
  26. % pad that face with an extra layer of zeros.
  27.  
  28. if any(any(any(z(:,:,:,1))))
  29.     zNew                     = false(size(z,1),size(z,2),size(z,3),size(z,4)+1);
  30.     zNew(:,:,:,2:size(z,4)+1)= z;
  31.     z                        = zNew;
  32. end
  33.  
  34. if any(any(any(z(:,:,:,end))))
  35.     zNew                     = false(size(z,1),size(z,2),size(z,3),size(z,4)+1);
  36.     zNew(:,:,:,1:size(z,4))  = z;
  37.     z                        = zNew;
  38. end
  39.  
  40. if any(any(any(z(1,:,:,:))))
  41.     zNew                     = false(size(z,1)+1,size(z,2),size(z,3),size(z,4));
  42.     zNew(2:size(z,1)+1,:,:,:)= z;
  43.     z                        = zNew;
  44. end
  45.  
  46. if any(any(any(z(end,:,:,:))))
  47.     zNew                     = false(size(z,1)+1,size(z,2),size(z,3),size(z,4));
  48.     zNew(1:size(z,1),:,:,:)  = z;
  49.     z                        = zNew;
  50. end
  51.  
  52. if any(any(any(z(:,1,:,:))))
  53.     zNew                     = false(size(z,1),size(z,2)+1,size(z,3),size(z,4));
  54.     zNew(:,2:size(z,2)+1,:,:)= z;
  55.     z                        = zNew;
  56. end
  57.  
  58. if any(any(any(z(:,end,:,:))))
  59.     zNew                     = false(size(z,1),size(z,2)+1,size(z,3),size(z,4));
  60.     zNew(:,1:size(z,2),:,:)  = z;
  61.     z                        = zNew;
  62. end
  63.  
  64. if any(any(any(z(:,:,1,:))))
  65.     zNew                     = false(size(z,1),size(z,2),size(z,3)+1,size(z,4));
  66.     zNew(:,:,2:size(z,3)+1,:)= z;
  67.     z                        = zNew;
  68. end
  69.  
  70. if any(any(any(z(:,:,end,:))))
  71.     zNew                     = false(size(z,1),size(z,2),size(z,3)+1,size(z,4));
  72.     zNew(:,:,1:size(z,3),:)  = z;
  73.     z                        = zNew;
  74. end
  75. end
  76.  
  77. function s = sumActiveNeighbours(z)
  78. N = getNeighbours4(z);
  79. s = 0;
  80. for i=1:size(N,1)
  81.     s = s + N{i};
  82. end
  83. end
  84.  
  85. function N = getNeighbours4(z)
  86.  
  87. N=cell(80,1);
  88. % returns the 80 neighbours(as cubes) in a cell
  89.  
  90. idx=1;
  91. for dir1=-1:1
  92.     for dir2=-1:1
  93.         for dir3=-1:1
  94.             for dir4=-1:1
  95.                 if ~(dir1==0 && dir2==0 && dir3==0 && dir4==0)
  96.                     N{idx} = shiftZ(shiftZ(shiftZ(shiftZ(z,1,dir1),2,dir2),3,dir3),4,dir4);
  97.                     idx=idx+1;
  98.                 end
  99.             end
  100.         end
  101.     end
  102. end
  103. end
  104.  
  105. function zNew = shiftZ(z,dim,dir)
  106. % shift by 1 on dimension dim(1/2/3/4), dir = 1 shifts one way, dir = -1 the other way, dir=0 does nothing;
  107. zNew=z;
  108. switch dim
  109.     case 1
  110.         if dir==1
  111.             zNew                = false(size(z,1),size(z,2),size(z,3),size(z,4));
  112.             zNew(1:end-1,:,:,:) = z(2:end,:,:,:);
  113.         elseif dir==-1
  114.             zNew                = false(size(z,1),size(z,2),size(z,3),size(z,4));
  115.             zNew(2:end,:,:,:)   = z(1:end-1,:,:,:);
  116.         end
  117.     case 2
  118.         if dir==1
  119.             zNew                = false(size(z,1),size(z,2),size(z,3),size(z,4));
  120.             zNew(:,1:end-1,:,:) = z(:,2:end,:,:);
  121.         elseif dir==-1
  122.             zNew                = false(size(z,1),size(z,2),size(z,3),size(z,4));
  123.             zNew(:,2:end,:,:)   = z(:,1:end-1,:,:);
  124.         end
  125.     case 3
  126.         if dir==1
  127.             zNew                = false(size(z,1),size(z,2),size(z,3),size(z,4));
  128.             zNew(:,:,1:end-1,:) = z(:,:,2:end,:);
  129.         elseif dir==-1
  130.             zNew                = false(size(z,1),size(z,2),size(z,3),size(z,4));
  131.             zNew(:,:,2:end,:)   = z(:,:,1:end-1,:);
  132.         end
  133.     case 4
  134.         if dir==1
  135.             zNew                = false(size(z,1),size(z,2),size(z,3),size(z,4));
  136.             zNew(:,:,:,1:end-1) = z(:,:,:,2:end);
  137.         elseif dir==-1
  138.             zNew                = false(size(z,1),size(z,2),size(z,3),size(z,4));
  139.             zNew(:,:,:,2:end)   = z(:,:,:,1:end-1);
  140.         end
  141.     otherwise
  142.         error('Incorrect dimension')
  143. end
  144. end
Advertisement
Add Comment
Please, Sign In to add comment