Я только что быстро написал это в Ruby:
def perms(x, y, possible_characters)
all = [""]
current_array = all.clone
1.upto(y) { |iteration|
next_array = []
current_array.each { |string|
possible_characters.each { |c|
value = string + c
next_array.insert next_array.length, value
all.insert all.length, value
}
}
current_array = next_array
}
all.delete_if { |string| string.length < x }
end
Вы можете заглянуть в языковой API для встроенных функций типа перестановки, и вы сможете написать более оптимизированный код, но если числа слишком велики, я не уверен, что есть много способов обойти много результатов.
В любом случае, идея кода заключается в том, чтобы начать со строки длины 0, а затем отслеживать все строки длины Z, где Z - текущий размер в итерации. Затем просмотрите каждую строку и добавьте каждый символ в каждую строку. Наконец, в конце удалите все, что было ниже порога x, и верните результат.
Я не проверял его с потенциально бессмысленным вводом (нулевой список символов, странные значения x и y и т. Д.).