Вот краткий обзор перестановок и комбинаций, а также методов, которые дает нам 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-м издании :)