General Category > Общий раздел

ещё про цикл дейкстры

(1/37) > >>

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
--- Конец кода ---

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии