Задачи на языке Haskell!

 
0
 
Functional languages
ava
gomon | 21.12.2011, 22:50
Доброго всем времени суток!
Такое дело, надо решить 4 задачи на Haskell. Они не большие и не сложные, но я хаскель не знаю.

Прошу помочь, кто может! Для спецов это задача 5 - 10 минут, а для меня это вопрос зачета и не зачета!=)

Задачи:
1) Напишите функцию, которая суммирует все натуральные числа меньше
1000, которые кратны 3 и 5
2) Напишите функцию нахождения самого маленького числа, которое делится
на все числа от одного до 20.
3) Напишите функцию, которая определяет количество решения уравнения x-y-z=n
4) Напишите функцию, которая находит сумму всех таких чисел (меньше 1
миллиона) которые являются палиндромами в десятеричной и двоичной
системе счисления.

Заранее спасибо!


Ребят очень надо! Знаю С и CPP, но надо именно на хаскеле! smile 
Comments (9)
ava
Void | 22.12.2011, 13:09 #
Ах, какие злые люди, дали задание по языку, который не преподавали и вообще не упоминали. Или всё-таки после решения забить на «эту непонятную и бесполезную фигню» ВНЕЗАПНО настала сессия?

1.

f1 = sum [x | x <- [1..999], x `rem` 3 == 0 && x `rem` 5 == 0]

2.

f2 = foldr lcm 1 [1..20]

3.
Цитата (gomon @  21.12.2011,  23:50 findReferencedText)
3) Напишите функцию, которая определяет количество решения уравнения x-y-z=n

Условие видимо неполное, т.к. даже в натуральных числах решений бесконечное множество.
4.

toDigits base n =
    map (`rem` base) $ takeWhile (> 0) $ iterate (`div` base) n

isPalindrom s = s == reverse s

Может хоть из этого нужную функцию сами напишите? Всё необходимое есть в примерах выше.
ava
gomon | 22.12.2011, 18:25 #

Цитата (Void @  22.12.2011,  13:09 findReferencedText)
Код





Может хоть из этого нужную функцию сами напишите? Всё необходимое есть в примерах выше. 



palindrom = sum [x | x <- [1..1000000], x `rem` 2 ==  isPalindrom && x `rem` 10 == isPalindrom]


toDigits base n =
    map (`rem` base) $ takeWhile (> 0) $ iterate (`div` base) n

isPalindrom s = s == reverse s



Как то так! smile 
ava
gomon | 22.12.2011, 19:10 #
Цитата (Void @  22.12.2011,  13:09 findReferencedText)
.

Цитата(gomon @  21.12.2011,  23:50 Найти цитируемый пост)

3) Напишите функцию, которая определяет количество решения уравнения x-y-z=n



Условие видимо неполное, т.к. даже в натуральных числах решений бесконечное множество.


Если решений бесконечно много, то функция неопределена.
ava
Void | 22.12.2011, 19:54 #
Цитата (gomon @  22.12.2011,  20:25 findReferencedText)
palindrom = sum [x | x <- [1..1000000], x `rem` 2 ==  isPalindrom && x `rem` 10 == isPalindrom]

Пока незачёт. После запятой должен быть предикат. Ещё попытка, распишу для удобства:

-- принимает целые числа base и n и возвращает список целых чисел -- цифры n по основанию base в порядке от младших к старшим
toDigits :: Integral a => a -> a -> [a]
toDigits base n =
    map (`rem` base) $ -- взять остаток от деления на base от каждого элемента
    takeWhile (> 0) $ -- до первого неположительного элемента
    iterate (`div` base) n -- списка результатов последовательного деления n на base

-- принимает список значений, для которых определена операция равенства, и возвращает булево значение (истина/ложь)
isPalindrom :: Eq a => [a] -> Bool
isPalindrom s = s == reverse s -- сравнить список с его собственным обращением -- попросту определение палиндрома

Запись a `f` b означает то же самое, что f a b т.е. применение ф-ции f к аргументам a и b. rem — ф-ция остатка, div — целочисленного деления.
Стандартные функции:

-- map f [x1, x2, x3, ..., xn] -- это [f x1, f x2, f x3 ..., f xn]
map :: (a -> b) -> [a] -> [b]

-- возвращает самый длинный префикс списка, все элементы которого удовлетворяют предикату
takeWhile :: (a -> Bool) -> [a] -> [a]

-- iterate f x возвращает бесконечный (да-да :-) список вида [x, f x, f (f x), f (f (f x)), ...]
iterate :: (a -> a) -> a -> [a]

-- переворачивает список
reverse :: [a] -> [a]
ava
gomon | 22.12.2011, 23:08 #
palindrom = sum [x | x <- [1..1000000], |x = x:chek 2 x && x = x:chek 10 x
                                                               |otherwise x = 0]

chek :: Int a => a -> a -> [a]
chek :: a b = b:toDigits a b
chek :: b = |b:isPalindrom b
                  |otherwise b=0



Версия 2.1
ava
gomon | 23.12.2011, 07:00 #

convert _ 0 = []
convert n x = if x<n then [x] else rem x n : convert n (div x n)
isPalindrome x = (x == reverse x)
numbers = [1..1000]
palindromes n = convertBack n `map` (filter isPalindrome $ map (convert n) numbers)
palindromeSum = sum . palindromes
convertBack n = foldr (\y x->x*n+y) 0

ghci> palindromeSum 10
50040
ghci> palindromeSum 2
20041


А вот так?
ava
Void | 23.12.2011, 07:36 #
Цитата (gomon @  23.12.2011,  09:00 findReferencedText)
А вот так? 

Нормальный код (кто написал?), только он не соответствует условиям задачи. Нужно найти числа, которые являются палиндромами в двоичной И десятичной системе. А здесь они считаются отдельно.
ava
gomon | 23.12.2011, 07:56 #
Цитата (Void @  23.12.2011,  07:36 findReferencedText)
Нормальный код (кто написал?), только он не соответствует условиям задачи. Нужно найти числа, которые являются палиндромами в двоичной И десятичной системе. А здесь они считаются отдельно.



А предыдущий вариант? что там не так?

added later:
А третья должна быть чем то похожим:

\textbf{1-2} Написать функцию \prg{Float -> Float -> [Float]}, которая вычисляет корни уравнения $ax^2+bx=0$.  Если корней бесконечно много, то функция неопределена.

\begin{code}

root1_2 :: Float -> Float -> [Float]
root1_2 a b   |a==0 && b==0  = undefined
              |a==0 && b/=0  = [0]
              |otherwise =  [0, (root a b)]
\end{code}
ava
gomon | 23.12.2011, 09:01 #
Viod Огромное спасибо за помощь! От души благодарен! Приняли эти 3 задачи, 4 сказали можно не делать, так как 3 были сделаны оперативно. Зачет уже получен!=) 
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  Void   gomon
advanced
Submit