Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Haskell
Перезагрузить страницу Функция, по заданному списку карт возвращает список чисел
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Ghost92 Ghost92 вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.10.2010
Unhappy Функция, по заданному списку карт возвращает список чисел - 04.10.2010, 01:41

Помогите решить задачку =( я не поняла особо начиная с 4-й...(((
Определите тип данных, представляющий информацию о карте и карточной игре. Каждая карта характеризуется одной из 4-х мастей. Карта может быть либо младшей (от двойки до десятки), либо картинкой (валет, дама, король, туз). Определить ф-и:
1. isMinor - проверяет что её аргумент - младшая карта
2. sameSuit - проверяет, что переданные в неё карты одной мати
3. beats:: Card -> Card -> Bool - проверяет, что карта, переданная в качестве первого аргумента бьёт карту, являющуюся вторым аргументом
4. beats2 (аналогичная) - но принимает в качестве дополнительного аргумента козырную масть
5. beatsList - принимает в качестве аргументов список карт, карту и козырную масть и возвращающая список тех карт из списка, которые бьют указанную карту с учётом козырной масти
6. функция, по заданному списку карт возвращает список чисел, каждое из которых возможная сумма очков указанных карт, рассчитанных по правилам игры в 21 очко: младшие карты считаются по номиналу, валет дама и король за 10 очков, туз может рассматриваться как 1 и как 11 очков. Ф-я должна вернуть все возможные варианты
Ответить с цитированием
  (#2 (permalink)) Старый
korvin korvin вне форума
Member
 
Аватар для korvin
 
Сообщений: 337
Сказал(а) спасибо: 1
Поблагодарили 15 раз(а) в 15 сообщениях
Регистрация: 25.01.2010
По умолчанию 04.10.2010, 14:35

как-то так:
Код:
module Cards
( CardNum(..)
, CardSuit(..)
, Card(..)
, isMinor
, sameSuit
, beats
, beats2
, beatsList
, points
) where

import Data.List

data CardNum
    = Two
    | Three
    | Four
    | Five
    | Six
    | Seven
    | Eight
    | Nine
    | Ten
    | Jack
    | Queen
    | King
    | Ace
    deriving (Read, Show, Eq, Enum, Ord)
 
data CardSuit
    = Diamonds -- бубны
    | Hearts   -- червы
    | Spades   -- пики
    | Clubs    -- трефы
    deriving (Read, Show, Eq)
 
data Card = Card CardNum CardSuit deriving (Read, Show, Eq)
 
 
isMinor :: Card -> Bool
isMinor (Card Two _)  =  True
isMinor  _            =  False 

sameSuit :: Card -> Card -> Bool
sameSuit (Card _ s1) (Card _ s2)  =  s1 == s2

beats :: Card -> Card -> Bool
beats (Card n1 s1) (Card n2 s2)  =  s1 == s2 && n1 > n2

beats2 :: Card -> Card -> CardSuit -> Bool
beats2 (Card n1 s1) (Card n2 s2) s
    | s1 == s2   =  n1 > n2
    | s1 == s    =  True
    | otherwise  =  False

beatsList :: [Card] -> Card -> CardSuit -> [Card]
beatsList cs c s  =  filter (\x -> beats2 x c s) cs



crossMap :: (a -> b -> c) -> [a] -> [b] -> [c]
crossMap fn xs ys  =  rec [] xs ys
    where
        rec rs   _      []    =  rs
        rec rs   []   (y:ys)  =  rec rs xs ys
        rec rs (x:xs)   ys    =  rec ((x `fn` head ys) : rs) xs ys

addPoints :: [Int] -> [Int] -> [Int]
addPoints  =  crossMap (+)
 
pointsOf :: CardNum -> [Int]
pointsOf Jack   =  [10]
pointsOf Queen  =  [10]
pointsOf King   =  [10]
pointsOf Ace    =  [1, 11]
pointsOf cn     =  [fromEnum cn + 2]

points :: [CardNum] -> [Int]
points xs  =  sort $ nub $ rec [] xs
    where
        rec rs   []    =  rs
        rec [] (x:xs)  =  rec (pointsOf x) xs
        rec rs (x:xs)  =  rec (addPoints rs $ pointsOf x) xs
?
Ответить с цитированием
  (#3 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 04.10.2010, 15:39

Цитата:
Карта может быть либо младшей (от двойки до десятки)
...
1. isMinor - проверяет что её аргумент - младшая карта
Думаю, должно быть так:
Код:
isMinor :: Card -> Bool
isMinor (Card t _)  = t < Jack
Цитата:
функция, по заданному списку карт возвращает список чисел, каждое из которых возможная сумма очков указанных карт, рассчитанных по правилам игры в 21 очко: младшие карты считаются по номиналу, валет дама и король за 10 очков, туз может рассматриваться как 1 и как 11 очков. Ф-я должна вернуть все возможные варианты
Ghost92, учитывается ли фейл при N > 21, т.к. дальше игра не идет?


Don't fear the Monad
Ответить с цитированием
  (#4 (permalink)) Старый
korvin korvin вне форума
Member
 
Аватар для korvin
 
Сообщений: 337
Сказал(а) спасибо: 1
Поблагодарили 15 раз(а) в 15 сообщениях
Регистрация: 25.01.2010
По умолчанию 04.10.2010, 22:52

Цитата:
Сообщение от calabi-yau Посмотреть сообщение
Думаю, должно быть так:
Код:
isMinor :: Card -> Bool
isMinor (Card t _)  = t < Jack
да, моя невнимательность
Ответить с цитированием
  (#5 (permalink)) Старый
Ghost92 Ghost92 вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.10.2010
По умолчанию 05.10.2010, 23:38

Мне зачли только три функции из 6-ти) и именно в ниеприведенном виде

isMinor :: Karta -> Bool
isMinor (Karta x y) = if (x==Jack)||(x==Queen)||(x==King)||(x==Ace) then False else True

beats :: Karta -> Karta -> Bool
beats (Karta x1 y1) (Karta x2 y2) = if (y1==y2)&&(x1>x2) then True else False

beats2 :: Mast -> Karta -> Karta -> Bool
beats2 y (Karta x1 y1) (Karta x2 y2) = if (((y1==y2)&&(x1>x2))||(((y1==y)&&(y2==y))&&(x1>x2) )) then True else False

А функция sameSuit должна принимать список)
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 06.10.2010, 14:34

Цитата:
Сообщение от Ghost92 Посмотреть сообщение
Мне зачли только три функции из 6-ти) и именно в ниеприведенном виде
А функция sameSuit должна принимать список)
Код:
sameSuit :: [Card] ->  Bool
sameSuit (Card _ s1 : xs'@(Card t s2 : _)) = 
  if s1 == s2 then 
    sameSuit xs'
  else 
    False
sameSuit xs = if null xs then False else True   

beatsList :: [Card] -> Card -> CardSuit -> [Card]
beatsList cs c' s  = go cs []
  where go (x:xs) acc = go xs (if beats2 x c' s then x:acc else acc)
            go _       acc = acc
шестая задача - что именно не так?

off:
Цитата:
if (x==Jack)||(x==Queen)||(x==King)||(x==Ace) then False else True
Я, конечно, дико извиняюсь, но вас учат индус-триальному подходу :-)


Don't fear the Monad
Ответить с цитированием
  (#7 (permalink)) Старый
korvin korvin вне форума
Member
 
Аватар для korvin
 
Сообщений: 337
Сказал(а) спасибо: 1
Поблагодарили 15 раз(а) в 15 сообщениях
Регистрация: 25.01.2010
По умолчанию 06.10.2010, 19:37

Цитата:
Сообщение от calabi-yau Посмотреть сообщение
off:

Я, конечно, дико извиняюсь, но вас учат индус-триальному подходу :-)
+1, жесть такая
Ответить с цитированием
  (#8 (permalink)) Старый
Ghost92 Ghost92 вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.10.2010
По умолчанию 06.10.2010, 23:29

спасибо огроменное =) надеюсь, смогу разобраться) а что значит sameSuit (Card _ s1 : xs'@(Card t s2 : _)) = в этой строке символ собака и штрих??? о_О
Ответить с цитированием
  (#9 (permalink)) Старый
Ghost92 Ghost92 вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.10.2010
По умолчанию 06.10.2010, 23:53

не могли бы вы ещё помочь в написании такой простенькой задачки, как:
определить функцию IsRectangular, которая принимает в качестве параметров координаты 3-х точек на плоскости и возвращает True, если образуемый ими треугольник - прямоугольный.
dlina :: (Integer, Integer) -> (Integer, Integer) -> Integer
dlina (x1, y1) (x2, y2) = sqrt(((x2-x1)^2) + ((y2 - y1)^2))

isRectagular :: (Integer, Integer) -> (Integer, Integer) -> (Integer, Integer) -> Bool
isRectagular (a1, b1) (a2, b2) (a3, b3) = if (((dlina (a1, b1) (a2, b2))>(dlina (a1, b1) (a3, b3)))&&((dlina (a1, b1) (a2, b2))>(dlina (a2, b2) (a3, b3)))&&(dlina (a1, b1) (a2, b2)==sqrt(((dlina (a2, b2) (a3, b3))^2)+((dlina (a1, b1) (a3, b3))^2)))||(((dlina (a1, b1) (a3, b3))>(dlina (a1, b1) (a2, b2)))&&((dlina (a1, b1) (a3, b3))>(dlina (a2, b2) (a3, b3)))&&(dlina (a1, b1) (a3, b3)==sqrt(((dlina (a1, b1) (a2, b2))^2)+((dlina (a2, b2) (a3, b3))^2)))||(((dlina (a2, b2) (a3, b3))>(dlina (a1, b1) (a3, b3)))&&((dlina (a2, b2) (a3, b3))>(dlina (a2, b1) (a2, b2)))&&(dlina (a2, b2) (a3, b3)==sqrt(((dlina (a1, b1) (a2, b2))^2)+((dlina (a1, b1) (a3, b3))^2))) then True else False

ахахаха))) вот как то так?
Ответить с цитированием
  (#10 (permalink)) Старый
korvin korvin вне форума
Member
 
Аватар для korvin
 
Сообщений: 337
Сказал(а) спасибо: 1
Поблагодарили 15 раз(а) в 15 сообщениях
Регистрация: 25.01.2010
По умолчанию 07.10.2010, 01:51

Цитата:
Сообщение от Ghost92 Посмотреть сообщение
не могли бы вы ещё помочь в написании такой простенькой задачки, как:
определить функцию IsRectangular, которая принимает в качестве параметров координаты 3-х точек на плоскости и возвращает True, если образуемый ими треугольник - прямоугольный.
dlina :: (Integer, Integer) -> (Integer, Integer) -> Integer
dlina (x1, y1) (x2, y2) = sqrt(((x2-x1)^2) + ((y2 - y1)^2))

isRectagular :: (Integer, Integer) -> (Integer, Integer) -> (Integer, Integer) -> Bool
isRectagular (a1, b1) (a2, b2) (a3, b3) = if (((dlina (a1, b1) (a2, b2))>(dlina (a1, b1) (a3, b3)))&&((dlina (a1, b1) (a2, b2))>(dlina (a2, b2) (a3, b3)))&&(dlina (a1, b1) (a2, b2)==sqrt(((dlina (a2, b2) (a3, b3))^2)+((dlina (a1, b1) (a3, b3))^2)))||(((dlina (a1, b1) (a3, b3))>(dlina (a1, b1) (a2, b2)))&&((dlina (a1, b1) (a3, b3))>(dlina (a2, b2) (a3, b3)))&&(dlina (a1, b1) (a3, b3)==sqrt(((dlina (a1, b1) (a2, b2))^2)+((dlina (a2, b2) (a3, b3))^2)))||(((dlina (a2, b2) (a3, b3))>(dlina (a1, b1) (a3, b3)))&&((dlina (a2, b2) (a3, b3))>(dlina (a2, b1) (a2, b2)))&&(dlina (a2, b2) (a3, b3)==sqrt(((dlina (a1, b1) (a2, b2))^2)+((dlina (a1, b1) (a3, b3))^2))) then True else False

ахахаха))) вот как то так?
нет, не так.

Код:
len (x1, y1) (x2, y2)  =  sqrt $ (x2 - x1)^2 + (y2 - y1)^2

isRectangular p1 p2 p3  =  check $ sort [l1, l2, l3]
    where
        check [a, b, c]  =  a^2 + b^2 == c^2
        l1  =  len p1 p2
        l2  =  len p2 p3
        l3  =  len p3 p1
Ответить с цитированием
  (#11 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 07.10.2010, 10:24

Цитата:
Сообщение от Ghost92 Посмотреть сообщение
не могли бы вы ещё помочь в написании isRectagular :: (Integer, Integer) -> (Integer, Integer) -> (Integer, Integer) -> Bool
isRectagular (a1, b1) (a2, b2) (a3, b3) = if (((dlina (a1, b1) (a2, b2))>(dlina (a1, b1) (a3, b3)))&&((dlina (a1, b1) (a2, b2))>(dlina (a2, b2) (a3, b3)))&&(dlina (a1, b1) (a2, b2)==sqrt(((dlina (a2, b2) (a3, b3))^2)+((dlina (a1, b1) (a3, b3))^2)))||(((dlina (a1, b1) (a3, b3))>(dlina (a1, b1) (a2, b2)))&&((dlina (a1, b1) (a3, b3))>(dlina (a2, b2) (a3, b3)))&&(dlina (a1, b1) (a3, b3)==sqrt(((dlina (a1, b1) (a2, b2))^2)+((dlina (a2, b2) (a3, b3))^2)))||(((dlina (a2, b2) (a3, b3))>(dlina (a1, b1) (a3, b3)))&&((dlina (a2, b2) (a3, b3))>(dlina (a2, b1) (a2, b2)))&&(dlina (a2, b2) (a3, b3)==sqrt(((dlina (a1, b1) (a2, b2))^2)+((dlina (a1, b1) (a3, b3))^2))) then True else False
:`-(

Цитата:
спасибо огроменное =) надеюсь, смогу разобраться) а что значит sameSuit (Card _ s1 : xs'@(Card t s2 : _)) = в этой строке символ собака и штрих??? о_О
' - допустимый символ для имени, а @ - as pattern, т.е xs' альтернативное имя для (Card t s2 : _).


Don't fear the Monad
Ответить с цитированием
  (#12 (permalink)) Старый
Ghost92 Ghost92 вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.10.2010
По умолчанию 07.10.2010, 17:00

а у меня всё заработало после смены Integer на Double))) =H
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Ghost92 Ghost92 вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.10.2010
По умолчанию 09.10.2010, 11:51

crossMap :: (a -> b -> c) -> [a] -> [b] -> [c]
crossMap fn xs ys = rec [] xs ys
where
rec rs _ [] = rs
rec rs [] (y:ys) = rec rs xs ys
rec rs (x:xs) ys = rec ((x `fn` head ys) : rs) xs ys

addPoints :: [Int] -> [Int] -> [Int]
addPoints = crossMap (+)

pointsOf :: CardNum -> [Int]
pointsOf Jack = [10]
pointsOf Queen = [10]
pointsOf King = [10]
pointsOf Ace = [1, 11]


points :: [CardNum] -> [Int]
points xs = sort $ nub $ rec [] xs
where
rec rs [] = rs
rec [] (x:xs) = rec (pointsOf x) xs
rec rs (x:xs) = rec (addPoints rs $ pointsOf x) xs

не могли бы здесь объяснить строчки: addPoints = crossMap (+) мы что-то так не писали никогда(((

pointsOf cn = [fromEnum cn + 2]

points xs = sort $ nub $ rec [] xs (тоже непонятно что за $)

извините за большое количество, возможно, тупых вопросов)
Ответить с цитированием
  (#14 (permalink)) Старый
Ghost92 Ghost92 вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.10.2010
По умолчанию 09.10.2010, 12:51

и ещё не могли бы вы объяснить работу вспомогательной функции go:
beatsList :: [Card] -> Card -> CardSuit -> [Card]
beatsList cs c' s = go cs []
where go (x:xs) acc = go xs (if beats2 x c' s then x:acc else acc)
go _ acc = acc
Ответить с цитированием
  (#15 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 09.10.2010, 13:54

Цитата:
Сообщение от Ghost92 Посмотреть сообщение
crossMap :: (a -> b -> c) -> [a] -> [b] -> [c]
не могли бы здесь объяснить строчки: addPoints = crossMap (+) мы что-то так не писали никогда(((

pointsOf cn = [fromEnum cn + 2]

points xs = sort $ nub $ rec [] xs (тоже непонятно что за $)

извините за большое количество, возможно, тупых вопросов)
crossMap (+) - сечение, addPoints = crossmap (+) эквивалентно addPoints = \xs ys -> crossMap (+) xs ys.
Функция $:
Код:
f $ x = f x
т.е принимает функцию и аргумент, и применяет его к функции. Ее часто используют для сокращения количества скобок, т.к. проритет равен нулю и правоассоциативна, т.е не писать так:
Код:
points xs = sort (nub (rec [] xs))


Don't fear the Monad
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно разобрать программу для перевода списка арабских чисел в список римских чисел. RuslanTM Prolog 2 18.12.2011 17:04
Определите функцию. которая по исходному списку строит новый список Masha11 Lisp 1 14.01.2011 15:33
Функция ATTACH - возвращает то же значение, что и CONS Huakin Lisp 0 19.10.2010 02:24
Написать функцию, которая по линейному списку '(q w e r t y) строит сложный список Devil1991 Lisp 2 21.09.2010 09:03
Написать функцию, которая по списку lst и атому obj возвращает множество klava Lisp 1 22.12.2009 14:05
По списку, состоящему из атомов-чисел, составить список значений super_girl Lisp 8 12.04.2007 15:16
Какая функция возвращает путь к exe-файлу приложения Sash&#39;Ok&#33; Visual C++ 6 05.12.2006 07:55
Мьютекс не открывается - функция OpenMutex возвращает нулевой хендл с чем это связано EiZeRR Visual C++ 4 23.11.2006 20:12
Функция RegisterClassEx возвращает значения типа ATOM что это Saracin Visual C++ 3 06.05.2006 21:25
По произвольному списку построить соответсвующий ему одноуровневый список dark.58 Lisp 4 06.05.2006 11:39
Функция put_text возвращает ошибку Alexandre Visual C++ 0 14.11.2005 14:45
Почему функция не возвращает нужного значения Julietta С/С++ 3 28.11.2003 12:53



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов