fork download
  1. function c = unique_stable(a)
  2. [c, ~, ic] = unique(a);
  3. ia = arrayfun(@(n) find(ic == n)(1), 1:numel(c));
  4. c = a(sort(ia));
  5. end
  6. function b = unionize_if_intersect(b)
  7. if size(b, 1) < 2, return, end
  8. for ij = nchoosek(1:size(b, 1), 2)'
  9. if any(b(ij(1), :) & b(ij(2), :))
  10. b(ij(1), :) = b(ij(1), :) | b(ij(2), :);
  11. b(ij(2), :) = [];
  12. b = unionize_if_intersect(b);
  13. break
  14. end
  15. end
  16. end
  17. function c = f(a)
  18. u = unique_stable(cell2mat(cellfun(@(s) {strsplit(s, "=")}, a)));
  19. s2b = @(s) any(cell2mat(cellfun(@(k) {strcmp(u, k)}, strsplit(s, "=")')));
  20. b = unionize_if_intersect(cell2mat(cellfun(@(s) {s2b(s)}, a')));
  21. c = arrayfun(@(r) {u(b(r, :))}, 1:size(b, 1)');
  22. end
  23. a = {"a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2", ...
  24. "a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1", ...
  25. "b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"};
  26. disp(['[' strjoin(cellfun(@(s) {['["' strjoin(s, '", "') '"]']}, f(a)), ', ') ']'])
Success #stdin #stdout 0.13s 47172KB
stdin
Standard input is empty
stdout
[["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"], ["c1", "c2", "c3", "c4", "d1", "d2", "d3"], ["e1", "e2", "e3"]]