Вдохновлен вопросом на переполнение стека .
Учитывая непустой массив целых чисел x
и положительное целое число n
, вычислите сумму каждого скользящего блока длины n
вдоль массива x
, циклически заполняя недостающие значения слева значениями справа следующим образом:
- первый блок содержит первую запись
x
, которой предшествуютn-1
циклически сдвинутые записи; - второй блок имеет первую и вторую записи
x
, которым предшествуютn-2
циклически сдвинутые записи; и так далее.
Выходной массив y
имеет тот же размер, что и x
. Возможно n
превышение длины x
, а затем значения многократно повторно используются поx
кругу .
Примеры
Пример 1 (значения используются повторно только один раз)
x = [2, 4, -3, 0, -4]
n = 3
дать в качестве вывода
y = [-2, 2, 3, 1, -7]
где
-2
сумма блока[0, -4, 2]
(первые два значения получены из кругового сдвига)2
является суммой[-4, 2, 4]
(первое значение получается из кругового сдвига)3
является суммой[2, 4, -3]
(нет необходимости в круговом сдвиге)1
это сумма[4, -3, 0]
-7
это сумма[-3, 0, -4]
.
Пример 2 (значения используются повторно несколько раз)
x = [1, 2]
n = 5
дайте
y = [7, 8]
где
7
сумма блока[1, 2, 1, 2, 1]
(первые четыре значения были повторно использованы циклически)8
сумма блока[2, 1, 2, 1, 2]
(первые три значения были повторно использованы циклически)
Дополнительные правила
- Алгоритм должен работать для массивов произвольного размера и для произвольных целочисленных значений. Это допустимо, если программа ограничена типом данных или ограничением памяти; но положительные и отрицательные целочисленные значения должны обрабатываться.
- Ввод / вывод может быть взят / произведен любым разумным способом .
- Программы или функции разрешены на любом языке программирования . Стандартные лазейки запрещены.
- Самый короткий код в байтах побеждает.
Контрольные примеры
x, n, -> y
[2, 4, -3, 0, -4], 3 -> [-2, 2, 3, 1, -7]
[1, 2], 5 -> [7, 8]
[2], 7 -> [14]
[-5, 4, 0, 1, 0, -10, -4], 4 -> [-19, -15, -5, 0, 5, -9, -13]
[-5, 4, 0, 1, 0, -10, -4], 1 -> [-5, 4, 0, 1, 0, -10, -4]
[-2, -1, 0, 1, 2, 3], 5 -> [4, 3, 2, 1, 0, 5]
[-10, 0, 10], 4 -> [-10, 0, 10]
code-golf
math
arithmetic
array-manipulation
integer
Луис Мендо
источник
источник
Ответы:
Желе , 5 байт
Попробуйте онлайн!
Как это работает
источник
MATL,
111097 байт3 байта сохранены благодаря @Luis!
Первый вход - это размер окна, а второй - массив.
Попробуйте это на MATL Online
объяснение
источник
Mathematica, 29 байт
Или той же длины:
источник
CJam (16 байт)
Набор онлайн-тестов . Это анонимный блок (функция), который принимает массив и длину в стеке и оставляет массив в стеке.
рассечение
источник
Haskell, 57 байт
Попробуйте онлайн!
Просто некоторые циклы индекса и доступ к списку ввода по индексам по модулю длины списка.
источник
Haskell ,
696564 байтаПопробуйте онлайн! Пример использования:
[2, 4, -3, 0, -4] # 3
.Использование
n
прецедента вместо предшествующих записей может быть5046 байтов (избавление от обратного в начале и в конце):Попробуйте онлайн!
источник
Japt , 12 байт
Попробуйте онлайн!
TIO не поддерживает
Ë
, поэтому ссылка TIO не будет работать. Вместо этого попробуйте это здесь .источник
Pyth ,
1816 байтовСохранено 2 байта благодаря @FryAmTheEggman !
Попробуйте здесь или проверьте все контрольные примеры.
Исправлены все недостатки при стоимости -6 байт ! Большое спасибо Луису за то, что он помог мне понять задачу в чате.
Пояснение (будет обновлено)
источник
Java 8, 102 байта
Лямбда (карри) из
int[]
в лямбда изInteger
вint[]
. ПрисвоитьFunction<int[], Function<Integer, int[]>>
.Попробуйте онлайн
Неуправляемая лямбда
(j % l + l) % l
вычисляет неотрицательный остаток для любогоj
. Взято отсюда .источник
C, 91 байт
Попробуйте онлайн!
источник
Октава, 53 байта
Попробуйте онлайн!
imfilter
Функция с опциейcircular
вычисляет круговую свертку в центре окна , так что результат должен быть смещен.источник
05AB1E , 10 байтов
Попробуйте онлайн!
объяснение
источник
Perl 6 ,
4239 байтПопробуйте онлайн!
Моя первая запись на Perl 6 Возможно, может быть улучшено.
источник
->\a,\b{[«+»] map {a.rotate(-$_)},^b}
Обратите внимание, что в этом случае этого не происходит, но это было бы, если бы$b
в коде был другой экземпляр .Котлин ,
141140138 байтПросто первый шаг
представление
украшенный
TryItOnline
Правки
источник
Röda , 52 байта
Попробуйте онлайн!
Объяснение:
источник
JavaScript ES6
8078 байт2 байта сохранены благодаря Нейлу
Использование:
источник
,N
выглядит ненужный мне ...Perl 5 , 66 + 1 (-a) = 67 байт
Попробуйте онлайн!
источник
Python 2 ,
6961 байт- 8 байт. Большое спасибо @muru
Попробуйте онлайн!
Объяснение:
Во-первых, нам нужно убедиться, что слева от первоначального списка достаточно цифр, это достигается
x*n+x
частью.Например
[2,4,-3,0,4],5
,:Тогда мы перевернем список:
Далее мы получаем соответствующие блоки для каждого элемента по
[len(x)+~i:][:n]
. Срез будет обратным, т. Е. 2 получит блок:[2,-4,0,-3,4]
который обратен ожидаемому[4,-3,0,-4,2]
, но нам все-таки нужна сумма. Итак, это работает. :)источник
x[-n+1:]+x*n
должен дать вам список с достаточным отступом по обе стороны, без необходимостиlambda x,n:[sum((x[-n+1:]+x*n)[i:i+n])for i in range(len(x))]
R ,
1019389 байтПопробуйте онлайн!
источник
K (ок) , 18 байт
Решение:
Попробуйте онлайн!
Примеры:
Объяснение:
Собирался опубликовать 31-байтовое решение, тогда я вспомнил, что в ОК есть встроенный модуль для раздвижных окон ...
Бонус:
31 байт решение , которое также работает в К4 :
источник