Вот краткий обзор перестановок и комбинаций, а также методов, которые дает нам Ruby, которые делают этот код однострочным решением!

Перестановки

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

Перестановка обозначается следующей формулой:

Пример: количество возможных двузначных кодов, выбор из четырех следующих чисел [1,2,3,4], в которых две цифры разные и порядок имеет значение. является:

Ruby предоставляет нам простой метод#permutation

Вы можете просто вызвать этот метод для массива из n опций с r в качестве параметра.

[массив_n_параметров].permutation(r)

Этот метод вернул 12 массивов! Успех!

Важно отметить, что возврат:

[1,2] отличается от [2,1] …

[1,3] отличается от [3,1]… и так далее… потому что порядок имеет значение!!

Примечание. В этом примере кода вы увидите использование .to_a после методов перестановки и комбинирования. Это связано с тем, что если вы исключите .to_a, возврат по умолчанию для этого метода будет перечислимым, как показано ниже. Документация Ruby демонстрирует использование .to_a для преобразования возвращаемого значения в массив, что делает его более полезным.

Комбинации

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

Комбинация обозначается следующей формулой:

Пример:количество возможных двузначных кодов, выбор из четырех следующих чисел [1,2,3,4], в которых две цифры различны и упорядочены не имеет значения:

Ruby предоставляет нам #combination метод.

Как и в случае с перестановками, вы можете вызвать метод комбинации для массива из n опций с r в качестве параметра.

[массив_n_параметров].combination(r)

Этот метод вернул только 6 массивов! Поскольку порядок не имеет значения, мы убрали все дубликаты, и осталось только 6 возможных вариантов.

Как насчет перестановок и комбинаций с заменой?

У Ruby есть два дополнительных метода, которые мы можем использовать!

#repeated_permutation (Документация по Ruby здесь)

#repeated_combination (Документация по Ruby здесь)

При внимательном рассмотрении приведенного выше кода видно, что метод Repeat_Permutation возвращает всего 16 массивов, а Repeat_combination возвращает всего 10 массивов. Почему?

Поскольку эти методы допускают замену — таким образом, добавление 4 массивов в каждом методе — это [1,1], [2, 2], [3, 3] и [4, 4]. Аккуратный!

Заключение

Размышляя о том, какой метод подходит для вашей проблемы, разбейте его на два вопроса, которые вам нужно задать себе:

1) Заказные или не заказанные?

2) С заменой или без?

Как только вы ответите на эти 2 вопроса, вы сможете выбрать правильный метод Ruby для своей проблемы.

Надеюсь, это поможет и счастливого кодирования!

-Элла

Использованная литература:

["один"]

["два"]

[три] Хогг, Р.В., и Танис, Э.А. (nd). Вероятность и статистический вывод (8-е изд.)

К вашему сведению: приведенный выше учебник — это тот, который у меня есть из колледжа (и он потрясающий), но если вас интересует последнее издание, в настоящее время оно находится в 10-м издании :)