freeCodeCamp/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/set-consolidation.md

6.5 KiB
Raw Blame History

id title challengeType forumTopicId dashedName
5eb3e4af7d0e7b760b46cedc Встановлення консолідації 1 385319 set-consolidation

--description--

Дано два набори елементів. Якщо будь-який елемент є спільним для кожного набору, то результатом застосування consolidation до цих наборів стане множина наборів із таким змістом:

  • Два вхідних набори, якщо між двома вхідними наборами елементів немає спільного елемента.
  • Єдиний набір - це об'єднання двох вхідних наборів за умови існування спільного елементу між ними.

При N наборів елементів, де N > 2, результат буде таким самим, як і багаторазова заміна всіх комбінацій двох наборів їхньою консолідацією. Це триватиме доти, доки подальша консолідація між цими наборами стане неможливою. Якщо N < 2, тоді консолідація не має суворого значення, і вхідні дані можливо повернути.

Ось декілька прикладів:

Приклад 1:

Дано два набори {A,B} і {C,D}, між якими не існує спільного елементу. Результат буде таким самим, як вхідні дані.

Приклад 2:

Дано два набори {A,B} і {B,D}, які мають спільний елемент B між наборами. У такому випадку, результатом є єдиний набір {B,D,A}. (Зверніть увагу, що порядок елементів у наборі не істотний: {A,B,D} те саме, що {B,D,A} і {D,A,B}, etc).

Приклад 3:

Дано три набори {A,B}, {C,D} і {D,B}. Набори {A,B} і {C,D} не мають між собою спільних елементів. Набори {A,B} і {D,B} мають один спільний елемент, який сприяє їхньому об'єднанню для отримання результату {B,D,A}. Проаналізувавши результат з набором {C,D}, який залишився, стає зрозумілим, що вони мають спільний елемент, а тому об'єднуються в кінцевий результат єдиного набору {A,B,C,D}

Приклад 4:

Консолідація п'яти наборів:

{H,I,K}, {A,B}, {C,D}, {D,B} і {F,G,H}

Два набори:

{A, C, B, D} і {G, F, I, H, K}

--instructions--

Напишіть функцію, яка приймає масив рядків як параметр. Кожен рядок являє собою набір з символами, що представляють елементи набору. Функція повинна повернути 2D масив, що містить консолідовані набори. Примітка: Кожен набір необхідно відсортувати.

--hints--

setConsolidation має бути функцією.

assert(typeof setConsolidation === 'function');

setConsolidation(["AB", "CD"]) має повернути масив.

assert(Array.isArray(setConsolidation(['AB', 'CD'])));

setConsolidation(["AB", "CD"]) має повернути [["C", "D"], ["A", "B"]].

assert.deepEqual(setConsolidation(['AB', 'CD']), [
  ['C', 'D'],
  ['A', 'B']
]);

setConsolidation(["AB", "BD"]) має повернути [["A", "B", "D"]].

assert.deepEqual(setConsolidation(['AB', 'BD']), [['A', 'B', 'D']]);

setConsolidation(["AB", "CD", "DB"]) має повернути [["A", "B", "C", "D"]].

assert.deepEqual(setConsolidation(['AB', 'CD', 'DB']), [['A', 'B', 'C', 'D']]);

setConsolidation(["HIK", "AB", "CD", "DB", "FGH"]) має повернути [["F", "G", "H", "I", "K"], ["A", "B", "C", "D"]].

assert.deepEqual(setConsolidation(['HIK', 'AB', 'CD', 'DB', 'FGH']), [
  ['F', 'G', 'H', 'I', 'K'],
  ['A', 'B', 'C', 'D']
]);

--seed--

--seed-contents--

function setConsolidation(sets) {

}

--solutions--

function setConsolidation(sets) {
  function addAll(l1, l2) {
    l2.forEach(function(e) {
      if (l1.indexOf(e) == -1) l1.push(e);
    });
  }

  function consolidate(sets) {
    var r = [];
    for (var i = 0; i < sets.length; i++) {
      var s = sets[i];
      {
        var new_r = [];
        new_r.push(s);
        for (var j = 0; j < r.length; j++) {
          var x = r[j];
          {
            if (
              !(function(c1, c2) {
                for (var i = 0; i < c1.length; i++) {
                  if (c2.indexOf(c1[i]) >= 0) return false;
                }
                return true;
              })(s, x)
            ) {
              (function(l1, l2) {
                addAll(l1, l2);
              })(s, x);
            } else {
              new_r.push(x);
            }
          }
        }
        r = new_r;
      }
    }
    return r;
  }

  function consolidateR(sets) {
    if (sets.length < 2) return sets;
    var r = [];
    r.push(sets[0]);
    {
      var arr1 = consolidateR(sets.slice(1, sets.length));
      for (var i = 0; i < arr1.length; i++) {
        var x = arr1[i];
        {
          if (
            !(function(c1, c2) {
              for (var i = 0; i < c1.length; i++) {
                if (c2.indexOf(c1[i]) >= 0) return false;
              }
              return true;
            })(r[0], x)
          ) {
            (function(l1, l2) {
              return l1.push.apply(l1, l2);
            })(r[0], x);
          } else {
            r.push(x);
          }
        }
      }
    }
    return r;
  }

  function hashSetList(set) {
    var r = [];
    for (var i = 0; i < set.length; i++) {
      r.push([]);
      for (var j = 0; j < set[i].length; j++)
        (function(s, e) {
          if (s.indexOf(e) == -1) {
            s.push(e);
            return true;
          } else {
            return false;
          }
        })(r[i], set[i].charAt(j));
    }
    return r;
  }

  var h1 = consolidate(hashSetList(sets)).map(function(e) {
    e.sort();
    return e;
  });
  return h1;
}