По заданному списку положительных целых чисел определите, существует ли элемент, который больше, чем его два соседа, или меньше, чем его два соседа («удар»). Чтобы быть понятным, выпуклость никогда не может быть первым или последним элементом списка, потому что у них есть только один сосед.
Ваша программа должна вывести одно из двух последовательных значений, каждое из которых соответствует либо списку без выпуклостей, либо списку с выпуклостями. Какие значения не важны, вы можете выбрать их самостоятельно.
Это код-гольф, поэтому ответы будут оцениваться в байтах, причем меньшее количество байтов будет лучше.
Контрольные примеры
[] -> False
[1] -> False
[1,2] -> False
[1,2,1] -> True
[1,2,2] -> False
[1,2,3] -> False
[1,2,2,1] -> False
[1,2,2,3] -> False
[1,2,1,2] -> True
[1,3,2] -> True
[3,1,2] -> True
[2,2,2] -> False
code-golf
number
array-manipulation
decision-problem
Мастер пшеницы
источник
источник
[1,3,3]
(гарантирует, что ответы, использующие алгоритм Денниса, будут иметь знак приращений, а не только сами приращения)[1,2,2]
? Или я что-то упустил?[1,2,2]
совпадают с признаками этих дельт, но это не так[1,3,3]
.Ответы:
Желе , 5 байт
Возвращает 0, если есть удар, 1, если нет.
Попробуйте онлайн!
Как это работает
источник
JavaScript (ES6), 38 байт
Возвращает логическое значение.
Контрольные примеры
Показать фрагмент кода
Как?
Мы используем для хранения предыдущего значения п . Мы устанавливаем x в 1, если a <n , -1 если a> n или 0, если a = n . И мы проверяем, является ли old_x * x <0 , что возможно, только если ( old_x = 1 и x = -1 ) или ( old_x = -1 и x = 1 ).
Поскольку x инициализируется функцией анонимного обратного вызова some () , он приводится к NaN во время первой итерации, что делает тест ложным.
источник
Haskell , 42 байта
Попробуйте онлайн!
объяснение
Сначала у нас есть функция,
f
которая принимает двоичную функцию и список и применяет двоичную функцию к каждой соседней паре в списке.Тогда наша основная функция применяется
f(-)
к списку ввода. Это вычисляет список различий. Затем мы применяемf(*)
к списку умножение каждой соседней пары. Наконец, мы спрашиваем, есть ли какая-либо пара меньше нуля.Число в конечном списке может быть отрицательным, только если оно является произведением отрицательного и положительного числа из списка разностей. Таким образом, чтобы создать отрицательную запись (и затем вернуть true), исходный список должен переключиться с увеличения на уменьшение или наоборот, то есть он должен иметь удар.
источник
Python 2 , 43 байта
Возвращает True, если есть удар, ошибки, если нет. ( разрешено по умолчанию )
Попробуйте онлайн!
источник
Октава с пакетом изображений,
3432 байта2 байта сохранены благодаря @StewieGriffin !
Попробуйте онлайн!
объяснение
Вычисляет последовательные различия, упорядочивает их в скользящих блоках длиной 2, получает произведение каждого блока и проверяет, является ли какой-либо такой продукт отрицательным.
источник
0||prod(...)
экономит 2 байта. Вы также можете пропустить всюany
часть и использовать стандартное определение «истина / ложь», чтобы сохранить 5 байтов .any
. Спасибо за0||
идею!R, 48 байтов
Попробуйте онлайн!
Как это работает пошагово, используя c (1,4,1,4) в качестве примера:
В качестве бонуса, вот решение аналогичной длины и концепции с использованием пакета
zoo
:источник
embed
существует. Это очень плохо,rowProds
иcolProds
не существует как псевдонимы в R.rowSums
иrowMeans
....colSums
изменит входные данные в матрицу, основанную на дополнительных входах, которые, вероятно, где-то есть в приложении для игры в гольф ... теперь мне просто нужно найти один!matrixStats
пакете.function(x)any(matrixStats::colProds(embed(diff(x),2)))<0
. Но для всего, кроме Code Golf, этот пакет действительно сокровищница.Haskell , 33 байта
Попробуйте онлайн!
True
если есть удар, ошибки, если нет.источник
l`zip3`tail l$drop 2l
это просто короче волосы. Интересно, сопоставление с образцом как-то еще короче?Perl 6 , 39 байт
Попробуйте онлайн!
$_
аргумент списка этой анонимной функции..[1..*]
тот же список, но с первым удаленным элементом.Zcmp
объединяет два списка вместе сcmp
оператором, в результате получается списокOrder
значений. Например, для списка ввода1, 2, 2, 2, 1
это привело бы к спискуMore, Same, Same, Less
.Теперь нам просто нужно знать, содержит ли этот список два смежных элемента
More, Less
илиLess, More
. Уловка, которую я использовал, заключается в том, чтобы преобразовать список в строку, разделенную пробелом~
, и затем проверить, содержит ли она подстрокуre L
илиs M
. (Первое не может быть простоe L
потому, чтоSame
также заканчивается буквой «е».)Оператор умного сопоставления возвращает либо
Match
объект (если совпадение выполнено), либоNil
(если это не так), поэтому онso
преобразует все, что есть, в логическое значение.источник
Wolfram Language (Mathematica) , 40 байт
Попробуйте онлайн!
источник
Рубин ,
5546 байтПопробуйте онлайн!
Лямбда, принимающая массив и возвращающая логическое значение.
-9 байт: заменить
(x<y&&y>z)||(x>y&&y<z)
на(y-x)*(y-z)>0
(благодаря GolfWolf )источник
|
вместо того||
, чтобы сэкономить 1 байт.PostgreSQL 173 байта
источник
Java 8,
10810410186847972 байта-2 байта благодаря @ OlivierGrégoire .
-13 байт благодаря @Nevay .
Попробуйте онлайн.
источник
-1
.a->{int i=a.length;for(;i-->2;)i|=(a[i]-a[--i])*(a[i]-a[i-1])>>-1;return-~i|3;}
(возвращается-1
для истинных случаев,3
для ложных случаев) - или, если в качестве возвращаемого значения используется наличие / отсутствие исключения, 55 байтов:a->{for(int i=0;++i>0;)i|=(a[i-1]-a[i])*(a[i]-a[i+1]);}
a->{int i=a.length,p=0;for(;i-->1;)i|=p*(p=a[i]-a[i-1])>>-1;return-i>1;}
R ,
5856 байтПопробуйте онлайн!
Сохранено 2 байта благодаря Джузеппе
источник
{}
за -2 байта.c()
ЭтоNULL
не то же самое, что пустой вектор целых чисел,integer(0)
тогда как в MATLAB[]
это значениеdouble
по умолчанию, но если вы хотите сохранить его таким образом, это вполне разумно.J ,
1615 байт-1 байт благодаря FrownyFrog
Попробуйте онлайн!
Оригинал: 16 байт
2-/\]
- отличия каждого соседнего предмета2*/\
- продукты каждого смежного товара[:<./
- минимум0>
- отрицательно?Попробуйте онлайн!
источник
f=.
байты присваивания . Пожалуйста, имейте ввиду, что я относительно новый пользователь :)1 e.0>2*/\2-/\]
Japt , 11 байт
-5 байт благодаря @ETHproductions
Попробуйте онлайн! | Контрольные примеры
Это использует алгоритм Денниса
источник
Japt , 9 байт
Попробуйте онлайн!
Сочетание ответа Оливера с подходом, использованным несколькими другими ответами.
источник
Атташе , 39 байт
Попробуйте онлайн!
Очень доволен тем, как это получилось.
объяснение
Это композиция из четырех функций:
Delta
получает различия между элементами. знак равноЗатем
Sign
применяется к каждому различию, давая нам массив1
s,0
s и-1
s. знак равноЗатем,
Slices&2
дает все куски длиной два из массива, давая все пары различий.Наконец,
Any&:&{_*~?Sum[__]}
эквивалентно, для вводаx
:Это ищет элементы, которые суммируют в ноль, но не равны нулю. Если какая-либо такая пара элементов существует, то есть удар.
источник
MATL , 8 байт
Попробуйте онлайн!
источник
Шелуха , 7 байт
Попробуйте онлайн!
объяснение
источник
Октава , 33 байта
Попробуйте онлайн!
Объяснение:
источник
Брахилог , 10 байт
Попробуйте онлайн!
Успех (
true.
), если есть удар, и терпит неудачу (false.
), если нет удара.объяснение
Это уже достаточно читабельно:
источник
05AB1E , 7 байтов
Попробуйте онлайн!
объяснение
источник
0‹
которая в основном проверяет число на наличие отрицательного знака?d
используется для проверки наличия только верхней части стека[0-9]
, что противоположно тому, что мы хотим здесь. Но теперь он стал более интеллектуальным, и отрицательные числа / числа с плавающей точкой также считаются числами.a
былоnegative
знак и вернул истину или что-то в этом роде ... Но я думаю, ты прав, я помню твойd
трюк.Брахилог , 10 байт
Попробуйте онлайн!
Не такой аккуратный и элегантный, как 10-байтовый ответ @ Fatalize, но он работает!
источник
Шелуха , 9 байт
Попробуйте онлайн!
Использует алгоритм Денниса.
источник
Perl 5 , 54 + 2 (
-pa
) = 56 байтПопробуйте онлайн!
источник
Python 2 , 60 байт
Попробуйте онлайн!
Почти то же самое, думал, что будет короче, хотя ...
Python 2 , 63 байта
Попробуйте онлайн!
источник
Пыть ,
117 байтВыходы 1, если есть удар, 0 в противном случае
Попробуйте онлайн!
Ответ Хаскелла волшебника порта пшеницы
Старый способ (11 байт):
Попробуйте онлайн!
Возвращает False, если есть удар, True в противном случае
Порт Денис Желе ответ
источник
Wolfram Language (Mathematica) ,
3736 байтДает противоположные ответы тестового примера (False и True поменялись местами). Добавить
!
чтобы перейти к нормальной форме.ИЛИ
Также обратный вывод, поэтому заменить
FreeQ
наMatchQ
для нормальной формы.Пояснение: Возьмите знак различий в последовательности. Если результирующая последовательность включает в себя {1, -1} или {-1,1}, есть выпуклость. Абсолютное значение разности {1, -1} или {-1,1} равно 2 в любом случае.
Сбрейте еще один байт, возведя в квадрат окончательный список вместо того, чтобы принимать абсолютное значение:
Попробуйте онлайн!
источник
Perl, 35 байт
Включает
+3
в себя для-p
bump.pl
:Беги как:
источник
Юлия 0,6 ,
5756 байтВ основном просто полный ответ человека на python. -1 байт от пользователя71546
Попробуйте онлайн!
Юлия 0,6 , 39 байт
Стиль рекурсии Лиспы, ответ Питона Денниса. Возвращает,
true
когда существует удар, иначе выдает ошибку. Это может быть 42 байта, так как вы должны разделить его при вызове. Например, дляa=[1,2,1]
вас называют какf(a...)
.f(a)=f(a...)
удалил бы эту потребность, но это дольше. Мне нужно улучшить рекурсию, и мне не очень нравится писать код, который выдает ошибку.Попробуйте онлайн!
источник
for
не нужно;)