Генерация уникальных комбинаций для A, B, C с использованием Ruby или Javascript

1

У меня три группы:

Group A = 4
Group B = 8
Group C = 11

Для каждой группы, если я добавляю дополнительный элемент, например:

Group A = 4;
Group A Additional = 2;

Group B = 8;
Group B Additional = 3;

Group C = 10;
Group C Additional = 3;

Мне нужно добавить дополнительные в зависимости от того, сколько групп доступно. Пример:

A = 4
AA = 6 (4 + 2)
AAA = 8 (4 + 2 + 2) here I have A and 2 additional items

B = 8
BB = 11 (8 + 3)
BBB = 14 (8 + 3 + 3)

Same for C...

Мне нужно создать все возможные комбинации этих групп с правильными значениями.

Это должно быть результатом:

A, AA, AAA
B, BA, BAA, BB, BBA, BBB
C, CA, CAA, CB, CBA, CBB, CC, CCA, CCB, CCC

Если AAA равно 8 (4 + 2 + 2) и BBB = 14 (8 + 3 + 3), я хочу:

CBA to be 22 (10 + 8 + 4)
CBB to be (10 + 8 + 8)

и так далее.

Это то, что я сделал до сих пор.

items = [
  { :group => "A", :value=> 4, :add => 2 },
  { :group => "B", :value=> 8, :add => 3 },
  { :group => "C", :value=> 10, :add => 3 },
]

def process(items)
  array = []

  items.each_with_index do |item, index|
  counter = 0
    (1..3).each do |vari|
      el = item[:group] * vari

      if vari == 1 
        value = item[:value]
      else 
        value = item[:value] + (item[:add] * counter)
      end

      puts "#{el}:  #{value}"

      array.push(el)
      counter = counter + 1
    end
  end
  array
end

Он работает только для A, AA, AAA B, BB, BBB C, CC, CCC

Выход:

A:  4
AA:  6
AAA:  8
B:  8
BB:  11
BBB:  14
C:  10
CC:  13
CCC:  16

Может ли кто-нибудь помочь заполнить сценарий?

  • 0
    Я понимаю, как буквы должны быть преобразованы в число, но я не могу понять, где A, AA, AAA B, BA, BAA, BB, BBA, BBB C, CA, CAA, CB, CBA, CBB, CC, CCA, CCB, CCC происходит от. Это дано? Или вы рассчитываете это из A (4,2) B (8,3) C (10,3) каким-то образом?
Теги:
arrays
permutation
combinations

2 ответа

1

Вы можете использовать рекурсивный подход, указав индекс для следующего вызова функции.

Это решение принимает фиктивный элемент для получения одной или двойной комбинации.

function c(array, size) {

    function iter(i, p) {
        var temp = p.join('');
        if (i >= array.length) {
            return;
        }
        if (p.length === size) {
            temp && result.push(temp);
            return;
        }
        iter(i + 1, p);
        iter(i, p.concat(array[i]));
    }

    var result = [];
    iter(0, []);
    return result;
}

var values = { A: { value: 4, add: 2 }, B: { value: 8, add: 3 }, C: { value: 10, add: 3 } },
    combinations = c(['C', 'B', 'A', ''], 3),
    result = combinations.map(s => [...s].reduce(
        (r, k, i, a) => r + values[k][['value', 'add'][+(k === a[i - 1])]],
        0
    ));

console.log(combinations);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0

Просто из любопытства, рубин:

w = {:a=>[4, 2], :b=>[8, 3], :c=>[10, 3], nil =>[0, 0]}
[1, 2, 3].flat_map do |count|
  %i[a b c].repeated_combination(count).map do |a, b, c|
    [
      [a, b, c].join.upcase,
      a == b ? 
        w[a].first + (b == c ? w[a].last * 2 : w[a].last + w[c].first) :
        [w[a], w[b], w[c]].map(&:first).reduce(:+)
    ]
  end
end.to_h

#⇒ {"A"=>4, "B"=>8, "C"=>10,
#   "AA"=>6, "AB"=>12, "AC"=>14, "BB"=>11, "BC"=>18, "CC"=>13,
#   "AAA"=>8, "AAB"=>14, "AAC"=>16, "ABB"=>20, "ABC"=>22,
#      "ACC"=>24, "BBB"=>14, "BBC"=>21, "BCC"=>28, "CCC"=>16}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню