задача
Для заданного списка целых чисел L и другого целого числа s цель состоит в том, чтобы вычислить по столбцам суммы всех s- длинных (потенциально перекрывающихся) срезов L , при этом сохраняя их положения относительно L (см. Ниже).
Определения
В ы -длиной (перекрывающиеся) срезы список L все смежные подпоследовательности (без упаковки) из L , которые имеют длину s .
Для того, чтобы соответствовать позициям срезов s относительно L , вы можете представить построение «лестницы», где каждый срез s i имеет смещение позиций i от начала.
Спекуляции
- s представляет собой целое число выше , чем 1 , и строго меньше , чем длина L .
- L всегда будет содержать как минимум 3 элемента.
- Вы можете соревноваться на любом языке программирования и можете принимать и выводить данные любым стандартным методом , при этом отмечая, что эти лазейки по умолчанию запрещены. Это код-гольф , поэтому выигрывает самое короткое представление (в байтах) для каждого языка .
Примеры и тестовые случаи
Вот рабочий пример:
[1, 2, 3, 4, 5, 6, 7, 8, 9], 3
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
[4, 5, 6]
[5, 6, 7]
[6, 7, 8]
[7, 8, 9]
-------------------------------- (+) | column-wise summation
[1, 4, 9, 12, 15, 18, 21, 16, 9]
И еще несколько тестов:
[1, 3, 12, 100, 23], 4 -> [1, 6, 24, 200, 23]
[3, -6, -9, 19, 2, 0], 2 -> [3, -12, -18, 38, 4, 0]
[5, 6, 7, 8, 2, -4, 7], 3 -> [5, 12, 21, 24, 6, -8, 7]
[1, 2, 3, 4, 5, 6, 7, 8, 9], 3 -> [1, 4, 9, 12, 15, 18, 21, 16, 9]
[1, 1, 1, 1, 1, 1, 1], 6 -> [1, 2, 2, 2, 2, 2, 1]
[1, 2, 3, 4, 5, 6, 7, 8, 9], 6 -> [1, 4, 9, 16, 20, 24, 21, 16, 9]
code-golf
array-manipulation
subsequence
Мистер Xcoder
источник
источник
s
больше чемL/2
. Может быть, добавить еще несколько тестовых случаев, когда это так[1, 1, 1, 1, 1, 1, 1], 6 ->
[1, 2, 2, 2, 2, 2, 1] `или[1, 2, 3, 4, 5, 6, 7, 8, 9], 6 -> [1, 4, 9, 16, 20, 24, 21, 16, 9]
?Ответы:
J ,
11, 98 байт-1 байт благодаря милям!
Как это устроено?
Левый аргумент s, правый - L
]\
- разбивает L на подсписки длиной s/.
- извлекает косые диагонали (антидиагоналы)+/
- складывает их[:
- делает вилку из вышеперечисленных глаголовВот пример J сессии для первого теста:
Попробуйте онлайн!
источник
/.
, в отличие от главной диагонали, идущей от левого к нижнему правому.,/\
на]\
Haskell ,
5956 байтПопробуйте онлайн!
Определяет функцию,
(#)
которая принимает списокs
и число вn
качестве аргументов.Это основано на наблюдении, что для
s = [1, 2, 3, 4, 5, 6, 7, 8, 9]
иn = 3
такой же как
Чтобы сгенерировать этот изначально увеличивающийся, затем постоянный и, наконец, убывающий список, мы можем начать с
который дает
[1, 2, 3, 4, 5, 4, 3, 2, 1]
. Добавление вn
качестве дополнительного ограничения вminimum
выражение дает правильный[1, 2, 3, 3, 3, 3, 3, 2, 1]
ответ для спискаn = 3
, хотя дляn = 6
(или вообще любогоn > lengths s/2
) дополнительного ограниченияlength s + 1 - n
необходимо:или короче:
Для парного умножения
[1..length s]
используется zips
, и, посколькуzip
более длинный список усекается до длины более короткого, можно использовать бесконечный список[1..]
:источник
JavaScript (ES6),
656258 байтСохранено 4 байта благодаря @Shaggy
Принимает ввод в синтаксисе карри
(a)(n)
.Контрольные примеры
Показать фрагмент кода
источник
a=>n=>a.map((v,i)=>v*Math.min(++i,n,a.length+1-(n>i?n:i)))
на 58 байт?Java 8, 83 байта
Этот первый контрольный пример (и два последних, которые я добавил) несколько раз меня перепутал, но теперь он наконец работает ..: D
Модифицирует входной массив вместо возврата нового.
Объяснение:
Попробуйте онлайн.
источник
05AB1E , 12 байтов
Попробуйте онлайн!
источник
MATL , 8 байт
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Рассмотрим входы
[1, 3, 12, 100, 23]
и4
.источник
APL (Dyalog Unicode) ,
1914 байтов SBCS-5 благодаря нгн.
Анонимная неявная инфиксная функция, принимающая s в качестве левого аргумента и L в качестве правого аргумента. Предполагается
⎕IO
( я ndex O rigin), что по0
умолчанию на многих системах.Попробуйте онлайн!
Пояснение с примером дела
[1,3,12,100,23]
(
…)
Применить следующую анонимную молчаливую функцию:,/
перекрывающиеся окна такого размера;[[1,3,12],[3,12,100],[12,100,23]]
(
…)\
Кумулятивно примените эту молчаливую следующую анонимную молчаливую функцию:⊢
правильный (самый) аргумент0,
с нулем слеваКумулятивное сокращение означает, что мы вставляем функцию в каждое «пространство» между последовательными терминами, прокладывая путь справа налево. Для каждого «пробела» функция отбрасывает левый аргумент, но добавляет дополнительный ноль. По сути, к каждому члену добавляется столько нулей, сколько слева от него «пробелов», поэтому первый член получает ноль пробелов, второй получает один, а третий получает два:
[[1,3,12],[0,3,12,100],[0,0,12,100,23]]
↑
повысить рейтинг, объединяя списки в одну матрицу, дополняя нулями;┌ ┐
│1 3 12 0 0│
│0 3 12 100 0│
│0 0 12 100 23│
└ ┘
∘
затем+⌿
суммируйте по вертикали;[1,6,36,200,23]
источник
⊢,⍨¨0⍴⍨¨⍳∘≢
->{0,⍵}\
+⌿∘↑((0,⊢)\,/)
более элегантным.2{(⊃⌽⍺),⊃⍵}/⊢
->2{⊃¨(⌽⍺)⍵}/⊢
Желе , 6 байт
Попробуйте онлайн!
Как это устроено
источник
Japt , 13 байт
Это заняло слишком много времени, когда
s
>L/2
!Попытайся
объяснение
источник
s > L/2
! » У меня было точно так же. Другие тестовые примеры просты, но тот первый (и два, которые я добавил в конце) был раздражающим! .. +1 от меня!Wolfram Language (Mathematica) , 42 байта
Попробуйте онлайн!
источник
Юлия , 41 байт
Попробуйте онлайн!
\
оператора.a[L=end]
является более короткой альтернативойL=length(a)
.источник
Japt ,
1312 байт-1 байт благодаря @ETHproductions
Попробуйте онлайн!
источник
R ,
5251 байтПопробуйте онлайн!
Это эквивалентно ответу Лайкони .
seq(l)
производит индексы1...length(l)
с тех порlength(l)>1
(иначе это произвело бы1...l[1]
). Я сохраняю его какx
, сохраняю его как обратныйy
, и беру первый элементy
(length(l)
), чтобы аккуратно перенести ответ Лайкони и сохранить байт!Оригинальный ответ, 52 байта
Попробуйте онлайн!
Выходные данные
l
поэлементно умножаются на минимумs
, индекс элементаx
, основанный на 1length(l)-x+1
, иlength(L)-s+1
.Это также эквивалентно ответу Лайкони, используя
L-x
вместо тогоrev(x)
, чтобы быть короче.источник
APL + WIN, 25 байт
Запрашивает для ввода на экране L с последующим s
Объяснение:
источник
K (ок) , 30 байтов
Решение:
Попробуйте онлайн!
Пример:
Объяснение:
Не думай, что я смогу поспорить с J на этом. Создайте список нулей, которые будут добавлены и добавлены к списку скользящего окна, затем подведите итог:
Разбивка выглядит следующим образом ... хотя это все еще кажется неуклюжим.
источник
Шелуха , 4 байта
Попробуйте онлайн!
Использует идею из J ответа Галена Иванова .
объяснение
источник
C (gcc) , 100 байт
Попробуйте онлайн!
источник
Python 2 ,
6866 байт-2 байта благодаря Лайкони
Попробуйте онлайн!
источник
max(i,n-1)
вместо[i,n-1][n>i]
.Perl 5 , 63 байта
Попробуйте онлайн!
источник
C (gcc) ,
838179 байтовСуществует три основных этапа манипулирования списком: наращивание, поддержание и охлаждение. По мере продвижения по списку мы будем увеличивать наш коэффициент, пока не достигнем некоторого максимума. Если в список может поместиться полный цикл срезов, этот максимум будет равен длине срезов. В противном случае оно будет таким же, как и количество подходящих срезов. На другом конце мы снова уменьшим коэффициент, чтобы приземлиться на 1 на последнем элементе.
Длина фаз разгона и охлаждения, которые усиливают это плато, на единицу меньше этого максимального фактора.
Надеемся, что незакрашенные циклы перед их объединением проясняют (R = длина фазы нарастания):
Три цикла - это слишком много, поэтому решение коэффициента на основе r дает нам один цикл (используя s для R, чтобы сохранить несколько байтов):
Попробуйте онлайн!
источник
Perl,
4544 байтаВключает +4 для
-ai
Также обратите внимание, что этот код выдает 2 предупреждения perl при запуске. Вы можете подавить их за один удар, добавивX
опциюУкажите длину маски после
-i
опции и массив в одной строке на STDIN:Просто код:
источник
Рубин , 62 байта
Попробуйте онлайн!
По сути, это порт для ответа Арнаулда на javascript , за исключением того, что необходимость
with_index
гораздо более болезненна.За то время, которое потребовалось для меня, чтобы принять решение фактически представить это, я отказался от этой 70-байтовой версии, которая ближе к алгоритму Денниса .
источник
Clojure, 72 байта
источник
Пыть , 106 байт
Принимает L в первой строке как массив и принимает s во второй строке
Объяснение:
Попробуйте онлайн!
источник
Python + NumPy, 64 байта
Назовите это с l в качестве списка и N в качестве длины.
источник