Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495

Комбинации с возрастающим индексом

29.03.2020, 05:11. Показов 1055. Ответов 13

Студворк — интернет-сервис помощи студентам
Есть задачка с codewars, про комбинации.
Суть в том, чтобы цифры числа разбить на 1..n-1 количество типов комбинаций, при этом порядок индексов должен быть сохранен, например число 9457:
[['9'], ['4','5','7']] --> ['9','457'] --> 9 + 457 = 466
[['9','5','7'], ['4']] --> ['957','4'] --> 957 + 4 = 961
[['9','4','7'], ['5']] --> ['947','5'] --> 947 + 5 = 952
[['9','4','5'], ['7']] --> ['945','7'] --> 945 + 7 = 952

[['9','4'], ['5','7']] --> ['94','57'] --> 94 + 57 = 151
[['9','5'], ['4','7']] --> ['95','47'] --> 95 + 47 = 142
[['9','7'], ['4','5']] --> ['97','45'] --> 97 + 45 = 142

[['9'], ['4'], ['5','7']] --> ['9','4','57'] --> 9 + 4 + 57 = 70
[['9','4'], ['5'], ['7']] --> ['94','5','7'] --> 94 + 5 + 7 = 106
[['9'], ['4', '5'], ['7']] --> ['9','45','7'] --> 9 + 45 + 7 = 61
[['9'], ['5'], ['4','7']] --> ['9','5','47'] --> 9 + 5 + 47 = 61
[['9','5'], ['4'], ['7']] --> ['95','4','7'] --> 95 + 4 + 7 = 106
[['9','7'], ['4'], ['5']] --> ['97','4','5'] --> 97 + 4 + 5 = 106

[['9'], ['4'], ['5'], ['7']] --> ['9','4','5','7'] --> 9 + 4 + 5 + 7 = 25

Я понимаю, что для решения нужно использовать рекурсию, и мне удалось написать функцию для разбиения на 2:
Python
1
2
3
4
5
def r(a):
    if not a:
        return []
    else:
        return [a[0]+a[i] for i in range(1,len(a))] + r(a[1:])
Но как быть с остальным? Пока писал вопрос, даже условия задачи перестал понимать.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.03.2020, 05:11
Ответы с готовыми решениями:

Удалите из списка элемент с индексом k, сдвинув влево все элементы, стоящие правее элемента с индексом k
С клавиатуры вводится список из 50 элементов, индекс элемента в списке k. Удалите из списка элемент с индексом k, сдвинув влево все...

Удалите из списка элемент с индексом k, сдвинув влево все элементы, стоящие правее элемента с индексом k
Удалить элемент Дан список из чисел и индекс элемента в списке k. Удалите из списка элемент с индексом k, сдвинув влево все элементы,...

DataGrid: удалить строку с индексом 1, если строка с индексом 2 получает фокус
Мне нужно удалить строку с индексом 1 если если строка с индексом 2 получает фокус. делаю так при нажатии на строку с индексом 2: ...

13
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
29.03.2020, 20:15
codcw, а предыдущую "Next Higher Value # 1" решил?
0
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
29.03.2020, 20:17  [ТС]
eaa, нет, даже не пробовал
просто в поиске эта первой выскочила, ее и решил делать
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
29.03.2020, 20:23
Ну начни с нее, а потом эту.
1
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
30.03.2020, 02:28  [ТС]
eaa, начал с первой, понял что рекурсия тут ни при чём, вроде решение правильное, но по времени никак не проходит

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def next_higher(start_value,k):
    for v in range(start_value+1,130000):
        n = v * k
        n = list(map(int,str(n)))
        total = 0
        for i in range(1,len(n)):
            total += sum(n[:i] + n[i:])
            if len(n)!=3:
                total += n[i-1]+n[i] + sum(n[:i-1]+n[i+1:])
        total += sum(n)
        if total == v:
            break
    return v
    
    
#        if len(n)!=3:
#            for i in range(len(n)-1):
#                total += n[i]+n[i+1] + sum(n[:i]+n[i+2:])
#это было вместо 8 и 9 строчки
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
30.03.2020, 21:55
всю задачу не решал, перебор для числа через рекурсию:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def f(s, n):
    if n:
        for i in range(1, n+1):
            f(s + [s[-1]+i], n - i)
    else:
        res = []
        summ = 0
        for i in range(len(s)-1):
            x = z[s[i]:s[i+1]]
            res.append(x)
            summ += int(x)
        print(f"{res}".ljust(25), f"{' + '.join(res)}".rjust(20), '=', summ)
 
z = '5019'
f([0], len(z))
Добавлено через 1 минуту
Кликните здесь для просмотра всего текста

52139
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
['5', '2', '1', '3', '9']    5 + 2 + 1 + 3 + 9 = 20
['5', '2', '1', '39']           5 + 2 + 1 + 39 = 47
['5', '2', '13', '9']           5 + 2 + 13 + 9 = 29
['5', '2', '139']                  5 + 2 + 139 = 146
['5', '21', '3', '9']           5 + 21 + 3 + 9 = 38
['5', '21', '39']                  5 + 21 + 39 = 65
['5', '213', '9']                  5 + 213 + 9 = 227
['5', '2139']                         5 + 2139 = 2144
['52', '1', '3', '9']           52 + 1 + 3 + 9 = 65
['52', '1', '39']                  52 + 1 + 39 = 92
['52', '13', '9']                  52 + 13 + 9 = 74
['52', '139']                         52 + 139 = 191
['521', '3', '9']                  521 + 3 + 9 = 533
['521', '39']                         521 + 39 = 560
['5213', '9']                         5213 + 9 = 5222
['52139']                                52139 = 52139
2
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
30.03.2020, 23:51  [ТС]
eaa, спасибо, но выглядит очень сложно, понимаю что многого прошу, но можно без рекурсии и чтоб код был более наглядным?
0
5514 / 2867 / 571
Регистрация: 07.11.2019
Сообщений: 4,752
31.03.2020, 08:39
Python
1
2
3
4
5
6
7
8
9
10
11
z='52139'
z_list=list(z)
n=len(z)
def dec2bin_list(num, k):
    s=[]
    for i in range(k):
        s.append(['','+'][1&(num>>i)])
    return s
for i in range(2**(n-1)):
    val=''.join(''.join(x) for x in zip(z_list,dec2bin_list(i, n)))
    print(val, eval(val))
Добавлено через 6 минут
codcw, что значит порядок индексов должен быть сохранен?
Вот тут разве он сохраняется?
[['9','5'], ['4','7']] --> ['95','47'] --> 95 + 47 = 142

Добавлено через 11 минут
Хм... что-то это на комбинаторные решетки похоже по числу слагаемых:
1111, 112, 13, 22, 4
1
5514 / 2867 / 571
Регистрация: 07.11.2019
Сообщений: 4,752
31.03.2020, 10:22
Похоже это то:

Решетка разбиений порядка 4
М. Айгнер. Комбинаторная теория. М.Мир. 1982
1
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
31.03.2020, 18:15  [ТС]
u235, порядок индексов должен быть сохранен, значит что в элементах которые содержат более одной цифры, порядок индексов должен быть возрастающим
[1,2,3] -> [12,3] -> можно
[1,2,3] -> [21,3] -> нельзя

Добавлено через 14 минут
кстати, ваше решение не работает если в числе есть 0 на позиции отличной от последней
0
5514 / 2867 / 571
Регистрация: 07.11.2019
Сообщений: 4,752
31.03.2020, 19:08
codcw, понятно.
С нулями поправил:
Python
1
2
3
4
5
6
7
8
9
10
11
12
z='52139'
z_list=list(z)
n=len(z)
def dec2bin_list(num, k):
    s=[]
    for i in range(k):
        s.append(['','+'][1&(num>>i)])
    return s
for i in range(2**(n-1)):
    val=''.join(''.join(x) for x in zip(z_list,dec2bin_list(i, n)))
    lst=list(map(int, val.split('+')))
    print(val, sum(lst))
Добавлено через 7 минут
Да, это точно решетка, там тоже рассматриваются частично-упорядоченные множества (возрастающие индексы). Я в этом не сильно разбираюсь, так, интересуюсь на досуге.
1
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
31.03.2020, 19:45  [ТС]
u235, можно вкратце как ваш вариант работает?
Python
1
1&(num>>i)
вот это в частности
0
5514 / 2867 / 571
Регистрация: 07.11.2019
Сообщений: 4,752
31.03.2020, 20:05
Собственно это аналогично функции bin(). Сдвинули число num на i бит и наложили маску 1. В результате получили список нулей и единиц, соответствующие числу num.
Кстати, напоминаю, у меня не полное решение задачи. У меня аналог кода eaa, только без рекурсии.
1
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
31.03.2020, 20:12  [ТС]
u235,
Цитата Сообщение от u235 Посмотреть сообщение
не полное решение
да эт ничего, мне главное понять принцип разделения числа, остальное легко
Цитата Сообщение от u235 Посмотреть сообщение
Сдвинули число num на i бит и наложили маску 1. В результате получили список нулей и единиц, соответствующие числу num.
вот это мне вообще ни о чем не говорит, тёмный лес
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.03.2020, 20:12
Помогаю со студенческими работами здесь

Как присвоить значению X:= F с верхним индексом n и нижним индексом 2 (см. вложение)
Как присвоить значению X:= F с верхним индексом n и нижним индексом 2 (см. вложение)

Подсчитать количество отрицательных элементов с четным индексом и сумму положительных с нечетным индексом
полный ноль в VBA, ничего даже в голову не лезет

Определить средние арифметические элементы с чётным индексом и среднее арифметическое с нечётным индексом
Задачи по информатике. Турбо Паскаль. массивы. Определить средние арифметические элементы с чётным индексом и среднее арифметическое с...

элементы массива с нечетным индексом удвоить, с четным индексом заменить на число, вводимое с клавиатуры
Исправьте ошибки и помогите дописать, пожалуйста #include "stdafx.h" #include <iostream> #include <string> #include...

Удалить из массива элемент с индексом k, сдвинув влево все элементы, стоящие правее элемента с индексом k
Дан массив из N элементов и номер элемента в массиве k. Удалите из массива элемент с индексом k, сдвинув влево все элементы, стоящие...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
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