Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
112 / 86 / 21
Регистрация: 06.06.2011
Сообщений: 427
Записей в блоге: 1

Разбить массив на тройки с элементами цикличности

27.01.2014, 17:51. Показов 1806. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что-то никак не соображу. Помогите.
Нужно разбить список на тройки. Количество троек - по количеству элементов. При этом каждый элемент массива должен "побывать" в середине. Для этого нужно слегка "наехать" на хвост и голову списка.
Пример: Дан список: [1, 2, 3, 4, 5]
Нужно получить:
[[5, 1, 2], [1,2,3], [2,3,4], [3,4,5], [4,5,1]]
Середину-то, вроде, просто получить, а вот остальное?

Добавлено через 7 минут
И все это должно быть до такой степени универсально, чтобы даже [1,2] превращалось в [[2,1,2],[1,2,1]]

Добавлено через 3 минуты
Ой, гоню. НЕ ПОДСКАЗЫВАЙТЕ ПОКА, плиз.

Добавлено через 4 минуты
тадам!
Haskell
1
2
3
4
5
spl :: [Int] -> [(Int, Int, Int)]
spl l = zip3 (shift_right l) l (shift_left l)
    where   
        shift_left l = tail l ++ take 1 l
        shift_right l = last l : init l
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.01.2014, 17:51
Ответы с готовыми решениями:

Массив: Разбить массив на тройки так, чтобы итоговая сумма была наименьшей из всех возможных сумм...
Я решил эту задачу. Но как истинный программист хочу исследовать и другие решения (алгоритмы), сравнить их по сложности, размеру и...

Разбить исходный массив на два: с чётными и нечётными элементами
Задание: 1.Описать процедуру Split2(A, NA, B, NB, C, NC), формирующую по целочисленному массиву A размера NA два целочисленных массива B...

Динамические массивы: разбить исходный массив на два - с четными и нечетными элементами
Доброе время суток ! Подскажите пожалуйста как создать динамический масив в таком случае : У меня есть исходный массив...

7
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38194 / 21127 / 4309
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
27.01.2014, 18:01
Оно?

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
cut3' :: [a] -> [[a]]
cut3' z | (length z) < 3 = []
        | otherwise = [(head z), (head $ tail z), (head $ tail $ tail z)] : cut3' (tail z)
        
cut3 :: [a] -> [[a]]
cut3 x = cut3' (x ++ (take 2 x))      
 
Main> cut3 [1,2,3,4,5,6]
[[1,2,3],[2,3,4],[3,4,5],[4,5,6],[5,6,1],[6,1,2]]
Main> cut3 [1,2]
[[1,2,1],[2,1,2]]    
Main> cut3 "abrakadabra"
["abr","bra","rak","aka","kad","ada","dab","abr","bra","raa","aab"]
1
112 / 86 / 21
Регистрация: 06.06.2011
Сообщений: 427
Записей в блоге: 1
27.01.2014, 18:59  [ТС]
да. почти подходит. Только для длины == 2 не подходит.
Благодарю.
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,205
Записей в блоге: 24
27.01.2014, 20:11
aaleksander, а чем Вам Ваше решение не понравилось? Ну, кроме того, что ещё можно применить map (\(x,y,z) -> [x,y,z]) для превращения кортежа в список.

Не по теме:

по крайней мере, это решение проще читать, чем решение от Catstail

Не по теме:

aaleksander, а можете обобщить на случай произвольной длины групп? Ну, чтоб не только для 3, но и для 4, 5 и т.д. А число передавать вторым аргументом. Ну, только ради спортивного интереса ))

0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38194 / 21127 / 4309
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
27.01.2014, 20:44
Цитата Сообщение от Mysterious Light Посмотреть сообщение
по крайней мере, это решение проще читать, чем решение от Catstail
- а мое решение можно упростить:

Haskell
1
2
3
4
5
6
cut3' :: [a] -> [[a]]
cut3' z | (length z) < 3 = []
        | otherwise = (take 3 z) : cut3' (tail z)
 
cut3 :: [a] -> [[a]]
cut3 x = cut3' (x ++ (take 2 x))
те же 5 строк...
1
112 / 86 / 21
Регистрация: 06.06.2011
Сообщений: 427
Записей в блоге: 1
27.01.2014, 22:27  [ТС]
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Не по теме:
aaleksander, а можете обобщить на случай произвольной длины групп? Ну, чтоб не только для 3, но и для 4, 5 и т.д. А число передавать вторым аргументом. Ну, только ради спортивного интереса ))
Ну вот как-то так. Только от get_tail не знаю как избавиться.
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
spt :: [a] -> Int -> [[a]]
spt list n
    =       [last list : take (n-1) list] 
        ++  spt' (tail list) n 
        ++  [get_tail list (n-1) ++ [head list]]
 
spt' list n
    | length list <= n =[list]
    | otherwise = [(take n list)] ++ spt' (tail list) n
 
get_tail :: [a] -> Int -> [a]
get_tail list n
    | length list == n = list
    | otherwise = get_tail (tail list) n
Добавлено через 1 минуту
Цитата Сообщение от Mysterious Light Посмотреть сообщение
aaleksander, а чем Вам Ваше решение не понравилось? Ну, кроме того, что ещё можно применить map (\(x,y,z) -> [x,y,z]) для превращения кортежа в список.
Мне мое решение нравится. Просто мы одновременно запостили.

Добавлено через 10 минут
Prelude> spt [1,2,3,4,5,6,7,8,9] 4
Prelude> [[9,1,2,3],[2,3,4,5],[3,4,5,6],[4,5,6,7],[5,6,7,8],[6,7,8,9],[7,8,9,1]]
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38194 / 21127 / 4309
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
28.01.2014, 16:54
Цитата Сообщение от aaleksander Посмотреть сообщение
Мне мое решение нравится.
- но оно не совсем полное... Ведь нужно, чтобы каждая цифра исходного списка, побывала на каждом месте в n-ке чисел...

Вот очевидное обобщение моего решения:

Haskell
1
2
3
4
5
6
7
8
9
cutN' :: [a] -> Int -> [[a]]
cutN' z n | (length z) < n = []
          | otherwise = (take n z) : cutN' (tail z) n
 
cutN :: [a] -> Int -> [[a]]
cutN x n = cutN' (x ++ (take (n-1) x)) n
 
cutN [1,2,3,4,5,6,7,8,9] 4
[[1,2,3,4],[2,3,4,5],[3,4,5,6],[4,5,6,7],[5,6,7,8],[6,7,8,9],[7,8,9,1],[8,9,1,2],[9,1,2,3]]
0
112 / 86 / 21
Регистрация: 06.06.2011
Сообщений: 427
Записей в блоге: 1
28.01.2014, 17:35  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
- но оно не совсем полное... Ведь нужно, чтобы каждая цифра исходного списка, побывала на каждом месте в n-ке чисел...
Не. Изначально было сказано "в серединке".
Обобщаем уже из спорта. А мне изначально надо было на тройки разбить и захватить по одному элементу с каждой стороны. Не будем спорить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.01.2014, 17:35
Помогаю со студенческими работами здесь

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

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

Дан массив из 12 чисел. Поменять местами 1 и 4 тройки чисел, а также 2 и 3 тройки
Например, массив: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12; результат: 10, 11, 12, 7, 8, 9, 4, 5, 6, 1, 2, 3.

Массив: Образовать массив В из сумм каждой тройки чисел массива А.
Нужно сдавать ассемблер,а я в нём вообще ничего не понимаю.Весь семестр проработал(программистом),пришла сессия и что делать не...

Массив: создать одномерный массив, элементами которого являются двумерные массивы, элементами которых являются записи
создать одномерный массив, элементами которого являются двумерные массивы, элементами которых являются записи с полями целочисленного,...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru