BonBonSlick
@BonBonSlick
Web Developer Trainee

Подсчет возможных комбинаций спрайтов в редакторе аватара / персонажа?

Есть 72 спрайтов с разными особенностями.
Они разделены на группы
5 - руки
10 - шапки
20 - голов
5 - ноги
12 - футболка
10 - обувь
10 - шорты

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

Условия:
Только 1 спрайты из группы может быть скомбинирован. То есть, голову можно выбрать 1, как и шапку, 2 шапки, головы или 2 пары ног быть не может.
Из чего следует что 1 голова может иметь все количество комбинаций - количество комбинаций из голов, то есть - 19 возможных вариантов. А в случае с руками будет - 4 т.к. 1 опцию мы вибарем текущую + 10 шапки + 20 голов и т..д.

Интересует формула подсчета с группировкой и как бы это выглядело программно, подойдет любой язык.
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
ayazer
@ayazer
Sr. Software Engineer
сумма = мощность прямого произведение всех можеств что у вас есть. т.е. S = A x B x C x ...., где A = {руки1, руки2, руки3, руки4, руки5}, B = {шапка1, шапка2 ...}, ...

формула простая - просто перемножаете мощность всех множеств что у вас есть. т.е. как писали в комментариях - 5 * 10 * 20 ...

сами группировки = само прямое прозведение. Т.к. в вашем случае у вас множества известны на входе, то нужно просто пробежаться по ним и собрать все возможные варианты. Выглядеть будет где-то так - https://github.com/novak-as/gimp-tileset-generator...

UPD:
Если вынести оттуда минимально необходимую часть (и выкинув усложнения не нужные в контексте этого примера) - выходит совсем немного

(define (push stack value)
  (append (list value) stack)
  )

(define (combine-list list1 list2)  
  (let combine-list ((set '()) (olist2 list2) (list1 list1) (list2 list2))
    (if (null? olist2)
        (if (null? list1)
            set
            (combine-list (push set (car list1)) olist2 (cdr list1) list2)
            )
        (if (null? list1)
            set
            (if (null? list2)
                (combine-list set olist2 (cdr list1) olist2)
                (if (list? (car list2))
                    (combine-list (push set (append (car list2) (list (car list1)))) olist2 list1 (cdr list2))
                    (combine-list (push set (list (car list2) (car list1))) olist2 list1 (cdr list2))
                    )
                )
            )
        )
    )
  )

(define (combine-groups groups)
  (let combine-groups ((result '()) (groups groups))
    (if (null? groups)
        result
        (combine-groups (combine-list (car groups) result) (cdr groups))
        )
    )
  )


с результатом

(combine-groups (list (list "head1" "head2" "head3") (list "body1" "body2" "body3") (list "left_hand_1" "left_hand_2") (list "right_hand_1" "right_hand_2")))

'(("head1" "body3" "left_hand_1" "right_hand_2")
  ("head2" "body3" "left_hand_1" "right_hand_2")
  ("head3" "body3" "left_hand_1" "right_hand_2")
  ("head1" "body2" "left_hand_1" "right_hand_2")
  ("head2" "body2" "left_hand_1" "right_hand_2")
  ("head3" "body2" "left_hand_1" "right_hand_2")
  ("head1" "body1" "left_hand_1" "right_hand_2")
  ("head2" "body1" "left_hand_1" "right_hand_2")
  ("head3" "body1" "left_hand_1" "right_hand_2")
  ("head1" "body3" "left_hand_2" "right_hand_2")
  ("head2" "body3" "left_hand_2" "right_hand_2")
  ("head3" "body3" "left_hand_2" "right_hand_2")
  ("head1" "body2" "left_hand_2" "right_hand_2")
  ("head2" "body2" "left_hand_2" "right_hand_2")
  ("head3" "body2" "left_hand_2" "right_hand_2")
  ("head1" "body1" "left_hand_2" "right_hand_2")
  ("head2" "body1" "left_hand_2" "right_hand_2")
  ("head3" "body1" "left_hand_2" "right_hand_2")
  ("head1" "body3" "left_hand_1" "right_hand_1")
  ("head2" "body3" "left_hand_1" "right_hand_1")
  ("head3" "body3" "left_hand_1" "right_hand_1")
  ("head1" "body2" "left_hand_1" "right_hand_1")
  ("head2" "body2" "left_hand_1" "right_hand_1")
  ("head3" "body2" "left_hand_1" "right_hand_1")
  ("head1" "body1" "left_hand_1" "right_hand_1")
  ("head2" "body1" "left_hand_1" "right_hand_1")
  ("head3" "body1" "left_hand_1" "right_hand_1")
  ("head1" "body3" "left_hand_2" "right_hand_1")
  ("head2" "body3" "left_hand_2" "right_hand_1")
  ("head3" "body3" "left_hand_2" "right_hand_1")
  ("head1" "body2" "left_hand_2" "right_hand_1")
  ("head2" "body2" "left_hand_2" "right_hand_1")
  ("head3" "body2" "left_hand_2" "right_hand_1")
  ("head1" "body1" "left_hand_2" "right_hand_1")
  ("head2" "body1" "left_hand_2" "right_hand_1")
  ("head3" "body1" "left_hand_2" "right_hand_1"))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы