Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 14.06.2015
Сообщений: 7

Разбить список на подсписки

22.06.2015, 22:02. Показов 5913. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Помогите решить задачу, беспощадная сессия - с Хаскелем еще не разобрался, а экзамен уже через пару дней..

Задача:
Список чисел разделить на 3 списка: числа, меньшие данного числа; равного данному; большие данного.

Как новичок, хотел бы попросить максимально простой код, буду благодарен любым пояснениям!

Заранее спасибо!))
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.06.2015, 22:02
Ответы с готовыми решениями:

Разбить числовой список на подсписки из возрастающих подпоследовательностей
Приветствую! Подскажите, пожалуйста, как на Haskell красиво решить вот такую задачу: Заданный числовой список разбить на...

Разбить список на подсписки
собственно сама задача: Список List2 получен из списка List1 путём группировки в подсписки троек элементов, начиная с первого. Если...

Разбить список на подсписки с элементами, кратными n
Здравствуйте! Подскажите с решением данной задачи: Разбить список целых чисел на подсписки, сохраняя порядок элементов: в первом...

16
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32
22.06.2015, 22:19
Цитата Сообщение от Shelb Посмотреть сообщение
максимально простой код
будет из трех слов: sort и дважды spanAt (или как ее там)

Добавлено через 3 минуты
ЗЫ да, если список бесконечен, тогда из трех слов filter можно, или типа map $ (map filter [<a, ==a, >a])
Хаскель, как и русский матерный - язык с богатыми возможностями выражения одной и той же мысли разными вариантами
2
Эксперт функциональных языков программированияЭксперт по математике/физике
4312 / 2104 / 431
Регистрация: 19.07.2009
Сообщений: 3,198
Записей в блоге: 24
22.06.2015, 22:26
Лучший ответ Сообщение было отмечено Shelb как решение

Решение

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
разделить_относительно :: Ord a => a -> [a] -> ([a], [a], [a])
разделить_относительно числа список = ( -- на три части
  -- первая часть: числа, меньшие числа
  отобрать (меньше числа) список,
  -- вторая часть: числа, равные данному числу
  отобрать (равные числа) список, -- ок, промашка в падеже
  -- третья часть: числа, большие числа
  отобрать (больше числа) список
  )
  where
    -- синонимы
    отобрать = filter
    меньше = (>)
    больше = (<)
    равные = (==)
Haskell
1
2
*Main> разделить_относительно 2 [1,2,3,4,5]
([1],[2],[3,4,5])
5
22.06.2015, 23:05

Не по теме:

Mysterious Light, это феерично... :)))), тем не менее сам так пишу, когда ну совсем в лом лезть в словарь

0
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
23.06.2015, 01:00
Haskell
1
2
3
4
5
6
7
8
split3 :: Ord a => a -> [a] -> ([a],[a],[a])
split3 _ [] = ([],[],[])
split3 y (x:xs) | x < y  = (x:z1, z2, z3)
                | x == y = (z1, x:z2, z3)
                | x > y  = (z1, z2, x:z3)
                    where (z1,z2,z3) = split3 y xs
                
main = print $ split3 2 [1,2,3,4,5]
Сопоставление с образцом плюс рекурсия... что ещё нужно преподавателю? Возможно, использование otherwise вместо последнего условия...
2
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32
23.06.2015, 01:04
Точно, этож антимерж А преподавателю нужно разных вариантов и побольше. Только если он неглупый, он задаст пару-тройку вопросов по кодам и все поймет про такого студента.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
23.06.2015, 07:36
_Ivana, sort невыгодно. Задача-то имеет сложность O(n). Еще вариант:

Haskell
1
2
3
4
5
task :: [Integer] -> Integer -> [[Integer]]
task x n = foldl (\ acc z -> g z acc) [[],[],[]] x
           where g z [a1,a2,a3] | (z <n) = [z:a1,a2,a3]
                                | (z==n) = [a1,z:a2,a3]
                                | otherwise = [a1,a2,z:a3]
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32
23.06.2015, 13:19
Catstail, выгодно не надо, надо "максимально простой кот" и забыть этот ужас ФП как страшный сон
0
 Аватар для Araneo
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
23.06.2015, 15:08
Извращения!!!!
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{-#Language LambdaCase#-}
import Data.Function
 
while :: k -> (k -> (Bool, k)) -> k
while k g = fix (\f -> \case
    (True, x)  -> f.g $ x
    (False, x) -> x) $ (True, k)
 
stop = False
retry = True
 
task :: Int -> [Int] -> ([Int],[Int],[Int])
task k s = (a,b,c)
  where
    (a,b,c,_)=  while ([],[],[],s) $ \case
        (a,b,c,[])            -> (stop,  (a,b,c,s))
        (a,b,c,x:xs) | x <  k -> (retry, (x:a,b,c,xs))
                     | x == k -> (retry, (a,x:b,c,xs))
                     | x >  k -> (retry, (a,b,x:c,xs))
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
23.06.2015, 20:04
Цитата Сообщение от _Ivana Посмотреть сообщение
выгодно не надо, надо "максимально простой кот" и забыть этот ужас ФП как страшный сон
- неплохо, когда максимально простой еще и достаточно быстрый.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32
23.06.2015, 21:37
Catstail, ну, термин "максимально простой" в большой мере субъективен. А вот количество символов - вполне объективный критерий, даже есть такие разделы олимпиадных соревнований, где побеждает тот, чей код проходит все тесты, укладывается во время и имеет минимальное число символов. Так что мои 2 спана от сорта если не завалятся на длинных или бесконечных списках - победят
0
23.06.2015, 22:26

Не по теме:

Цитата Сообщение от _Ivana Посмотреть сообщение
А вот количество символов - вполне объективный критерий
Тогда надо на APL/K/J писать... у них больше дюжины символов считается длинной программой :)

0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
24.06.2015, 09:59
Цитата Сообщение от _Ivana Посмотреть сообщение
и имеет минимальное число символов
- для олимпиады, да. Но это (как и любое соревнование ради соревнования) - неинтересно. Главное качество программного кода (при разной производительности) - не краткость, а понятность (очевидность соответствия постановке).

Есть классическая задача: "если целое i имеет значение 2, присвоить ему 1, а если значение равно 1, то присвоить 2"

Самое краткое решение выглядит так:

C
1
   i=3-i;
Но его соответствие постановке неочевидно. И это - плохое решение. А правильное решение выглядит так:

C
1
2
3
4
5
6
7
     if (i == 1)
       i=2;
     else 
        if (i == 2)
           i=1;
        else
           printf("Bad data...");
И это решение хорошее (хотя и длинное)
0
24.06.2015, 10:08

Не по теме:

Цитата Сообщение от Catstail Посмотреть сообщение
"если целое i имеет значение 2, присвоить ему 1, а если значение равно 1, то присвоить 2"
императивная постановка задачи. И не полная. Отсюда и краткое функциональное решение выглядит не соответствующим задаче.

0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
24.06.2015, 12:21
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
императивная постановка задачи. И не полная. Отсюда и краткое функциональное решение выглядит не соответствующим задаче.
:

Краткое решение i=3-i отнюдь не функциональное. А неполнота состоит только в том, что нужно обработать некорректные данные. Бога ради:


C
1
2
3
4
   if ((i ==1) || (i ==2))
     i=3-i;
   else
     printf("Bad data...");
Решение все равно ненаглядное, хотя заметно короче правильного. Кстати, понимание программ (наглядность программ) - весьма актуальная проблема отрасли. В 2011-м я был на конференции, которая так и называлась: "Understanding programms"
0
Модератор
 Аватар для Curry
5153 / 3452 / 536
Регистрация: 01.06.2013
Сообщений: 7,519
Записей в блоге: 9
24.06.2015, 12:53
Цитата Сообщение от Catstail Посмотреть сообщение
Краткое решение i=3-i отнюдь не функциональное.
Позвольте с Вами не согласиться. i=3-i как раз функциональное (конечно, если результат в другую переменную записать). Т.е. тело функции представляет собой выражение.
Цитата Сообщение от Catstail Посмотреть сообщение
я был на конференции, которая так и называлась: "Understanding programms"
Дело хорошее. Ещё лучше было бы "Постановка задачи. Что это такое и как оно делается.". Для наших заказчиков было бы весьма актуально.
Цитата Сообщение от Catstail Посмотреть сообщение
"если целое i имеет значение 2, присвоить ему 1, а если значение равно 1, то присвоить 2"
- как раз, пример неправильной постановки задачи. Что делать, если i другое, не сказано.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
24.06.2015, 15:20
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Ещё лучше было бы "Постановка задачи. Что это такое и как оно делается.". Для наших заказчиков было бы весьма актуально.
- весьма характерное суждение... Заказчик не хочет напрягаться (чтобы построить корректную формулировку), программист тоже не хочет думать. Эта старая проблема. Но она не научная, а технологическая (менеджерская). Понимание программы - это другое. Дискуссия затянулась. Предлагаю остановиться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.06.2015, 15:20
Помогаю со студенческими работами здесь

Разбить список на подсписки заданной длины
Доброго времени суток, как решить задачу : разбить список на определенное количество подсписков по правилам , описанным ниже - есть...

Разбить на подсписки
Доброго времени суток, Не могу найти метода в Питоне, который разбивал бы весь список на подсписки равной длины: Например есть список: ...

Список и подсписки задача
Создать писок, в котором каждый элемент является подсписком уровня, соответствующего его месту, и в котором каждый элемент встречается не...

Список и подсписки проблема
Условие :Транспортная фирма ведет учет качества работы водителей: для каждого из них ведутся сведения по схеме: ИНН, реквизиты...

Функция, разбивающая список на подсписки
Добрый день Не могли бы вы подсказать мне, как сделать функцию, которая разбивает список элементов таким образом: Допустим, на вход...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru