|
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 11
|
|
Определите функцию, которая порождает множество всех непустых подпоследовательностей для заданной строки11.04.2013, 14:56. Показов 4003. Ответов 20
Метки нет (Все метки)
Всем привет!
Для выполнения институтского задания необходимо написать 6 функций на хаскеле, из них 3 я написал сам, а вот с остальными тремя вообще непонятно. Хотелось бы помощи в том, чтобы вы подтолкнули меня к самостоятельному решению задачи, а именно куда копать, а не предоставили конечный вариант решения сразу, просто так не интересно... вот сами задачи: 1)Определите функцию, которая порождает множество всех непустых подпоследовательностей для заданной строки. 2)Определите функцию, которая для заданного n определяет число возможных расстановок n ферзей на шахматное доске n x n так, чтобы ферзи не били друг друга. 3)Определите функцию, которая для заданного набора чисел и заданного числа n строит все возможные способы получения заданного числа n из заданного набора с помощью операций +, * и взятия в скобки. по первой задаче ступор - вот есть строка "ABC" - получается множество подпоследовательностей "A", "B", "C", "AB", "AC", "BC", "BA", "BC" ... и так далее... как посчитать множество всех вариантов? и вообще куда копать? по второй задаче - это получается задача о расстановке ферзей на доске, в википедии я статью эту читал, но как сделать так, чтобы функция возвращала количество постановок? можно ведь перебором, но как то неспортивно. по третьей задаче есть идея - взять число, разбить на произведение простых чисел, затем каждое число получить из списка изначально заданных, но как? у меня ощущение что я что то упустил значительное в функциональном программировании или шаблоны императивных языков программирования прочно въелись в мой мозг. за помощь заранее благодарен.
0
|
|
| 11.04.2013, 14:56 | |
|
Ответы с готовыми решениями:
20
Разработать функцию,которая перекрывает символы строки заданным количеством символов другой строки, начиная с заданной позиции |
|
|
|
| 11.04.2013, 19:10 | |
|
Первая.
AC не является подпоследовательностью ABC, по меньшей мере в моём понимании. Подпоследовательности ABC — A, B, C, AB, BC, ABC и пустая, всего их 7. Я бы делал так (вариант с привлечением арифметики): Подпоследовательность строки однозначно задаётся числом (двумя неотр. числами) букв, которые следует выбросить с начала и с конца, чтоб из исходной строки получить рассматриваемую подстроку. Например, BC как подстрока ABCD задаётся числами (1,1), а D — парой (3,0). Обратно справедливо с поправкой: пара (n,m) строки s задаёт подпоследовательность, если n+m < length(s). Кроме того возможна неоднозначность за счёт множественного вхождения одной подстроки: AB в ABCAB входит дважды. Посему множество подпоследовательностей строки — это множество всех пар чисел, которые удовл. условию n+m < length(s). Отдельно решается вопрос об удалении копий. Можно придумать вариант без арифметики, чисто на рекурсии, когда множество подстрок строки длины L определяется через множество подстрок подстроки длины (L-1). Вторая. Расставьте сначала ладьи, чтоб с диагональным перекрытием не мучаться. Выведите список всех расстановок. Выведите количество расстановок. Обобщите до ферзей, введением в нужное место фильтр на те расстановки [новодобавленной фигуры, если есть рекурсия по строке/столбцу, иначе на финальные расстановки всех n фигур], которые нарушают диагонали.
1
|
|
|
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 11
|
||||||
| 10.05.2013, 16:51 [ТС] | ||||||
|
это снова я.
с первой задачей разобрался... со второй разбираюсь с третьей - заменил на расстановку слонов, аналогично ферзям Добавлено через 2 часа 10 минут
следующие действия таковы - из этой расстановки я буду удалять по 1 слону и искать альтернативные расстановки... как мне написать экземпляр класса Num для Chess_fig?
0
|
||||||
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||
| 10.05.2013, 18:23 | ||
|
Задача о ферзях (N-Queens Problem) довольно легко решается с помощью перебора с возвратом (Backtracking).
Для решения задачи будет полезно сначала определить функцию, которая принимает позиции p1 и p2 и проверяет, бьет ли фигура, находящаяся на позиции p1, фигуру на позиции p2. Эта функция — то единственное, что будет отличать задачу о расстановке ферзей от задачи расстановки слонов (или других фигур), поэтому я не вижу смысла решать другие задачи перед тем, как приступать к задаче расстановке ферзей. Алгоритм задачи прост. Разобьем задачу на N шагов, на каждом k-том шаге будем искать все варианты расстановки ферзя на k-тую диагональ таким образом, чтобы этот ферзь не бил никакого из ферзей, выбранных на предыдущих шагах. Если это условие выполняется, мы переходим к следующему шагу, запоминая этот вариант, в противном случае откатываемся назад. Решение задачи упростится, если вспомнить, что список как монада представляет собой модель недетерминированных вычислений, что само по себе предоставляет средства для «выбора варианта» и «отката назад», про которые я говорил в описании алгоритма. PS. В идиоматическом коде на Haskell используется lowerCamelCase для именования функций и UpperCamelCase для типов данных и классов. В общем, hlint — твой друг.
1
|
||
|
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 11
|
|
| 10.05.2013, 18:51 [ТС] | |
|
О! Класс!!!
Так понимаю следующее: берем размер доски n у нас получается на первом шаге n*n вложенных списков в каждом из которых по 1 слону или ферзю дальше к каждому списку добавляем по 1 ферзю или слону - то из 1 списка получается еще дофига списков... где-то мы не можем дальше работать - удаляем варианты и в конце получаем дофига расстановок так? хотя нет, берем ставим ферзя, затем еще, еще , если не получается - возвращаемся... как сделать возврат? я так понимаю, что без знаний о монадах я не справлюсь?
0
|
|
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|||
| 10.05.2013, 19:27 | |||
|
Так вот, на первом шаге этот список пуст. Мы выбираем один из вариантов расположения первого ферзя на первой горизонтали: (1, 1), (1, 2), ..., (1, n - 1), (1, n). Для каждого варианта проверяем, допустим ли он с учетом частичных решений полученных на предыдущем шаге (очевидно, что в данном случае все варианты подходят, т.к. список частичных результатов еще пуст). Переходим ко второму шагу. На втором шаге список частичных решений следующий: [[(1, 1)], [(1, 2)], ..., [(1, n - 1)], [(1, n)]]. Выбираем один из вариантов расположения второго ферзя на второй горизонтали: (2, 1), (2, 2), ..., (2, n - 1), (2, n). Теперь для каждого варианта и для каждого частичного решения проверяем, подходит ли вариант к частичному решению. И т.д.
0
|
|||
|
Супер-модератор
|
||||||
| 10.05.2013, 20:07 | ||||||
|
О подпоследовательностях. Фактически - это задача о генерации всех подмножеств конечного множества. Из комбинаторики известно, что для множества из n элементов, множество всех подмножеств содержит 2n (включая и пустое множество!). Вот простая функция, генерирующая все подмножества для строки:
1
|
||||||
|
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 11
|
||||||||||||
| 11.05.2013, 01:53 [ТС] | ||||||||||||
Catstail, у меня такое решение
если честно я до конца не понял вот есть доска 4 на 4 ставим ферзи первая итерация - на 0-й вертикали ставятся по 1 ферзю - получаем 4 частичных решения по 1 ферзю в каждой вторая итерация - на 1-й вертикали ставятся по 1 ферзю - получаем для каждого решения первой итерации по 1-2 доп варианта - итого получается 2 + 1 + 1 + 2 = 6 частичных решений третья итерация - на 2-й вертикали ставим ферзи - часть решений не прокатывает - отбрасываем. четвертая итерация - на 3-й вертикалии ставим ферзи... должно получиться 2 расстановкии. Просто можно же забацать функцию с аккумулятором где будет храниться список из расстановочных списков, а решения, не имеющие продолжения - удалять. А в чем прикол монад? Как тогда с ними сделать?
0
|
||||||||||||
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||
| 11.05.2013, 04:41 | ||||
|
> (((a - b) == (c-d)) || ((a + b) == (c + d))))
Проверка диагонали неправильная. Один ферзь бьет другого по диагонали, если разница их горизонтальные координаты отличаются на такую же величину, как и вертикальные. hint: посмотри в сторону функции abs.
0
|
||||
|
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 11
|
||||||
| 11.05.2013, 13:12 [ТС] | ||||||
|
проверку диагонали исправил
теперь надо подумать как организовать цикл от 0 до size-1 и готово а по слонам не совсем понятно. просто фишка в том, что слоны не бьют по вертикалям и горизонталям и поэтому на 1 горизонталь можно уместить все n слонов, а можно и 1 - как тогда быть?
0
|
||||||
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||
| 11.05.2013, 13:20 | ||||
|
Вместо определения mzero и guard просто импортируй Control.Monad, они там уже определены. PS. Твое решение все больше и больше напоминает мое ☺
0
|
||||
|
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 11
|
||||||
| 11.05.2013, 13:29 [ТС] | ||||||
так как решить задачу с размещением слонов? - функция проверки будет другой. дальше может ставить не по диагонально, а использовать все варианты?
0
|
||||||
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
| 11.05.2013, 13:38 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 11
|
|
| 11.05.2013, 13:48 [ТС] | |
|
так... с ферзями окончательно разобрался, все работает!!!
сейчас попробую написать слонов... так реально, то что слоны будут по вертикалям расфасовываться - это как то неправильно вроде, или я не дооцениваю всю мощь хаскеля?))
0
|
|
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||
| 11.05.2013, 13:54 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 11
|
|
| 11.05.2013, 14:02 [ТС] | |
|
да, а мне надо расставить n слонов на доске n*n... ладно, сейчас проверю кодом
0
|
|
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||||||||
| 11.05.2013, 14:10 | ||||||||||||
|
Вот, кстати, мое решение, оно получилось эквивалентным:
Вот, к примеру, на доске 4x4 можно как минимум 6 слонов разместить:
0
|
||||||||||||
|
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 11
|
|
| 11.05.2013, 14:13 [ТС] | |
|
мне нужно решить 2 задачи из 4-х на выбор.
количество расстановок n ферзей или коней или слонов на доске n*n или получить число из списка чисел с помощью операций + * и ( ) всеми возможными способами
0
|
|
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
| 11.05.2013, 14:20 | |
|
T-90SM, боюсь, данный алгоритм будет искать способ расставить максимальное число фигур на доске заданного размера. Можно попробовать ограничить длину списка-решения числом n, это даст нам ограничение на число фигур. Но мне кажется, при этом мы получим не все возможные решения.
0
|
|
|
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 11
|
||||||
| 11.05.2013, 15:29 [ТС] | ||||||
|
не... я думаю, что за каждую итерацию просто по 1 фигуре добавлять и все. и вариантов для подстановки предлагать n*n штук в каждом шаге.
Добавлено через 27 минут
для размера 2 выводит нормально, а для размера 3 - 33 расстановки - многовато... я так понял, что надо просто из вариантов выбора выбрасывать уже расставленные фигуры, а то ведь получается, что слон 0 0 и слон 0 1 - первая итерация, а вторая слон 0 0, слон 0 1 и слон 0 1 слон 0 0 - это неправильно... либо надо все расставить в конце и удалить лишнее, либо что то еще. Добавлено через 35 минут Nameless One, огромное спасибо за помощь!!!
0
|
||||||
| 11.05.2013, 15:29 | |
|
Помогаю со студенческими работами здесь
20
Написать функцию str(t), которая в заданном текстовом файле t подсчитывает количество непустых строк
SFML Audio порождает множество ошибок Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes.
А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения
развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|