Напишите функцию или программу, которая берет список и создает список локальных крайностей.
В списке [x_0, x_1, x_2...]
локальный экстрим есть x_i
такой, что x_(i-1) < x_i
и x_(i+1) < x_i
или x_(i-1) > x_i
и и x_(i+1) > x_i
. Обратите внимание, что первый и последний элементы списка никогда не могут быть локальными крайностями.
Так что для некоторых примеров
local_extremes([1, 2, 1]) = [2]
local_extremes([0, 1, 0, 1, 0]) = [1, 0, 1]
local_extremems([]) = []
Это кодовый гольф, поэтому выигрывает самый короткий код!
1 2 2 1
не должны ли они2
также рассматриваться как крайности? - Я знаю, это сделало бы решение намного сложнее ...Ответы:
Mathematica
66 5851Текущее решение
Сокращен благодаря вкладу Калле.
Partition[#,3,1]
находит тройки.(a-b) (b-c)<0
истинно , если и только еслиb
нижеa
,c
или вышеa
,c
. и смотрит на признаки различия. Локальный экстрим вернется либо либо,{-1,1}
либо{1,-1}
.Примеры
Предыдущее решение
Это приводит примеры всех троек (сгенерированных
Partition
) и определяет, является ли средний элемент меньшим, чем оба крайних значения, или большим, чем крайние значения.Первое решение
Это находит тройки и смотрит на признаки различия. Локальный экстрим вернется либо либо,
{-1,1}
либо{1,-1}
.пример
Анализ :
%
относится к результату из соответствующей предыдущей строки.Sort@Sign@Differences@x=={-1,1}
идентифицирует тройки из {{9, 10, 7}, {10, 7, 6}, {7, 6, 9}, {6, 9, 0}, {9, 0, 3}, {0, 3, 3}, {3, 3, 1}, {3, 1, 10}}, так что знак (-, 0, +) разностей состоит из a-1
и a1
. В данном случае это:Для каждого из этих случаев х,
x[[2]]
относится ко второму члену. Это будут все локальные максимумы и минимумы.источник
J - 19 символов
Ничего не мог поделать;)
Объяснение следует:
2-/\]
- Для каждой пары элементов в аргументе (каждый инфикс длиной в 2 элемента) возьмите разницу.2*/\
- Теперь над каждой парой нового списка возьмите товар.0>
- Проверьте, является ли каждый результат меньше 0. Это происходит только в том случае, если у мультипликаторов были знаковые знаки, т. Е. Не бывает, если они имели одинаковый знак или были равны нулю.0,
- Объявите, что первый элемент не является экстремальным.}:
- Отрежьте последний элемент, потому что это тоже не может быть экстремальным.#~
- Используйте истинные значения на правой стороне, чтобы выбрать элементы из списка на левой стороне.Использование:
источник
Javascript -
6245 символовредактировать
источник
Рубин,
8370605549 знаковПечатает все локальные крайности в STDOUT.
Использует<=>
оператор "космический корабль", который мне очень нравится. (Возвращает 1, если первая вещь больше, чем вторая, -1, если она меньше, и 0, если она равна. Следовательно, если они прибавляют к -2 или 2, это означает, что середина является экстремальной.)Уже нет, как @daniero указал, что «очевидный» путь на самом деле короче!Изменился еще раз! Теперь он использует потрясающий алгоритм, найденный в ответе МТ0 (+1 к нему!).
Кроме того, мне нравится,
each_cons
который выбирает каждуюn
группу последовательных элементов в массиве. И трейлингif
тоже интересный.В целом, мне просто нравится, как элегантно это выглядит.
Некоторые примеры прогонов:
источник
f=->a{a.each_cons(3){|x,y,z|p y if((x<=>y)+(z<=>y)).abs==2}}
x>y&&y<z||x<y&&y>z
(даже если оператор космического корабля очень симпатичный);)!((x..z)===y)
еще короче, хотя и не такой умныйx < z
.C ++ - 208 символов
Самое длинное решение снова:
Чтобы использовать, введите ваши целые числа, затем любой символ, который будет сбой входного потока - любые нечисловые символы должны работать.
Входные данные:
0 1 0 x
Выход:
1
источник
deque
вместо,vector
чтобы получить 2 символа.i
иj
вы можете объявитьint i;
сразу после сбора и использовать два цикла вместо объявления двух переменных.i++
в цикле for и начать выполнение условия,if(v[++i]>[i-1]...
чтобы снова получить один символ.Matlab - 45 байт
источник
Python 2,7 - 73 байта
Не слишком впечатляет (посмотрите на каждый элемент списка, кроме первого и последнего, посмотрите, больше он или меньше, чем его соседи).
Я в основном только публикую это, потому что не все знают, что вы можете сделать этоx<y>z
и работать. Я думаю, что это здорово.Да,
x<y>z
это отличная особенность Python, но на самом деле она не оптимальна в этом случае. Спасибо VX за трюк умножения, который мне вообще не приходил в голову. Wrzlprmft напомнил мне, что объявление анонимной функции требует меньше нажатий клавиш, чемdef x(y):
.источник
if(l[i]-l[i-1])*(l[i]-l[i+1])>0
уменьшит код на 11 символов ...def e(l):\n
такое же количество символов, какe=lambda l:
и я, но я забыл, что вам не нужно использоватьreturn
ключевое слово. Благодарность!(l[i]-l[i-1])*(l[i]-l[i+1])
как,1
еслиl[i]
это местная крайность и в0
противном случае, мне не нужно использовать>0
. Я могу просто позволить Python интерпретировать это как бул. :)\n
в объявлении! Это позволило бы сохранить два символа, но включение по-return
прежнему делает это не стоит.Haskell 50
источник
x>p&&x>n
имеет на одного персонажа меньше, чемx>max p n
:-),
тоже не нужен.x>p&&x>n
в(x>p)==(x>n)
локальные минимумы тоже добавляют еще 4 символов.Желе , 8 байт
Попробуйте онлайн!
объяснение
Элемент является только локальным экстремумом, если его различие с его левым соседом имеет знак, противоположный его разнице с его правым соседом, то есть знаки различий отличаются на 2 или -2. У Jelly есть ряд полезных примитивов для работы с «находить элементы с определенными свойствами» (в частности, мы можем найти элементы с определенными свойствами в одном списке и использовать их для извлечения элементов из другого списка), что означает, что мы можем перевести обратно на более или менее непосредственно исходный список (нам просто нужно сместить на 1, потому что первый и последний элементы исходного списка были потеряны при разнице).
источник
Питон с Numpy -
81 7467 байт (6154 безimport
строки)Входные данные должны быть массивом Numpy.
источник
С, 83
источник
awk - 32 символа
Не было никакой надежды обойти язык, такой как J или APL, для краткости, но я все равно решил бросить свою шляпу на ринг. Объяснение:
a
,b
иc
держатьx_i
,x_(i-1)
иx_(i-2)
b-c
иa-b
приблизить производную до и послеx_(i-1)
x_(i-1)
есть локальная крайность, поэтому напечатайтеисточник
Брахилог , 17 байт
Попробуйте онлайн!
Принимает ввод через входную переменную и генерирует вывод через выходную переменную.
Если можно было гарантировать,
s₃{{⌉|⌋}.&bh}
что последовательности значений отсутствуют, сохраняются четыре байта.источник
Perl 5
-p
, 49 байтПопробуйте онлайн!
источник
Wolfram Language (Mathematica) ,
4342 байтаПопробуйте онлайн!
Я думаю,
Nothing
это слишком долго ...источник
05AB1E ,
1110 байтПопробуйте онлайн или проверьте еще несколько тестов .
Объяснение:
источник
PHP,
116 114113Пример использования:
источник
Haskell, 70C
Гольф версия
Неуправляемая версия
источник
Javascript: 102 символа
источник
APL, 19 байт
Я преобразовал версию с 20 символами J в APL. Но я добавляю ноль к началу и концу вместо удаления первой и последней цифры. В противном случае это работает так же, как версия J.
⍵
формальный параметр омега. Это вход в функцию.источник
{x@1+&0>2_*':-':0 0,x}
. 6 из этих символов (2_
и0 0,
) расходуются на защиту от ошибки длины, если аргумент короче, чем два элемента, поэтому если бы не эта проблема, это было бы 16 ... Действие также немного отличается - мы должны повернуть логический список в список индексов с помощью1+&
и использовать его для индексацииx
снова - но это короче, а также очень K-Ish вещь, которую нужно сделать.Python 2 , 59 байт
Попробуйте онлайн!
Эта функция в основном избегает дорогостоящего процесса индексации, принимая элементы списка в качестве аргументов, а не сам список. Хотя в списке осталось более одного элемента, мы рекурсивно строим список, проверяя максимум на каждом шаге.
источник