Алгебра Стинрода является важной алгеброй, возникающей в алгебраической топологии. Алгебра Стинрода генерируется операторами, называемыми «квадратами Стинрода», один существует для каждого положительного целого числа i. Существует основа для алгебры Стинрода, состоящей из «допустимых мономов» в операциях возведения в квадрат. Наша цель - создать эту основу.
Последовательность натуральных чисел называется допустимой, если каждое целое число как минимум вдвое больше следующего. Так, например [7,2,1]
, допустимо, потому что и . С другой стороны, [3,2]
не допустимо, потому что . (В топологии мы бы написали для последовательности [7,2,1]
).
Степень последовательности является суммой её записей. Так, например, степень [7,2,1]
составляет . Превышение допустимой последовательности является первым элементом минус сумма остальных элементов, так что [7,2,1]
имеет избыток .
задача
Напишите программу, которая берет пару натуральных чисел (d,e)
и выводит множество всех допустимых последовательностей степениd
и превышения, меньшего или равного e
. Выходными данными является набор, поэтому порядок допустимых последовательностей не имеет значения.
Примеры:
Input: 3,1
Output: [[2,1]]
Здесь мы ищем допустимые последовательности с общим количеством 3. Есть два варианта, [3]
и [2,1]
. ( [1,1,1]
и [1,2]
имеют сумму 3, но не допустимы). Превышение [3]
составляет 3, а превышение [2,1]
составляет . Таким образом, единственная последовательность с избытком - это [2,1]
.
Input: 6, 6
Output: [[6], [5, 1], [4, 2]] (or any reordering, e.g., [[5,1],[4,2],[6]])
Поскольку избыток всегда меньше или равен степени, у нас нет условия превышения. Таким образом, мы просто пытаемся найти все допустимые последовательности степени 6. Параметры являются [6]
, [5, 1]
и [4, 2]
. (Они имеют избыток , и )
Input: 10, 5
Output: [[7,3], [7,2,1], [6,3,1]]
Допустимые последовательности степени 10:
[[10], [9,1], [8,2], [7,3], [7,2,1], [6,3,1]]
Они имеют избыток , , , , и соответственно, поэтому последние три все работают.
счет
Это код гольф: выигрывает самое короткое решение в байтах.
Тестовые случаи:
Любое изменение порядка вывода одинаково хорошо, поэтому для ввода (3, 3)
, вывода [[3],[2,1]]
или [[2,1],[3]]
одинаково приемлемо (однако [[1,2],[3]]
это не так).
Input: 1, 1
Output: [[1]]
Input: 3, 3
Output: [[2,1], [3]]
Input: 3, 1
Output: [[2,1]]
Input: 6, 6
Output: [[6], [5, 1], [4, 2]]
Input: 6, 4
Output: [[5,1], [4,2]]
Input: 6, 1
Output: []
Input: 7, 7
Output: [[7], [6,1], [4,2,1], [5,2]]
Input: 7,1
Output: [[4,2,1]]
Input: 10, 10
Output: [[10], [9,1], [7,2,1], [6,3,1], [8,2], [7,3]]
Input: 10, 5
Output: [[7,3], [7,2,1], [6,3,1]]
Input: 26, 4
Output: [15, 7, 3, 1]
Input: 26, 6
Output: [[16, 7, 2, 1], [16, 6, 3, 1], [15, 7, 3, 1], [16, 8, 2], [16, 7, 3]]
Ответы:
05AB1E ,
1612 байтСохранено 4 байта благодаря Grimy
Попробуйте онлайн!
объяснение
источник
ćsO-
является встроеннымÆ
.À@¨
может быть¦@
.Wolfram Language (Mathematica) ,
6762 байтаПопробуйте онлайн!
-4 байта @attinat
IntegerPartitions@d
: Получить все списки целых чисел вd
Cases[,...]
: Фильтровать по следующему условию:2#& @@# - d <= e &&
: Дважды первый элемент минус сумма меньшеe
, и ...Max@Ratios@#<=.5
: Соотношения последовательных элементов списка меньше 1/2.Поскольку
e
меньше чем .5, мы можем превратить это в цепное неравенство.Для нескольких дополнительных байтов это значительно быстрее: попробуйте онлайн!
источник
Желе ,
1615 байт-1 благодаря Эрику Outgolfer (умная настройка для проверки с использованием одного фильтра)
Диадическая ссылка, принимающая положительное целое число
d
слева и положительное целое числоe
справа, которое приводит к списку целых положительных чисел.Попробуйте онлайн! (нижний колонтитул форматирует результаты, чтобы избежать неявного форматирования списка, который Jelly делает в виде полной программы)
Как?
источник
Хаскелл ,
595854 байта1 байт сохранен благодаря nimi
4 байта сохранены благодаря xnor
Попробуйте онлайн!
источник
#
непосредственно: Попробуйте онлайн!JavaScript (V8) ,
88 8781 байтПринимает вход как
(e)(d)
. Печатает последовательности в STDOUT.Попробуйте онлайн!
комментарии
источник
Pyth , 23 байта
Попробуйте онлайн!
источник
Python 3 ,
213 байтОгромное понимание списка. Скорее всего, не самый лучший способ сделать это, но я не могу понять, как пропустить оператор if
Python 3 , 172 байта
Попробуйте онлайн!
Согласно редакции @Jonas Ausevicius
источник
all
можно взять генератор, так что вы можете просто сделатьall(...)
вместоall([...])
. Наконец, поскольку ваше представление является полностью анонимной функцией, вы не будете оштрафованы за назначение (f=
) и, таким образом, сможете вычесть его из вашего счета (-2 байта).[*(...)]
вместоlist(...)
которого обычно сохраняет байт, но в вашем случае сохраняет 2, поскольку это также позволяет вам удалить пробел.[*filter(...)]
. Также добро пожаловать :)Древесный уголь , 42 байта
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Сначала создайте список списков из
[1]..[d]
.Для каждого списка создайте новые списки, добавив перед ними все числа от удвоенного первого числа до
d
и добавьте эти списки в список списков для обработки. Это гарантирует, что все допустимые последовательности, содержащие числа не больше, чемd
созданы.Выведите только те списки, чья степень
d
и избыток не больше чемe
. (Сумма степени и превышения равна двойному первому числу в списке.)источник
Python 3 , 156 байт
принимает в
d,e
качестве входных данных; выводит список кортежейПодобно @OrangeCherries ответ и помощь от комментариев; но больше байтов сохранено
Попробуйте онлайн!
источник
Желе , 18 байт
Попробуйте онлайн!
источник
Рубин , 78 байт
Попробуйте онлайн!
источник