Список положительных целых чисел можно представить в виде квантованного горного хребта, где каждая запись списка представляет высоту одного вертикального участка гор.
Например, список
1, 2, 2, 3, 4, 3, 5, 3, 2, 1, 2, 3, 3, 3, 2, 2, 1, 3
может стать ассортиментом
x
x x
xxxxx xxx x
xxxxxxxx xxxxxx x
xxxxxxxxxxxxxxxxxx
(Менее поэтические люди могли бы назвать это гистограммой, но я отвлекся.)
Вопрос в этой задаче: сколько пиков в горном массиве какого-то произвольного списка? По сути, сколько локальных максимумов в списке?
Пик определяется как непрерывный участок одного или нескольких столбцов горного хребта, которые все равны по высоте, где столбцы непосредственно слева и справа имеют меньшую высоту.
Легко увидеть, что в примере есть четыре пика в этих скобках:
1, 2, 2, 3, (4), 3, (5), 3, 2, 1, 2, (3, 3, 3), 2, 2, 1, (3)
Обратите внимание, как участок (3, 3, 3)
плато считается пиком, потому что это непрерывный набор столбцов, равных по высоте, выше, чем его соседние столбцы.
Последнее также (3)
считается пиком, потому что для целей этой задачи мы определим левого соседа самого левого столбца и правого соседа самого правого столбца равными нулю высоты.
Это означает , что список только с одним значением, например 1, 1, 1
, может быть интерпретирован как 0, 1, 1, 1, 0
и , таким образом , имеет один пик, а не никто: 0, (1, 1, 1), 0
.
Единственный список с нулевыми пиками - это пустой список.
Вызов
Напишите функцию или программу, которая принимает произвольный список натуральных чисел и печатает или возвращает количество пиков в соответствующей горной цепи.
Самый короткий код в байтах побеждает. Tiebreaker - более ранний пост.
Тестовые случаи
Input List -> Output Peak Count
[empty list] -> 0
1, 1, 1 -> 1
1, 2, 2, 3, 4, 3, 5, 3, 2, 1, 2, 3, 3, 3, 2, 2, 1, 3 -> 4
1 -> 1
1, 1 -> 1
2, 2, 2, 2, 2 -> 1
90 -> 1
2, 1, 2 -> 2
5, 2, 5, 2, 5 -> 3
2, 5, 2, 5, 2, 5, 2 -> 3
1, 2, 3, 4 -> 1
1, 2, 3, 4, 1, 2 -> 2
1, 3, 5, 3, 1 -> 1
7, 4, 2, 1, 2, 3, 7 -> 2
7, 4, 2, 1, 2, 1, 2, 3, 7 -> 3
1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 -> 10
1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1 -> 10
2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 -> 10
1, 3, 3, 3, 1, 3, 3, 1, 3, 1, 3, 3, 3, 3, 1 -> 4
12, 1, 2, 1, 2, 3, 3, 3, 2, 4, 4, 4, 1, 5, 5, 4, 7, 9 -> 6
87, 356, 37673, 3676, 386, 909, 909, 909, 909, 454, 909, 909 -> 3
87, 356, 37673, 3676, 386, 909, 909, 909, 909, 454, 909, 908, 909 -> 4
источник
Ответы:
Pyth, 18 байт
На основе @ PeterTaylor повторяется больше, чем решение, но с изюминкой.
++ZQZ
: Добавить нули с обеих сторон.eMr ... 8
: Удалить повторы.u ... 2 ...
: Примените следующее дважды:>VGTG
: Сопоставить каждую пару чисел с тем, находятся ли они в порядке убывания._
И наоборот.1 на выходе соответствует
1, 0
предыдущему шагу, который соответствуетa < b > c
входу из-за обращения.s
: Сумма (и печать)источник
CJam (
32 26 2421 байт)Ожидаемый ввод - разделенные пробелами числа.
Онлайн демо ; полный набор тестов (ожидаемый результат для
1
каждого теста).Спасибо Мартину за сообщение, что текущая версия CJam улучшает один из используемых операторов, сохраняя 2 символа; и для дальнейшего сохранения 3-х символов.
рассечение
Две фазы: дедупликация, затем определение локальных максимумов в каждом наборе из трех.
источник
JavaScript (ES6),
5451 байтобъяснение
Принимает массив чисел
Тест
Показать фрагмент кода
источник
Pyth,
2523 байтаОбъяснение:
источник
0q~0]{2ew::-:g0-}2*1-,
на 22.Юлия, 66
Pad, дифференцируются:
y=diff([0;x;0])
.Игнорировать плато
y=y[y.!=0]
.Граф
+
до-
пересечения нуля:sum((y[1:end-1].>0)&(y[2:end].<0))
.источник
MATLAB,
2927 байтАнонимная функция, которая находит пики в данных и подсчитывает их количество. 0 добавляется и добавляется к данным, чтобы гарантировать, что пики на самых краях обнаружены в соответствии с вопросом.
Это также будет работать с Octave . Вы можете попробовать онлайн здесь . Просто вставьте приведенный выше код в командную строку, а затем запустите его с
ans([1,2,1,3,4,5,6,1])
(или любым другим вводом).Поскольку числа всегда + ve, мы можем предположить, что они больше нуля, поэтому можем сохранить 2 байта, используя
nnz
вместоnumel
.источник
Python 3, 75 байт
Это мой первый Codegolf, поэтому могут быть некоторые места, чтобы сократить его, особенно
d=((n==p)&d)+(n>p)
часть. Однако это работает на всех тестовых случаяхисточник
Mathematica,
42363332 байтаСпасибо Мартину Бюттнеру за сохранение 1 байта.
PeakDetect
просто делает почти все!Тестовые случаи:
источник
CJam,
2726 байтовИспользует кодирование длины серии для удаления дубликатов. После этого мы проверяем для каждого триплета, является ли средний самый большой номер.
Попробуй это здесь! Проходит тестовый набор Питера Тейлора .
источник
MATL , 22 байта
Использует текущую версию языка / компилятора.
пример
объяснение
источник
Mathematica,
55393635 байтТеперь работает на всех тестовых случаях!
источник
Last/@
->#&@@@
Retina ,
3331 байтСпасибо Нейлу за сохранение 2 байта.
Попробуйте онлайн!
Принимает ввод как разделенный запятыми унарный список.
источник
\b(1+)(?<!\1 \1)( \1)*\b(?! \1)
кажется, чтобы сохранить 2 байта?JavaScript ES6,
9694 байтаПринцип: разложите плато в одиночные пики, найдите пики, которые определены как выше, чем следующий и предыдущий элементы.
Принимает ввод в виде массива.
Демо-версия:
источник
ES6,
5048 байтовСохранено 2 байта благодаря @ user81655.
Ungolfed:
источник
.map()|
раньше.)МАТЛ, 23
Поскольку нам нужно использовать esolangs на основе стека, чтобы быть конкурентоспособными, я переопределил свое решение Julia в MATL.
Нажмите
0
, введите0
, объедините дважды.0i0hh
=>x = [0, input(''), 0]
Дифференцировать.
d
=>x = diff(x)
Дублируйте
t
, конвертируйте одно в логическое значение и используйте его для индексации другого.tg)
=>x=x(x!=0)
Дублируйте снова.
t
Первый:
[1,G])0>
=>y1 = x(1:end-1)>0
Обмен.
w
Второе:
[2,0])0<
=>y2 = x(2:end)<0
Логика и подсчитайте правдивые ценности.
*s
=>sum(y1 & y2)
источник
[1,G]
->5L
экономит 3 байта.[2,0]
->6L
сохраняет 3 байтаand
(&
) из MATL (и то же самое дляor
). Его всегда можно заменить*o
, и часто просто так*
, как в этом случае. Что вы думаете? Таким образом, символы&
и|
могут быть использованы для других функций в будущем.Japt, 19 байт
Это было проще, чем я думал, но начало немного расточительно из-за ошибки.
Попробуйте онлайн!
Как это работает
Неконкурентная версия, 15 байт
Ранее сегодня я добавил
è
функцию, которая похожа,f
но возвращает количество совпадений, а не сами совпадения. Я также исправил ошибку, при которойArray.u
возвращалась бы длина массива, а не сам массив.Попробуйте онлайн!
источник
05AB1E , 9 байтов
Попробуйте онлайн!
Объяснение:
источник
Желе , 27 байт
Попробуйте онлайн!
источник
GolfScript, 35
Тест онлайн
В основном удаляет дубликаты, добавляет 0 к обоим концам и проверяет, сколько троек имеет максимум в центре.
источник
Java 8, 141 байт
Вероятно, можно использовать другой подход или использовать массив в качестве входных данных вместо List.
Объяснение:
Попробуй это здесь.
источник