Я просто сделал это на скорую руку быстрое в 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, и т.д.).
Давайте рассмотрим шаг за шагом.
void(*)()
Это указатель на функцию, которая принимает неуказанные аргументы и не имеет возвращаемого значения.
(void(*)())buf
просто приводит buf к этому типу указателя функции. Наконец,
((void(*)())buf)();
вызывает эту функцию.
Таким образом, весь оператор «интерпретирует buf
как указатель на функцию void
без аргументов и вызывает эту функцию».
Он преобразует buf
в указатель функции типа void (*) ()
(функция, не возвращающая ничего / void и принимающая неопределенные аргументы) и вызывает ее.
Стандарт ANSI на самом деле не позволяет преобразовывать обычные указатели данных в указатели на функции, но ваша платформа может это разрешить.
Приводит buf
к типу void (*) ()
, указателю на функцию, которая принимает неуказанные параметры и ничего не возвращает. Затем он вызывает функцию по этому адресу (две крайние правые скобки).
((void(*)())buf)(); \------------/ cast `buf` to \---------/ type: pointer to function accepting a fixed but unspecified number of arguments and returning void \----------------/ and call that "function"
Я обычно использую команду "cdecl", когда сталкиваюсь с ошеломляющим заявлением. Пример:
[me@machine]$ cdecl
Type `help' or `?' for help
cdecl> explain (void(*)())buf
cast buf into pointer to function returning void
Хотя есть случаи, когда я действительно хочу, чтобы там был инструмент, объясняющий вывод "cdecl": /
Он преобразует buf
в указатель функции, который принимает неуказанные аргументы и вызывает его.
Я предполагаю, что во многих случаях это приводит к сбою машины. В противном случае он рассматривает массив как указатель на функцию, которая возвращает void, и вызывает ее.
Вы можете найти "опытное программирование на c" хорошим чтением - распаковка такого рода вещей находится в одной из глав, если я правильно помню. Я давно его не читал, но помню, что в то время думал, что это того стоило. http://www.amazon.com/Expert-Programming-Peter-van-Linden/dp/0131774298
вызывает указатель функции. функция не имеет аргументов.
Существует онлайн-версия инструмента 'cdecl', которую lsc упомянула и которая может оказаться полезной: http://www.cdecl.org/