111 / 85 / 21
Регистрация: 06.06.2011
Сообщений: 411
Записей в блоге: 1
1

Посоветуйте прикладную задачу

26.09.2013, 10:50. Показов 1629. Ответов 21
Метки нет (Все метки)

Собственно, все в названии темы.
Хочу опять взяться за Хаскель, но подходящей задачи нет.
Мне бы что-нибудь небольшое и полезное, без красивостей.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2013, 10:50
Ответы с готовыми решениями:

Решить прикладную задачу с помощью циклического вычислительного процесса
Помогите решить...Не знаю как... Решить прикладную задачу с помощью циклического вычислительного...

Посоветуйте задачу
Доброго времени суток, уважаемые участники форума. Занимаюсь программированием на C++ уже три года....

Посоветуйте оборудование под задачу
Коллеги, вопрос стоит именно об оборудовании Cisco. Никакое другое оборудование не рассматривается....

Посоветуйте МК STM32 и софт под задачу
Стоит задача: устройство должно работать с инкрементным энкодером A, B, Z порядка сотен килогерц,...

21
Модератор
Эксперт функциональных языков программированияЭксперт Python
30647 / 16874 / 3476
Регистрация: 12.02.2012
Сообщений: 28,285
Записей в блоге: 5
26.09.2013, 11:36 2
Все простые задачи Вы уже решили?
0
111 / 85 / 21
Регистрация: 06.06.2011
Сообщений: 411
Записей в блоге: 1
26.09.2013, 12:37  [ТС] 3
Цитата Сообщение от Catstail Посмотреть сообщение
Все простые задачи Вы уже решили?
Вы имеете ввиду всякие факториалы, фибоначи и поиски подпоследовательностей в последовательностях?
На том или ином языке - да, и каждый день пользуюсь. Не знаю, чтобы я без них делал
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
30647 / 16874 / 3476
Регистрация: 12.02.2012
Сообщений: 28,285
Записей в блоге: 5
26.09.2013, 14:23 4
Ну, сделайте вьюэр exe-файлов, например.
1
Эксперт по математике/физике
4156 / 2059 / 424
Регистрация: 19.07.2009
Сообщений: 3,117
Записей в блоге: 24
26.09.2013, 21:45 5
Цитата Сообщение от aaleksander Посмотреть сообщение
Мне бы что-нибудь небольшое и полезное, без красивостей.
Есть файл, в каждой строке два вещественных числа (x[i], y[i]) — координаты точки. Необходимо:
1. Проверить, располагаются ли точки около некоторой прямой.
2. Проверить, располагаются ли точки на экспоненте.
Вывести на экран две формулы наиболее близкой кривой (прямой и экспоненты) и квадр. отклонение от прямой.

Напомню, что точкам соотв. прямая y=ax+b, если
Краткий вывод
https://www.cyberforum.ru/cgi-bin/latex.cgi?S = \sum_i (ax_i+b - y_i)^2 \to \min
[x(ax+b-y)] = 0
[ax+b-y] = 0

[x^2]a+[x]b-[xy] = 0
[x]a+[1]b-[y] = 0
[...] — это сумма по всем i соотв. величины.

https://www.cyberforum.ru/cgi-bin/latex.cgi?\bar{x^2} a + \bar{x}b - \bar{xy} = 0
https://www.cyberforum.ru/cgi-bin/latex.cgi?\bar{x} a + b -\bar{y} = 0
https://www.cyberforum.ru/cgi-bin/latex.cgi?b = \bar{y}-\bar{x}a
https://www.cyberforum.ru/cgi-bin/latex.cgi?(\bar{x^2}-\bar{x}^2)a + \bar{x}\cdot\bar{y} = \bar{xy}

https://www.cyberforum.ru/cgi-bin/latex.cgi?a = \frac{\bar{xy} -\bar{x}\cdot\bar{y}}{\bar{x^2}-\bar{x}^2};\quad https://www.cyberforum.ru/cgi-bin/latex.cgi?\quad b = \bar{y} - \bar{x} \frac{\bar{xy} -\bar{x}\cdot\bar{y}}{\bar{x^2}-\bar{x}^2}.
Вертикальная черта значит усреднение.
Среднеквадратичное отклонение считается по формуле
https://www.cyberforum.ru/cgi-bin/latex.cgi?S = \sum_i (ax_i+b - y_i)^2
Кстати, верхние формулы считались исходя из того, что частные производные S по a и b должны зануляться.

Вторую задачу https://www.cyberforum.ru/cgi-bin/latex.cgi?y = ce^{kx} можно свести к первой, прологарифмировав: https://www.cyberforum.ru/cgi-bin/latex.cgi?\ln y = \ln c + kx, то есть найдя a=k и b=ln(c) из формул выше, вместо y подставляя ln y.

Задача небольшая и очень полезная ))
Решается на Хаскелле достаточно быстро. Хотя в Wofram Mathematica решается быстрее. Хотя последняя больно дорогая.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
30647 / 16874 / 3476
Регистрация: 12.02.2012
Сообщений: 28,285
Записей в блоге: 5
26.09.2013, 21:49 6
Mysterious Light, нужно реализовать МНК на Haskell? Для прямой?
0
Эксперт по математике/физике
4156 / 2059 / 424
Регистрация: 19.07.2009
Сообщений: 3,117
Записей в блоге: 24
26.09.2013, 22:02 7
Вы поставили задачу кратко. Я — с формулами. Хотя задача в целом, объективно говоря, простая.
Область применения: приходит к ТС физик-маньяк, приставляет нож к глотке и орёт: НАЙДИ УГОЛ НАКЛОНА (сопротивление, коэфф. расширени и т.п.) ПО СНЯТЫМ МНОЮ ТОЧКАМ!!!
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
30647 / 16874 / 3476
Регистрация: 12.02.2012
Сообщений: 28,285
Записей в блоге: 5
27.09.2013, 10:06 8
Что-то вроде:

Haskell
1
2
3
4
5
6
7
8
mnk :: [Double] -> [Double] -> [Double]
mnk x y = [a, b] 
          where a   = (sxy - sx*sy)/d;
                b   = sy-sx*a;
                sx  = sum x;
                sy  = sum y;
                sxy = sum $ zipWith (*) x y 
                d   = sum ( map (^2) x)-(sx^2);
Добавлено через 1 минуту
Хотя нужно еще потестировать...
0
Эксперт по математике/физике
4156 / 2059 / 424
Регистрация: 19.07.2009
Сообщений: 3,117
Записей в блоге: 24
27.09.2013, 10:54 9
Catstail, не Вам была задана задача! Хотя решение где-то так и будет выглядеть + чтение файла.
Привожу её как пример существенно прикладной задачи, которая решается от силы в 10 строк.
1
163 / 163 / 22
Регистрация: 23.02.2011
Сообщений: 347
30.09.2013, 16:22 10
aaleksander, Напиши пакмана. Там довольно интересный алгоритм поведения приведений.
0
111 / 85 / 21
Регистрация: 06.06.2011
Сообщений: 411
Записей в блоге: 1
01.10.2013, 08:38  [ТС] 11
Я уже нашел задачу: оптимизация траектории для станка ЧПУ.
Но все равно, спасибо.
0
111 / 85 / 21
Регистрация: 06.06.2011
Сообщений: 411
Записей в блоге: 1
02.10.2013, 16:28  [ТС] 12
Все-таки решил воспользоваться советом Mysterious Light.
Начал с чтения из файла.
Прошу покритиковать код и разъяснить один момент (в конце, после исходника):
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
data Point = Point Double Double
    deriving (Show)
 
-- более удобная (для меня) композиция
(>.>) :: (a -> b) -> (b -> c) -> (a -> c)
f >.> g = g . f
 
readData :: String -> IO [Point]
readData fileName = 
    readFile fileName >>= toLines >>= toPoints
    where 
        toLines = return . lines
        toPoints = return . map (\s -> strToPoint s)
 
--разделяет строку с помощью префиксной функции (copy-past)
split :: (Char -> Bool) -> String -> [String]
split p s = case dropWhile p s of
                "" -> []
                s' -> w : split p s''
                    where (w, s'') = break p s'
 
-- парсит строку в Point
--TODO: сделать через Maybe
strToPoint :: String -> Point
strToPoint = 
    splitBySpace >.> createTupleOfDouble >.> toPoint
    where  
        splitBySpace s = split (== ' ') s
        createTupleOfDouble l = (read (head l) :: Double, read (last l) :: Double)
        toPoint t = Point (fst t) (snd t)
 
--лежат ли точки на линии
--TODO: закончить
isOnLine :: [Point] -> Bool
isOnLine l = True 
 
main =
    readData "input.dat" >>= return . isOnLine
Почему в последней строке "return . isOnLine" компилируется, а return(isOnLine) нет?
Вроде композиция выглядит так?
Haskell
1
2
(.) :: (b -> c) -> (a -> b) -> (a -> c)
f . g = \x -> f (g x)
Добавлено через 5 минут
С последним вопросом разобрался: мы же передает значение по цепочке функций
Вот так вполне работает:
Haskell
1
    readData "input.dat" >>= \x -> (return (isOnLine x))
0
Эксперт С++
5820 / 3472 / 357
Регистрация: 08.02.2010
Сообщений: 7,448
02.10.2013, 17:17 13
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
data Point = Point Double Double
 
-- Серию bind'ов (>>=) можно заменить композицией;
-- map (\s -> strToPoint s) == map strToPoint
readData :: String -> IO [Point]
readData file = readFile file >>= return . map strToPoint . lines
 
split :: (Char -> Bool) -> String -> [String]
split p s = case dropWhile p s of
  [] -> []
  s' -> w : split p s''
      where (w, s'') = break p s'
 
 
-- createTupeOfDouble, IMHO, бесполезна
strToPoint :: String -> Point
strToPoint = toPoint . map read . split (== ' ')
    where toPoint l = Point (head l) (last l)
 
isOnLine :: [Point] -> Bool
isOnLine = const True
 
main = readData "input.dat" >>= print . isOnLine
Цитата Сообщение от aaleksander Посмотреть сообщение
-- более удобная (для меня) композиция
Уже есть в Control.Arrow (>>>).

Сейчас свой вариант парсинга напишу.
1
111 / 85 / 21
Регистрация: 06.06.2011
Сообщений: 411
Записей в блоге: 1
02.10.2013, 17:22  [ТС] 14
Цитата Сообщение от Nameless One Посмотреть сообщение
Сейчас свой вариант парсинга напишу.
Только не через parsec :-)
0
Эксперт С++
5820 / 3472 / 357
Регистрация: 08.02.2010
Сообщений: 7,448
02.10.2013, 17:24 15
Цитата Сообщение от aaleksander Посмотреть сообщение
Только не через parsec :-)
:-(

Могу, в принципе, через attoparsec или split.
0
111 / 85 / 21
Регистрация: 06.06.2011
Сообщений: 411
Записей в блоге: 1
02.10.2013, 17:33  [ТС] 16
Я ж только учусь.
Для использования parsecа надо знать его философию, а я еще философию Haskellя не усвоил.
0
Эксперт С++
5820 / 3472 / 357
Регистрация: 08.02.2010
Сообщений: 7,448
02.10.2013, 17:37 17
aaleksander, нет у Parsec никакой философии, для его понимания нужно знать, что такое композиция функций, комбинаторы и монады.

Но ещё проще его понять, если примерно знать, как он устроен внутри. Это подробно описано в главе «Functional Parsers» книги «Programming in Haskell».

А с Parsec ты сразу получишь быстрый и эффективный парсер с вменяемой обработкой ошибок ввода.
0
111 / 85 / 21
Регистрация: 06.06.2011
Сообщений: 411
Записей в блоге: 1
02.10.2013, 17:39  [ТС] 18
Ладно, пиши, языкастый
0
Эксперт С++
5820 / 3472 / 357
Регистрация: 08.02.2010
Сообщений: 7,448
02.10.2013, 19:33 19
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import Text.Parsec hiding (space)
import Text.Parsec.String
import Text.Parsec.Numbers
import Control.Applicative hiding (many, (<|>))
import Data.Functor
 
data Point = Point Double Double
             deriving (Show)
 
space :: Parser ()
space = skipMany $ oneOf " \t"
 
-- Число может быть окружено пробельными символами
double = between space space parseExtFloat <?> "double"
-- Точка - это два числа
point = Point <$> double <*> double
-- На входе - последовательность точек, разделенных переводами строки
points = point `sepBy` newline <* eof
 
isOnLine :: [Point] -> Bool
isOnLine = const True
 
run :: FilePath -> IO ()
run file = do
  input <- readFile file
  case parse points file input of
    Left err -> print err
    Right ps -> print $ isOnLine ps
 
main = run "input.dat"
1
Эксперт Java
3882 / 2503 / 448
Регистрация: 28.04.2012
Сообщений: 8,201
02.10.2013, 21:59 20
Кстати, практичные и простые примеры использования парсека есть в «Real World Haskell» (парсинг JSON) и «Write Yourself a Scheme in 48 hours» (парсинг S-выражений).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.10.2013, 21:59

Посоветуйте как выполнить следующую задачу
Задача очень тривиальна, прошу прощения, если она где-то тут уже дублировалась. Мне необходимо...

Посоветуйте, как сделать задачу методом фибоначчи.
Всем привет.Помогите пожалуйста решить задачу методом фибоначче.Условия к задаче приложил.

Посоветуйте выбор СУБД под эту задачу (внутри темы)
Доброго времени! Итак, задача: надо хранить в базе текстовые поля размером до нескольких килобайт...

Как создать прикладную программу БД?
Есть миниатюрная база данных MySQL. Необходимо создать сайт или программу (десктопное приложение),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru