|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Брутфорс на лиспе.
Инженер-строитель
Киров
Регистрация: 15.08.2007
Сообщений: 2,204
|
||
Просмотров: 3009
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,451
|
А что будет, если символы повторяются?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
Символы - это просто как буквы алфавита. Они не повторяются.
Применительно к предыдущему примеру можно сказать, что я хочу перебрать все варианты слова, написанного на языке, алфавит которого содержит только буквы "а" "b" и "c". Но только того слова, которое состоит из 2-х букв. Кстати из примера наглядно видно, что если n - количество символов перебора, k - количество букв в слове, то количество всех возможных слов будет k^n n^k В том примере слов получилось 2^3=8 3^2=9. Последний раз редактировалось Makswell, 02.07.2010 в 07:41. Причина: перепутал немного |
|||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
CB, спасибо, для "2-х буквенных слов" работает прекрасно.
Никак не могу переделать логику твоего кода на произвольное число "букв" в слове. Если брать 1-й пост. Входит так: ("aa" "ab" "ac" "ba" "bb" "bc" "ca" "cb" "cc") Если изменить условие - длина слова 3 символа, то вроде решение складывается из решения 1 с добавлением к нему каждого из заданных символов. Добавляем "а" ("aaa" "aab" "aac" "aba" "abb" "abc" "aca" "acb" "acc") Добавляем "b" ("baa" "bab" "bac" "bba" "bbb" "bbc" "bca" "bcb" "bcc") Добавляем "с" ("сaa" "сab" "сac" "сba" "сbb" "сbc" "сca" "сcb" "сcc") Сливаем всё это в один список и получаем ответ. при n=3 (а" "b" "c) и к=3, список всех вариантов: ("aaa" "aab" "aac" "aba" "abb" "abc" "aca" "acb" "acc" "baa" "bab" "bac" "bba" "bbb" "bbc" "bca" "bcb" "bcc" "сaa" "сab" "сac" "сba" "сbb" "сbc" "сca" "сcb" "сcc") И по идее вроде бы как логика такая выстраивается. Т.е. при к=4, берём решение при к=2, добавляем к нему по каждому из символов и получаем предыдуший ответ. Потом к этому ответу добавляем по каждому из символов и всё. Ну и так далее, при любом k. То есть вроде логика-то одна и та же, а значит она может сложиться в некую функцию. Интуитивно догадываюсь, что здесь не обойтись без рекурсии. |
|||
![]() |
|
||||
Moderator
Конструктор (машиностроение) Регистрация: 23.10.2006
Россия
Сообщений: 23,297
![]() |
|
|||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
Да, вроде про это. Насколько я понял, я хочу реализовать частный случай - "Размещение с повторениями".
Теорию-то я вроде понял (хотя в комбинаторике понимаю чуть менее, чем ничего))) ), даже формулу вывел для размещения с повторениями - n^k. Но вот с программной реализацией зашёл в тупик. О языках, на которых даны примеры в Вики, у меня представления вообще никакого. Как это переделать на лисп, пока не представляю. Offtop: З.Ы. Хотя вот чего переделывать, если например в Haskell'е, насколько я вижу, есть специально заточенные под это функции. Вся программа: import Control.Monad permutationsWithRepetition xs = iterate (liftM2 (:) xs) [[]] И пожалуйста, перебирай как хочешь: Prelude> take 4 (permutationsWithRepetition "ab") [[""],["a","b"],["aa","ab","ba","bb"],["aaa","aab","aba","abb","baa","bab","bba","bbb"]] Только подставляй вместо числа 4 и набора "ab" свои данные. Последний раз редактировалось Makswell, 02.07.2010 в 10:54. Причина: Задолбался с парсером воевать ))) |
|||
![]() |
|
||||
Регистрация: 21.07.2008
Луцьк
Сообщений: 179
|
|
|||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
Немного модифицировал твой код:
Код:
(На самом деле в такой форме (в виде списка из списков символов) для меня как раз удобней, чем в виде списка из строк.) Так вот, я протестировал эти 2 кода всем известной программой BenchMark. Результаты. Цитата:
|
|||
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как правильно дописать команду на лиспе, чтобы не выходя в ком.строку поделить дугу эллипса | solo123 | LISP | 2 | 03.11.2009 20:30 |
Как создать каталог в Лиспе | nik_mb | LISP | 5 | 23.03.2009 23:05 |
помогите решить задачку на ЛИСПе? | Nastya_Cher | LISP | 2 | 21.03.2007 22:58 |
Есть несколько примочек к AutoCAD R14 (на ЛИСПе). | insceneman | AutoCAD | 3 | 22.07.2005 16:06 |
Тип линии в лиспе | VVV | LISP | 2 | 19.03.2004 22:05 |