Как рассчитать лексикографический ранг заданной перестановки

Например, в комнате 6 стульев и 4 девочки и 2 мальчика. Есть 15 уникальных возможных способов, которыми они могут сидеть на этих стульях.6!/(4!*2!)=15.

Моя проблема в том, чтобы найти эффективный способ рассчитать положение, в котором они могут сесть. Под положением я имею в виду следующее:

BBGGGG - possible position #1
BGBGGG - possible position #2
BGGBGG - possible position #3
BGGGBG - possible position #4
BGGGGB - possible position #5
GBBGGG - possible position #6
GBGBGG - possible position #7
GBGGBG - possible position #8
GBGGGB - possible position #9
GGBBGG - possible position #10
GGBGBG - possible position #11
GGBGGB - possible position #12
GGGBBG - possible position #13
GGGBGB - possible position #14
GGGGBB - possible position #15

Например, они выбирают позициюGBBGGG... На данный момент мое решение для расчета номера этой позиции (# 6) состоит в том, чтобы зациклить все возможные позиции и сравнить каждую из них с выбранным ордером и вернуть номер текущей позиции, если они равны.

В этом диапазоне из приведенного выше примера не представляет особой сложности циклическое объединение 15 возможных комбинаций, но если вы увеличите диапазон кресел и людей, этот метод будет далек от эффективности.

Есть ли какая-нибудь формула или более эффективный способ, которым я могу использовать, чтобы определить положение выбранной возможности? Не стесняйтесь использовать любой язык программирования в своих примерах.

ОБНОВИТЬЯ точно знаю, сколько стульев, мальчиков и девочек в комнате. Единственная проблема состоит в том, чтобы найти номер позиции, на которой они решили сесть.

Я использую сортировку в своем примере только для лучшей читаемости. Ответы с любым типом сортировки приветствуются.

Ответы на вопрос(5)

Ваш ответ на вопрос