General Category > Общий раздел
ещё про цикл дейкстры
Geniepro:
На вражеском форуме новая тема про ЦД: http://forum.oberoncore.ru/viewtopic.php?f=82&t=4027
Там у Ермакова получился запутанный и глючный ЦД, походу он его ни разу не тестировал.
А вот что вышло бы на хацкеле, идеально подходящем для подобных задач по обработке текстов:
--- Код: ---calc_stat = map length . group
--- Конец кода ---
Полный пример:
--- Код: ---module Main
import Data.List
pasports = [ "123", "123", "234", "345", "345", "345" ]
calc_stat :: (Eq a) => [a] -> [Int]
calc_stat = map length . group
main = do
print $ calc_stat pasports
--- Конец кода ---
Main> :main
[2,1,3]
ЗЫ. WinHUGS не может понять тип функции calc_stat, для него пришлось указать. GHCi понимает без проблем.
Впрочем, для глобальных функций всё равно принято специфицировать типы...
Peter Almazov:
Это решение другой, более удобной для решателя, задачи :)
В решении Ильи ответом является массив, по которому можно дать ответ на вопрос: скока человек решили ровно 5 задач? Ответ: stat[5] = 0, т.е. 0 человек.
А ЦД там можно выкинуть в конце. Он использовался на этапе рассуждений.
Geniepro:
--- Цитата: Peter Almazov от Июль 20, 2012, 06:06:49 am ---Это решение другой, более удобной для решателя, задачи :)
В решении Ильи ответом является массив, по которому можно дать ответ на вопрос: скока человек решили ровно 5 задач? Ответ: stat[5] = 0, т.е. 0 человек.
--- Конец цитаты ---
Ок, тогда сложнее:
--- Код: ---module Main where
import Data.List
import qualified Data.Map as Map
pasports = [ "123", "123", "234", "345", "345", "345", "456", "567", "567"
, "789", "789", "789", "789", "789", "789"
]
stats = pasports
|> group
|> map length
|> sort
|> group
|> map (\xs@(x:_) -> (x, length xs))
|> Map.fromList
get_stat :: Int -> Int
get_stat n =
case Map.lookup n stats of
Nothing -> 0
Just m -> m
-- Список, по которому можно дать ответ на вопрос:
-- Cкока человек решили ровно 5 задач?
-- Ответ: stat[5] = 0, т.е. 0 человек.
solveds = map get_stat [0..10]
main = do
print $ solveds !! 1 -- Сколько народа решило 1 задачу?
print $ solveds !! 3 -- Сколько народа решило 3 задачи?
print $ solveds !! 5 -- Сколько народа решило 5 задач?
(|>) :: a -> (a -> b) -> b
x |> f = f x; infixl 0 |>
--- Конец кода ---
Main> :main
2
1
0
Илья Ермаков:
Ну и что в итоге-то выигрываем, в последнем варианте? Достаточно хитрая комбинация трансформаций... Что думать над циклом, что думать над ней... Только уровень абстракции гораздо выше - вам нужно правильно применить достаточно сложные по поведению общие средства к решению частной задачи... По моему убеждению, легче (и надёжнее) собирать из простых частных элементов, нежели комбинировать и параметризовать сложные обобщённые.
Кстати, сколько минут писали последнюю программу?
Я написал цикл буквально за минуту-другую, не отрывая ручки от бумаги...
ilovb:
А так:
--- Код: ---SELECT
ExamCount,
SUM(ExamCount) AS StatCount
FROM
(SELECT
PasNum AS PasNum,
COUNT(PasNum) AS ExamCount
FROM
Tab.Passports
GROUP BY
PasNum)
GROUP BY
ExamCount
--- Конец кода ---
Навигация
Перейти к полной версии