Форум программистов, компьютерный форум, киберфорум
Наши страницы
Haskell
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Apcy
1 / 1 / 0
Регистрация: 08.10.2017
Сообщений: 8
1

Функционалы + генераторы списков

19.10.2017, 21:26. Просмотров 1153. Ответов 11

Шахматная фигура на доске PieceChess описывается ее названием (Title) (см. словарь) и координатами клетки – парой вида (‘а’, 7). Текущее положение фигур на доске – список chessGame, в котором каждой фигуре соответствует цвет. Разработайте соответствующий тип данных и напишите функции:
a) numberChessmen, возвращающую кол-во фигур заданного цвета на доске;
b) positionsByColor, возвращающую список занятых позиций фигурами заданного цвета;
c) isEmpty, проверяющую свободна ли заданная клетка;
d) pieceByPosition, возвращающую цвет и название фигуры на заданной позиции;
e) changeChessGame изменение положения на доске в результате хода фигуры заданного цвета на заданную клетку, причем эта позиция не должна быть занята своей фигурой. Если она занята чужой, то производится замена чужой на передвинутую свою.
1
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.10.2017, 21:26
Ответы с готовыми решениями:

Написать программу, которая получает список из списков из списков чисел
Всем привет, мне нужно написать программу, которая получает список из списков из списков чисел,...

Генераторы списков
Небольшой вопрос по теме. Есть код. bookdirs = bs = bs = import os bs = fs = for b in...

Форматирование строк и генераторы списков
Доброго времени суток. Задача очень легка, вывести таблицу умножения на определенное число,...

Функции генераторы и выражения генераторы
Всем доброго времени суток, изучаю такую тему как Функции-генераторы и появился вопрос, для чего...

Функционалы
Добрый день. Задание: Используя функционалы, напишите функцию, которая из данного списка строит...

11
Catstail
Модератор
24916 / 12640 / 2312
Регистрация: 12.02.2012
Сообщений: 20,576
19.10.2017, 23:53 2
Лучший ответ Сообщение было отмечено Apcy как решение

Решение

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
data Color = Black | White deriving (Eq,Show)
data PieceChess = PieceChess { name :: String, coord :: (Char,Int), color :: Color } deriving (Eq,Show)
 
-- numberChessmen, возвращающую кол-во фигур заданного цвета на доске
 
numberChessmen :: [PieceChess] -> Color -> Int
numberChessmen pcs c = length $ filter (\ x -> (color x)==c ) pcs
 
-- positionsByColor, возвращающую список занятых позиций фигурами заданного цвета
 
positionsByColor :: [PieceChess] -> Color -> [(Char,Int)]
positionsByColor pcs c = map coord $ filter (\ x -> (color x)==c) pcs
 
-- isEmpty, проверяющую свободна ли заданная клетка
 
isEmpty :: [PieceChess] -> (Char,Int) -> Bool
isEmpty pcs cc = null $ filter (\ x -> (coord x) == cc ) pcs
 
-- pieceByPosition, возвращающую цвет и название фигуры на заданной позиции;
 
pieceByPosition :: [PieceChess] -> (Char,Int) -> Maybe String
pieceByPosition pcs cc = if (null w) then Nothing else Just $ (name . head) w ++ " " ++ (show . color . head) w
                          where w=filter (\ x -> (coord x) == cc ) pcs
                                
-- changeChessGame изменение положения на доске в результате хода фигуры заданного цвета на заданную клетку, 
-- причем эта позиция не должна быть занята своей фигурой. Если она занята чужой, то производится замена чужой
-- на передвинутую свою.                                  
 
changeChessGame :: [PieceChess] -> PieceChess -> (Char,Int) -> Maybe [PieceChess]
changeChessGame pcs pp c | isEmpty pcs c = Just $ PieceChess {name=mname, coord=c, color=mcolor} : xcs
                         | mcolor /= pcolor = Just $ PieceChess {name=mname, coord=c, color=mcolor} : zcs
                         | otherwise = Nothing                         
                           where xcs=filter (/= pp) pcs
                                 zcs=filter (/= pp) $ filter (\ x -> (coord x) /= c) pcs  
                                 mcolor=(color pp)
                                 mname =(name pp)
                                 pcolor = (color . head) $ filter (\ x -> (coord x) == c) pcs
3
Curry
2991 / 2072 / 257
Регистрация: 01.06.2013
Сообщений: 4,526
Записей в блоге: 9
20.10.2017, 09:34 3
Catstail, генераторов списков нет. Например так
Haskell
1
positionsByColor pcs c = [coord x | x <- pcs, color x ==c]
p.s. Это лаба 3, задача 11.
2
Apcy
1 / 1 / 0
Регистрация: 08.10.2017
Сообщений: 8
08.11.2017, 19:43  [ТС] 4
можете пожалуйста показать пример входных данных и обязательно ли нужно использовать классы?
0
08.11.2017, 19:43
Catstail
Модератор
24916 / 12640 / 2312
Регистрация: 12.02.2012
Сообщений: 20,576
08.11.2017, 19:54 5
Цитата Сообщение от Apcy Посмотреть сообщение
обязательно ли нужно использовать классы
- а где там классы?

Haskell
1
2
3
4
5
6
*Main> numberChessmen [PieceChess "K" ('a',1) White,PieceChess "K" ('b',8) Black] Black
1
*Main> numberChessmen [PieceChess "K" ('a',1) White,PieceChess "F" ('b',8) White] Black
0
*Main> numberChessmen [PieceChess "K" ('a',1) White,PieceChess "F" ('b',8) White] White
2
2
Apcy
1 / 1 / 0
Регистрация: 08.10.2017
Сообщений: 8
08.11.2017, 20:20  [ТС] 6
Eq,Show или я ошибаюсь?
0
Catstail
Модератор
24916 / 12640 / 2312
Регистрация: 12.02.2012
Сообщений: 20,576
08.11.2017, 20:27 7
Так это наследование. Если убрать
Haskell
1
deriving (Eq,Show)
, то новые типы данных нельзя будет сравнивать и даже печатать!
1
greg00
0 / 0 / 0
Регистрация: 06.11.2017
Сообщений: 20
17.11.2017, 20:05 8
Какие входные данные должны быть у функции changeChessGame?
0
Catstail
Модератор
24916 / 12640 / 2312
Регистрация: 12.02.2012
Сообщений: 20,576
17.11.2017, 20:16 9
Например, так:

Haskell
1
2
3
4
-- Передвигаем короля с b8 на b7
 
*Main> changeChessGame [PieceChess "K" ('a',1) White,PieceChess "K" ('b',8) Black] (PieceChess "K" ('b',8) Black) ('b',7) 
Just [PieceChess {name = "K", coord = ('b',7), color = Black},PieceChess {name = "K", coord = ('a',1), color = White}]
1
Case-Man
167 / 107 / 22
Регистрация: 02.01.2012
Сообщений: 596
18.11.2017, 17:50 10
Вот бы кто из гуру показал, как к таким наброскам правильно прикручивается монада State..
0
Curry
2991 / 2072 / 257
Регистрация: 01.06.2013
Сообщений: 4,526
Записей в блоге: 9
18.11.2017, 19:12 11
Лучший ответ Сообщение было отмечено Catstail как решение

Решение

Цитата Сообщение от Case-Man Посмотреть сообщение
Вот бы кто из гуру показал, как к таким наброскам правильно прикручивается монада State..
Я не гуру, но и это не гурья задача.
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import Control.Monad.Trans.State  -- пакет transformers
 
data Color = Black | White deriving (Eq,Show)
data PieceChess = PieceChess { name :: String, coord :: (Char,Int), color :: Color } deriving (Eq,Show)
 
-- numberChessmen, возвращающую кол-во фигур заданного цвета на доске
 
numberChessmen :: Color -> State [PieceChess] Int
numberChessmen c = (length . filter (\ x -> (color x)==c )) <$> get
 
-- positionsByColor, возвращающую список занятых позиций фигурами заданного цвета
 
positionsByColor :: Color -> State [PieceChess] [(Char,Int)]
positionsByColor c = (map coord . filter (\ x -> (color x)==c)) <$> get
 
-- isEmpty, проверяющую свободна ли заданная клетка
 
isEmpty :: (Char,Int) -> State [PieceChess] Bool
isEmpty cc = (null . filter (\ x -> (coord x) == cc )) <$> get
 
-- pieceByPosition, возвращающую цвет и название фигуры на заданной позиции;
 
pieceByPosition :: (Char,Int) -> State [PieceChess] (Maybe String)
pieceByPosition cc = do
    w <- (filter (\ x -> (coord x) == cc )) <$> get
    if (null w) then 
        return Nothing 
    else return $ Just $ (name . head) w ++ " " ++ (show . color . head) w
                                
-- changeChessGame изменение положения на доске в результате хода фигуры заданного цвета на заданную клетку, 
-- причем эта позиция не должна быть занята своей фигурой. Если она занята чужой, то производится замена чужой
-- на передвинутую свою и возвращается True.
--Если ход невозможен возвращается False
 
changeChessGame :: PieceChess -> (Char,Int) -> State [PieceChess] Bool
changeChessGame pp c = do
    pcs <- get
    let xcs=filter (/= pp) pcs
        zcs=filter (/= pp) $ filter (\ x -> (coord x) /= c) pcs
        mcolor=(color pp)
        mname =(name pp)
        pcolor = (color . head) $ filter (\ x -> (coord x) == c) pcs
    cellIsEmpty <- isEmpty c   
    if cellIsEmpty then do
        put $ PieceChess {name=mname, coord=c, color=mcolor} : xcs
        return True
    else if mcolor /= pcolor then do
        put $ PieceChess {name=mname, coord=c, color=mcolor} : zcs
        return True
    else return False
                                 
                                 
                                 
main:: IO ()
main = print $ (`runState` 
                    [PieceChess "K" ('a',1) White,PieceChess "K" ('b',8) Black])
                (changeChessGame (PieceChess "K" ('b',8) Black) ('b',7))
2
XRuZzz
18.11.2017, 21:14     Функционалы + генераторы списков
  #12

Не по теме:

Цитата Сообщение от Case-Man Посмотреть сообщение
Вот бы кто из гуру показал, как к таким наброскам правильно прикручивается монада State..
Когда человек уже разобрался с этой монадой, вряд ли у него возникнут сложности с применением этих знаний.
Денис Москвин в курсе по Haskell-ю даёт исчерпывающие ответы по монаде State.
Функциональное программирование на языке Haskell: Монада State

0
18.11.2017, 21:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2017, 21:14
Привет! Вот еще темы с ответами:

Функционалы
Здравствуйте, подскажите пожалуйста как создать функцию вида (f '(atom null plusp) '(123)) -&gt; (T...

Функционалы
как можно переделать эту программу на функционалы, если можно (defun proste(a) ...

Функционалы
Помогите с заданием, пожалуйста, не могу понять, в лиспе слабоват( Определите функциональный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.