1. Куча / Говнокод #17914

    +126

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    -- Алгебраический тип-сумма Масть («перечисление»).
    -- Значением типа Масть может быть одно из указанных справа
    -- (или Пики, или Трефы, или Бубны, или Червы).
    -- «Масть» здесь выступает конструктором _типа_,
    -- а «Пики», «Трефы» и т.д. — конструкторами _данных_.
    data Масть = Пики | Трефы | Бубны | Червы
      -- необязательное автоматическое выведение экземпляров классов,
      -- позволяющее преобразовывать значения в строки (функцией show из Show)
      -- и обратно (функцией read из Read), а также сравнивать их между собой
      -- (функциями классов Eq и Ord).
      deriving (Show, Read, Eq, Ord)
     
    -- Алгебраический тип-сумма Достоинство
    data Достоинство = Семёрка | Восьмёрка | Девятка | Десятка
                     | Валет | Дама | Король | Туз
      deriving (Show, Read, Eq, Ord)
     
    -- Алгебраический тип-произведение Карта («тип-кортеж»).
    -- Значения типа Карта — комбинации значений типов Достоинство и Масть,
    -- объединённые конструктором данных К.
    -- Часто имена конструктора данных и конструктора типа совпадают.
    data Карта = К Достоинство Масть
      deriving (Show, Read, Eq, Ord)
     
    -- Синоним списка значений типа Карта.
    type Рука = [Карта]
     
    -- Функция, определяющая, есть ли в руке марьяж (король и дама одной масти).
    естьМарьяж :: Рука -> Bool
    естьМарьяж карты =
       -- достаточно найти марьяж хотя бы одной масти
       any (естьМарьяжМасти) [Пики, Трефы, Бубны, Червы]
       where
         -- проверить, есть ли и дама, и король заданной масти м в руке
         естьМарьяжМасти м = (К Дама м) `elem` карты && (К Король м) `elem` карты
     
    -- примеры раздач
    рука = [ К Дама Трефы, К Семёрка Червы, К Король Трефы, К Туз Бубны ]
    рука_без_марьяжа = [ К Десятка Пики, К Король Пики, К Дама Червы ]
     
    main = do
      проверить рука
      проверить рука_без_марьяжа
      проверить [] -- пустая раздача
      where
        проверить кк = putStrLn ( (show кк) ++ " -> " ++ (show (естьМарьяж кк)) )
     
    -- Вывод:
    -- [К Дама Трефы,К Семёрка Червы,К Король Трефы,К Туз Бубны] -> True
    -- [К Десятка Пики,К Король Пики,К Дама Червы] -> False
    -- [] -> False

    Рука без макияжа

    Запостил: DesmondHume, 02 Апреля 2015

    Комментарии (383) RSS

    Добавить комментарий