Эта проблема "вдохновлена" вопросом, который изначально задавался на Quora (не для игры в гольф). Я просто хочу сделать это вызов для вас, ребята (и моя первая проблема здесь).
Учитывая массив целочисленных элементов v
и целое число d
(мы предполагаем, что d меньше или равен длине массива), рассмотрим все последовательности d
последовательных элементов в массиве. Для каждой последовательности вычислите разницу между максимальным и минимальным значением элементов в этой последовательности и назовите ее отклонением.
Ваша задача - написать программу или функцию, которая вычисляет максимальное значение среди всех отклонений всех последовательностей, рассмотренных выше, и возвращает или выводит это значение.
Проработанный пример:
v: (6,9,4,7,4,1)
d: 3
The sequences of length 3 are:
6,9,4 with deviation 5
9,4,7 with deviation 5
4,7,4 with deviation 3
7,4,1 with deviation 6
Thus the maximal deviation is 6, so the output is 6.
Это код гольф, поэтому выигрывает самый короткий ответ в байтах.
with
для всей лямбда-функцииUncaught SyntaxError: Unexpected token with
. Можете ли вы опубликовать рабочий фрагмент?with(Math)
или использоватьf=eval("with(Math)(v,d)=>max(...a)))")
.Python, 60 байт
Экономия 5 байтов благодаря Нейлу
Моя первая рекурсивная лямбда!
Использование:
источник
v and
; диапазон не увеличивается, если вы удаляете элементы.Perl, 48 байт
Включает +5 для
-0pi
Задайте ширину после
-i
параметра, укажите элементы в STDIN как отдельные строки:Просто код:
(используйте литерал
\n
для заявленной оценки)источник
$&
будет содержать все совпадение, которое будет оцениваться как первое число в арифметическом контексте.$1
будет содержать последний номер. Затем я принудительно провалил регулярное выражение с\A
. Так что он попробует все начальные позиции и длины до ширины. Я использую абсолютное значение разницы в качестве индекса массива и вижу, насколько большой массив растет. У Perl нет встроенных функций,max
поэтому я должен импровизировать-0pi3 -e
в-0pi3e
? Просто предположение о возможном сокращении, я не использую Perl (таким образом, мой вопрос).-i
ест все после него в качестве его ценности, в том числе любойe
-e
это должно идти прямо перед кодом? Облом.R,
636256 байтBillywob уже предоставил отличный ответ R, используя только базовые функции . Тем не менее, я хотел посмотреть, возможен ли альтернативный подход, возможно, с использованием некоторых обширных пакетов R. Там есть функция хорошо
rollapply
вzoo
упаковке , предназначенной для применения функции к прокатному окну массива, так что соответствует нашей цели хорошо. Мы используем,rollapply
чтобы найтиmax
каждого окна, и мы используем его снова, чтобы найтиmin
каждого окна. Затем мы берем разницу между максимумами и минутами, которая дает нам отклонение для каждого окна, а затем возвращаемmax
их.источник
gtools::rolling
, но это еще один байт, и я не знаком с ним. Я всегда думаю об использовании не базовых пакетов: с одной стороны, когда есть простое решение, возникает чувство обмана; с другой стороны, пакеты (и сообщество) являются одной из сильных сторон языка R, я думаю.R,
8077 байтРедактировать: 3 байта сохранены благодаря @rturnbull
источник
1:(length(s)-d+1)
наd:sum(1|s)-d+1
.PowerShell v2 +, 68 байт
Итеративное решение. Циклы
$v
, но на самом деле мы просто используем это как счетчик, а не просто просматриваем значения. Каждая итерация, мы нарезка$v
по$i..($i+++$d-1)
, где по$i
умолчанию0
. Мы|sort
эти элементы, и сохранить результат в$x
. Тогда мы берем самое большое[-1]
и вычитаем самое маленькое[0]
. Мы тогда|sort
те результаты и принять самые большие[-1]
из этого. Это число остается в конвейере и вывод неявный.Примеры
источник
05AB1E ,
1210 байтИспользует кодировку CP-1252 .
Попробуйте онлайн!
объяснение
источник
Java 8,
140128Побрился, частично благодаря VTCAKAVSMoACE.
Ungolfed
источник
int l(int[]a,int d){int x=0,i=0,f,j,k;for(;i<=a.length-d;i++)for(j=i;j<i+d;j++)for(k=j;k<i+d;)x=(f=a[j]-a[k++])<0?-f:f>x?f:x;return x;}
Mathematica,
4137 байтисточник
{-1,1}
чтобы избежатьAbs
?Max[BlockMap[MinMax,#,#2,1].{-1,1}]&
.Рубин, 45 байт
Я чувствую, что это может быть намного лучше.
источник
MATLAB с наборами инструментов статистики и обработки изображений, 33 байта
Это определяет анонимную функцию. Пример использования:
Вы также можете попробовать это на Octave в Ideone. (но Octave, в отличие от Matlab, требует явной загрузки пакета изображений).
объяснение
источник
Скала, 48 байт
Ungolfed:
Объяснение:
источник
MATL , 10 байт
Попробуйте онлайн!
объяснение
Рассмотрим входные данные [6,9,4,7,4,1], 3 в качестве примера.
источник
На самом деле , 13 байтов
Попробуйте онлайн!
-6 байт из наблюдения в ответе Хаши Нелли , что кусочки короче, чем
d
не влияют на максимальное отклонение.Объяснение:
источник
PHP,
8987 байтНе особенно умный или красивый, но это работает. Используйте как:
для
v
=6,9,4,7,4,1
,d
=3
Изменить: 2 байта сохранены благодаря Йорг Хюльсерманн
источник
echo+$o;
вместоecho$o?:0;
CJam , 17 байт
(Также
q~ew:$z)\(\;.-:e>
)Попробуйте онлайн!
объяснение
источник
Java 7,159 байт
Ява = дорого (я знаю, что это может быть в гольф гораздо больше)
Ungolfed
источник
Haskell, 56 байт
Пример использования:
3 # [6,9,4,7,4,1]
->6
.Учитывая диапазон меньше , чем
d
не меняет общий максимум, так что мы можем работатьtake d
вплоть до самого конца списка (т.е. также включают диапазоны с последнимиd-1
,d-2
...0
элементами). Рекурсия заканчивается пустым списком, в котором мы устанавливаем отклонение0
.источник
Java, 126 байт
Я был вдохновлен ответом dpa97 и нашел это:
Расширенный, игра в гольф и пример кода
источник
Ракетка 121 байт
Ungolfed:
Тестирование:
Выход:
источник
q, 25 байтов
mmax
иmmin
скользящее окно максимум и минимум соответственнопример
источник
C #, 131 байт
вот подробное решение linq
источник
C #, 163 байта
Golfed:
Ungolfed:
Тестовое задание:
Выход:
источник
Pyth, 11 байт
объяснение
источник
Желе , 8 байт
Попробуйте онлайн!
Использует тот же алгоритм, что и Dyalog APL, но я сам понял это, прежде чем посмотреть на него.
Объяснение:
Примечание:
x
,y
оставлены, правильные аргументы соответственно.источник
Perl 6 , 44 байта
$^a
и$^b
являются двумя аргументами функции, вызваннойv
иd
соответственно в постановке задачи.rotor
Метод возвращает последовательность подпоследовательностейv
размераd
.источник
Clojure,
7367 байтИзменить: Использование
#(...)
вместо(fn[...])
иfor
вместоmap
.источник
Python 3, 80 байт
источник
(max(v[i:i+d])-min(v[i:i+d])for i in range(-~len(v)-d)
вместоmap(lambda g:max(g)-min(g),[v[i:i+d]for i in range(-~len(v)-d)])