Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задачи на языке Haskell! Задачи на языке Haskell! 
:(
    Опции темы
gomon
Дата 21.12.2011, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.12.2011

Репутация: нет
Всего: нет



Доброго всем времени суток!
Такое дело, надо решить 4 задачи на Haskell. Они не большие и не сложные, но я хаскель не знаю.

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

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

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


Ребят очень надо! Знаю С и CPP, но надо именно на хаскеле! smile 
PM MAIL   Вверх
Void
Дата 22.12.2011, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 1
Всего: 173



Ах, какие злые люди, дали задание по языку, который не преподавали и вообще не упоминали. Или всё-таки после решения забить на «эту непонятную и бесполезную фигню» ВНЕЗАПНО настала сессия?

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 Найти цитируемый пост)
3) Напишите функцию, которая определяет количество решения уравнения x-y-z=n

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

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

isPalindrom s = s == reverse s

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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
gomon
Дата 22.12.2011, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.12.2011

Репутация: нет
Всего: нет




Цитата(Void @  22.12.2011,  13:09 Найти цитируемый пост)
Код


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



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 
PM MAIL   Вверх
gomon
Дата 22.12.2011, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.12.2011

Репутация: нет
Всего: нет



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

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


Если решений бесконечно много, то функция неопределена. 

PM MAIL   Вверх
Void
Дата 22.12.2011, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 1
Всего: 173



Цитата(gomon @  22.12.2011,  20:25 Найти цитируемый пост)
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]



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
gomon
Дата 22.12.2011, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.12.2011

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
gomon
Дата 23.12.2011, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.12.2011

Репутация: нет
Всего: нет



Код

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


А вот так?

Это сообщение отредактировал(а) gomon - 23.12.2011, 07:33
PM MAIL   Вверх
Void
Дата 23.12.2011, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 1
Всего: 173



Цитата(gomon @  23.12.2011,  09:00 Найти цитируемый пост)
А вот так? 

Нормальный код (кто написал?), только он не соответствует условиям задачи. Нужно найти числа, которые являются палиндромами в двоичной И десятичной системе. А здесь они считаются отдельно.

Это сообщение отредактировал(а) Void - 23.12.2011, 07:36


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
gomon
Дата 23.12.2011, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.12.2011

Репутация: нет
Всего: нет



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



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

Добавлено через 1 минуту и 20 секунд
А третья должна быть чем то похожим:

\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}
PM MAIL   Вверх
gomon
Дата 23.12.2011, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.12.2011

Репутация: нет
Всего: нет



Viod Огромное спасибо за помощь! От души благодарен! Приняли эти 3 задачи, 4 сказали можно не делать, так как 3 были сделаны оперативно. Зачет уже получен!=) 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума «Функциональные языки: общие вопросы»
Void
  • Пожалуйста, создавайте темы с содержательными названиями. Если у Вас вопрос по конкретному языку, укажите его в заголовке, например: «[Haskell] Как использовать монаду State».
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Функциональные языки: общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0798 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.