Я пытаюсь решить это упражнение:Неправильный выход простого решения упражнений Haskell
Вам дают последовательность N шаров в 4-х цветах: красный, зеленый, желтый и синий . Последовательность полна цветы, если и только если все следующих условий:
- Есть так много красных шаров как зеленые шары.
- Есть так много желтых шаров, как синие шары.
- разница между количеством красных шаров и зелеными шарами в каждом префиксе последовательности не превосходит 1.
- разницы между количеством желтых шаров и синими шарами в каждом префиксе последовательности не превосходит 1.
Ваша задача - написать программу, которая для данной последовательности печатает
True
, если она полна цветов, в противном случае она печатаетFalse
.
Мое решение до сих пор:
module Main where
import Control.Monad
main = do
s <- readLn :: IO Int
elements <- replicateM s getLine
let result = map checkColours elements
mapM (putStrLn . show) result
checkColours :: String -> Bool
checkColours string = isFullOfColors 0 0 0 0 string
isFullOfColors :: Int -> Int -> Int -> Int -> String -> Bool
isFullOfColors red green yellow blue string
| (abs (red - green)) > 1 = False
| (abs (yellow - blue)) > 1 = False
| (string == []) = if (red /= yellow) || (green /= blue) then True else False
| (head string == 'R') = isFullOfColors (red + 1) green yellow blue (tail string)
| (head string == 'G') = isFullOfColors red (green + 1) yellow blue (tail string)
| (head string == 'Y') = isFullOfColors red green (yellow + 1) blue (tail string)
| (head string == 'B') = isFullOfColors red green yellow (blue + 1) (tail string)
Но он не на входе "RYBG"
, возвращая False
вместо True
.
Что я делаю неправильно?
Линия, которая решает, если строка заполнена цветами ('string == []) = if ...' reads (на английском языке) "return True, если нет одинакового количества красных и желтых шаров или нет одинакового количества зеленых и синих шаров ». Это не то же самое, что спецификация. –
разделите свое решение на его части (сделайте предикаты для каждой из вышеперечисленных точек) и проверьте ввод на каждый;) – Carsten
@ C.Quilley Я этого не видел. Благодаря! –