проблема
Давайте определим обобщенный набор Кантора путем итеративного удаления некоторых сегментов рациональной длины из середины всех интервалов, которые еще не были удалены, начиная с одного непрерывного интервала.
Учитывая относительную длину сегментов, которые нужно удалить или нет, и количество итераций, которые нужно сделать, проблема состоит в том, чтобы написать программу или функцию, которая выводит относительную длину сегментов, которые были или не были удалены после n
итераций.
Пример: итеративно удалить 4-е и 6-е восьмое
Входные данные:
n
- число итераций, индексируется начиная с 0 или 1
l
- список длин сегментов в виде положительных целых чисел с gcd(l)=1
нечетной длиной, представляющих относительную длину частей, которые либо остаются такими, какие они есть, либо удаляются, начиная с сегмента, который не удаляется. Поскольку длина списка нечетная, первый и последний сегменты никогда не удаляются. Например, для обычного набора Кантора это будет [1,1,1] для одной трети, которая остается, одна треть, которая удаляется, и снова одна треть, которая не удаляется.
Выход:
Целочисленный список o
, gcd(o)=1
относительной длины сегментов в n
итерации, когда сегменты, которые не были удалены в предыдущей итерации, заменены уменьшенной копией списка l
. Первая итерация просто [1]
. Вы можете использовать любой однозначный метод вывода , даже унарный.
Примеры
n=0, l=[3,1,1,1,2] → [1]
n=1, l=[3,1,1,1,2] → [3, 1, 1, 1, 2]
n=2, l=[3,1,1,1,2] → [9,3,3,3,6,8,3,1,1,1,2,8,6,2,2,2,4]
n=3, l=[5,2,3] → [125,50,75,100,75,30,45,200,75,30,45,60,45,18,27]
n=3, l=[1,1,1] → [1,1,1,3,1,1,1,9,1,1,1,3,1,1,1]
Вы можете предположить, что ввод действителен. Это код-гольф , поэтому выигрывает самая короткая программа, измеряемая в байтах.
[0, 1, 2, 4, 6, 7]
вместо[3, 1, 1, 1, 2]
?Ответы:
Желе ,
15 1312 байт-2 благодаря Деннису (использование ссылки, а не цепочки позволяет неявно использовать право
¡
; нет необходимости заключать1
в список из-за того, что Jelly печатает списки из одного элемента так же, как элемент)-1 благодаря Эрик Outgolfer (используйте,
Ɗ
чтобы сохранить новую строку от использованияÇ
)Полная программа печати списка в формате Jelly (поэтому
[1]
печатается как1
)Попробуйте онлайн!
Как?
источник
Python 2 ,
1201071041031009989 байтПопробуйте онлайн!
Сохраненный
источник
R , 94 байта
Попробуйте онлайн!
источник
Haskell ,
7658 байтПопробуйте онлайн!
Функция
(%)
принимает список длин строк вl
качестве первого аргумента и количество итераций вn
качестве второго ввода.Спасибо Энгсу и Орджану Йохансену за -18 байт!
источник
n
и#
полностью сбросив ее%
может быть сокращен доl%a=do(x,m)<-zip a$a>>[l,[sum l]];(*x)<$>m
.JavaScript (Firefox 42-57), 80 байт
Нуждаются в этих конкретных версиях, потому что он использует как массивы, так и возведения в степень.
источник
JavaScript (Node.js) , 71 байт
Попробуйте онлайн!
источник
Java 10, 261 байт
Изменяет input-List вместо того, чтобы возвращать новый для сохранения байтов.
Попробуйте онлайн.
источник
Желе , 13 байт
Попробуйте онлайн!
Полная программа. Выходы
1
вместо[1]
. Раздражает,ḋ
не работает, как×S¥
в этом контексте, иƭ
не работает с nilads. > _ <источник
APL (Dyalog Classic) , 20 байтов
Попробуйте онлайн!
источник
К (нгн / к) , 27 байтов
Попробуйте онлайн!
{
}
это функция с аргументамиx
иy
(y;+/y)
параy
и ее сумма{
}[(y;+/y)]
проекция (карри или частичное применение) диадической функции с одним аргументом.x
будет(y;+/y)
иy
будет аргументом при применении.,1
синглтон список, содержащий 1x{
}[
]/
применять проекционныеx
раз(#y)#x
изменить на длину текущего результата, т.е. чередовать между внешнимy
и его суммойy*
умножьте каждый элемент вышеупомянутого на соответствующий элемент текущего результата,/
конкатенацияисточник
Рубин , 73 байта
Попробуйте онлайн!
источник
Pyth , 20 байтов
Вводом является массив сегментов
l
, затем итерацииn
. Попробуйте онлайн здесь или проверьте все тестовые примеры сразу здесь .источник