Guest User

Untitled

a guest
Dec 7th, 2020
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 1.58 KB | None | 0 0
  1. clc
  2. clear
  3. close all
  4.  
  5. tic
  6. disp('starting...')
  7.  
  8. %Parsing into struct
  9. x = importdata('input.txt');
  10. L = size(x,1);
  11. for i=1:L
  12.     z  = strsplit(x{i}(1:end-1),',');
  13.     z1 = strsplit(z{1},' bags contain ');
  14.     bags.(erase(z1{1},' ')) = {erase(z1{2}(3:end-4),' '),str2double(z1{2}(1))};
  15.     for j=2:size(z,2)
  16.         bags.(erase(z1{1},' '))(end+1,:) = {erase(z{j}(3:end-4),' '),str2double(z{j}(2))};
  17.     end
  18. end
  19.  
  20. %Part A:
  21. parentBags  = getParentBags(bags,'shinygold');
  22. cnt         = size(parentBags,2);
  23. while 1
  24.     newParents = {};
  25.     for k=1:size(parentBags,2)
  26.         newParents = [newParents, getParentBags(bags,parentBags{k})];
  27.     end
  28.     parentBags=unique([parentBags,newParents]);
  29.     if size(parentBags,2)==cnt % No new parents found
  30.         break
  31.     else
  32.         cnt=size(parentBags,2);
  33.     end
  34. end
  35. disp(cnt)
  36.  
  37. %Part B
  38. disp(getNumberOfChildBags(bags,'shinygold'))
  39.  
  40. toc
  41. disp('Finished')
  42.  
  43. % functions
  44. function parentBags = getParentBags(bags,childname)
  45.     % Returns cell array with bags that can contain the child directly
  46.     parentBags = {};
  47.     fnames = fieldnames(bags);
  48.  
  49.     for i=1:size(fnames,1)
  50.         z = bags.(fnames{i});
  51.         for j=1:size(z,1)
  52.             if strcmp(z{j,1},childname)
  53.                 parentBags{end+1}= fnames{i};
  54.             end
  55.         end
  56.     end
  57. end
  58.  
  59. function N = getNumberOfChildBags(bags,parentBag)
  60.     N = 0;
  61.     z = bags.(parentBag);
  62.     if isnan(z{1,2}) % end of the line, no more bags
  63.         return
  64.     end
  65.     for k=1:size(z,1)
  66.         N = N + z{k,2} + z{k,2} * getNumberOfChildBags(bags,z{k,1});
  67.     end
  68. end
Advertisement
Add Comment
Please, Sign In to add comment