Dada una lista de enteros positivos, determine si hay un elemento que sea mayor que sus dos vecinos o menor que sus dos vecinos (una "protuberancia"). Para ser claros, una protuberancia nunca puede ser el primer o el último elemento de la lista porque solo tienen un vecino.
Su programa debería generar uno de dos valores consistentes, cada uno correspondiente a una lista sin protuberancias o una lista con protuberancias. Los valores no son importantes, puede elegirlos usted mismo.
Este es el código de golf, por lo que las respuestas se puntuarán en bytes, con menos bytes mejor.
Casos de prueba
[] -> 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
Asistente de trigo
fuente
fuente
[1,3,3]
(asegura que las respuestas que usan el algoritmo de Dennis tomen el signo de los incrementos en lugar de solo usar los incrementos mismos)[1,2,2]
? ¿O me estoy perdiendo algo?[1,2,2]
son los mismos que los signos de esos deltas, pero ese no es el caso[1,3,3]
.Respuestas:
Jalea , 5 bytes
Devuelve 0 si hay una protuberancia, 1 si no.
Pruébalo en línea!
Cómo funciona
fuente
JavaScript (ES6), 38 bytes
Devuelve un booleano.
Casos de prueba
Mostrar fragmento de código
¿Cómo?
Usamos a para almacenar el valor anterior de n . Hemos establecido x a 1 si un <n , -1 si a> n o 0 si a = n . Y probamos si old_x * x <0 , que solo es posible si ( old_x = 1 y x = -1 ) o ( old_x = -1 y x = 1 ).
Debido a que x se inicializa a la función de devolución de llamada anónima de some () , se coacciona a NaN durante la primera iteración, lo que hace que la prueba sea falsa.
fuente
Haskell , 42 bytes
Pruébalo en línea!
Explicación
Primero tenemos la función
f
que toma una función binaria y una lista y aplica la función binaria a cada par adyacente en la lista.Entonces nuestra función principal se aplica
f(-)
a la lista de entrada. Esto calcula la lista de diferencias. Luego aplicamosf(*)
a la lista para multiplicar cada par adyacente. Por último, preguntamos si algún par es menor que cero.Un número en la lista final solo puede ser negativo si es el producto de un número negativo y positivo de la lista de diferencias. Por lo tanto, para producir una entrada negativa (y luego devolver verdadero) la lista original debe cambiar de creciente a decreciente o viceversa, es decir, debe tener una protuberancia.
fuente
Python 2 , 43 bytes
Devuelve True si hay una protuberancia, errores si no la hay. ( permitido por defecto )
Pruébalo en línea!
fuente
Octava con paquete de imágenes,
3432 bytes¡2 bytes guardados gracias a @StewieGriffin !
Pruébalo en línea!
Explicación
Calcula diferencias consecutivas, las organiza en bloques deslizantes de longitud 2, obtiene el producto de cada bloque y prueba si alguno de estos productos es negativo.
fuente
0||prod(...)
ahorra 2 bytes. También puede omitir toda laany
parte y utilizar la definición de verdad / falsedad predeterminada para guardar 5 bytes .any
. Gracias por la0||
idea!R, 48 bytes
Pruébalo en línea!
Cómo funciona paso a paso usando c (1,4,1,4) como ejemplo:
Como beneficio adicional, aquí hay una solución de longitud y concepto similar usando el paquete
zoo
:fuente
embed
existe. Es una lástima querowProds
ycolProds
no existe como alias en R.rowSums
yrowMeans
....colSums
rediseñará la entrada en una matriz basada en entradas adicionales que probablemente tenga una aplicación de golf en algún lugar ... ¡ahora solo tengo que encontrar una!matrixStats
paquete.function(x)any(matrixStats::colProds(embed(diff(x),2)))<0
. Pero para cualquier cosa que no sea golf de código, este paquete es de hecho un tesoro.Haskell , 33 bytes
Pruébalo en línea!
True
si hay una protuberancia, errores si no la hay.fuente
l`zip3`tail l$drop 2l
Es solo un pelo más corto. Me pregunto si la coincidencia de patrones es de alguna manera aún más corta.Perl 6 , 39 bytes
Pruébalo en línea!
$_
es el argumento de la lista para esta función anónima..[1..*]
es la misma lista, pero con el primer elemento descartado.Zcmp
comprime las dos listas junto con elcmp
operador, lo que da como resultado una lista deOrder
valores. Por ejemplo, para una lista de entrada,1, 2, 2, 2, 1
esto daría como resultado la listaMore, Same, Same, Less
.Ahora solo necesitamos saber si esa lista contiene dos elementos adyacentes
More, Less
oLess, More
. El truco que utilicé es convertir la lista a una cadena delimitada por espacios~
, luego probar si contiene subcadenare L
os M
. (El primero no puede ser soloe L
porqueSame
también termina con una "e").El operador de coincidencia inteligente devuelve un
Match
objeto (si la coincidencia tuvo éxito) oNil
(si no lo hizo), porso
lo que convierte lo que sea en un valor booleano.fuente
Wolfram Language (Mathematica) , 40 bytes
Pruébalo en línea!
fuente
Ruby ,
5546 bytesPruébalo en línea!
Una lambda que acepta una matriz y devuelve un valor booleano.
-9 bytes: reemplazar
(x<y&&y>z)||(x>y&&y<z)
con(y-x)*(y-z)>0
(gracias a GolfWolf )fuente
|
en lugar de||
, ahorrándole 1 byte.PostgreSQL 173 bytes
fuente
Java 8,
10810410186847972 bytes-2 bytes gracias a @ OlivierGrégoire .
-13 bytes gracias a @Nevay .
Pruébalo en línea.
fuente
-1
.a->{int i=a.length;for(;i-->2;)i|=(a[i]-a[--i])*(a[i]-a[i-1])>>-1;return-~i|3;}
(devuelve-1
para casos verdaderos,3
para casos de falsey) - o, si se usa la presencia / ausencia de una excepción como valor de retorno 55 bytes: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 bytesPruébalo en línea!
Guardado 2 bytes gracias a Giuseppe
fuente
{}
por -2 bytes.c()
es loNULL
que no es lo mismo que el vector vacío de enteros,integer(0)
mientras que en MATLAB[]
es undouble
valor predeterminado, pero si desea mantenerlo de esta manera, eso es perfectamente razonable.J ,
1615 bytes-1 byte gracias a FrownyFrog
Pruébalo en línea!
Original: 16 bytes
2-/\]
- diferencias de cada elemento adyacente2*/\
- productos de cada artículo adyacente[:<./
- el mínimo0>
- es negativo?Pruébalo en línea!
fuente
f=.
bytes de asignación . Tenga en cuenta que soy un usuario relativamente nuevo :)1 e.0>2*/\2-/\]
Japt , 11 bytes
-5 bytes gracias a @ETHproductions
Pruébalo en línea! El | Casos de prueba
Esto usa el algoritmo de Dennis
fuente
Japt , 9 bytes
Pruébalo en línea!
Un mashup de la respuesta de Oliver con el enfoque utilizado por varias otras respuestas.
fuente
Adjunto , 39 bytes
Pruébalo en línea!
Muy contento con cómo resultó esto.
Explicación
Esta es una composición de cuatro funciones:
Delta
Obtiene las diferencias entre los elementos. =Luego,
Sign
se aplica a cada diferencia, dándonos una matriz de1
s,0
sy-1
s. =Luego,
Slices&2
da todos los cortes de longitud dos de la matriz, dando todos los pares de diferencias.Finalmente,
Any&:&{_*~?Sum[__]}
es equivalente a, para entradax
:Esto busca elementos que suman cero pero no son cero. Si existe un par de elementos de este tipo, entonces hay una protuberancia.
fuente
MATL , 8 bytes
Pruébalo en línea!
fuente
Casco , 7 bytes
Pruébalo en línea!
Explicación
fuente
Octava , 33 bytes
Pruébalo en línea!
Explicación:
fuente
Brachylog , 10 bytes
Pruébalo en línea!
Tiene éxito (
true.
) si hay una protuberancia, y falla (false.
) si no hay una protuberancia.Explicación
Esto ya es bastante legible:
fuente
05AB1E , 7 bytes
Pruébalo en línea!
Explicación
fuente
0‹
que básicamente verifique el número para un signo negativo?d
usa para verificar que la parte superior de la pila solo contenga[0-9]
, que es lo opuesto a lo que queremos aquí. Pero ahora es más inteligente y los negativos / flotantes también se cuentan como números.a
ver elnegative
letrero y volver verdadero o algo así ... Pero creo que tienes razón, recuerdo tud
truco.Brachylog , 10 bytes
Pruébalo en línea!
No es tan ordenado y elegante como la respuesta de 10 bytes existente de @ Fatalize, ¡pero funciona!
fuente
Casco , 9 bytes
Pruébalo en línea!
Utiliza el algoritmo de Dennis.
fuente
Perl 5 , 54 + 2 (
-pa
) = 56 bytesPruébalo en línea!
fuente
Python 2 , 60 bytes
Pruébalo en línea!
Más o menos lo mismo, aunque pensé que sería más corto ...
Python 2 , 63 bytes
Pruébalo en línea!
fuente
Pyt ,
117 bytesSalidas 1 si hay una protuberancia, 0 de lo contrario
Pruébalo en línea!
Respuesta de Haskell del mago del puerto de trigo
Antigua forma (11 bytes):
Pruébalo en línea!
Devuelve False si hay una protuberancia, True de lo contrario
Port of Dennis 'Jelly respuesta
fuente
Wolfram Language (Mathematica) ,
3736 bytesDa lo contrario de las respuestas de los casos de prueba (Falso y Verdadero invertido). Anteponer un
!
para cambiar a la forma normal.O
También se invierte la salida, así que reemplace
FreeQ
conMatchQ
la forma normal.Explicación: Tome el signo de las diferencias de la secuencia. Si la secuencia resultante incluye {1, -1} o {-1,1} hay una protuberancia. El valor absoluto de las diferencias de {1, -1} o {-1,1} es 2 en cualquier caso.
Elimine otro byte al cuadrar la lista final en lugar de tomar el valor absoluto:
Pruébalo en línea!
fuente
Perl, 35 bytes
Incluye
+3
para-p
bump.pl
:Correr como:
fuente
Julia 0.6 ,
5756 bytesBásicamente, la respuesta de Python totalmente humana. -1 byte del usuario 71546
Pruébalo en línea!
Julia 0.6 , 39 bytes
Estilo de recursión de Lispy, también conocido como la respuesta en pitón de Dennis. Devuelve
true
cuando existe una protuberancia, de lo contrario arroja un error. Tal vez debería ser de 42 bytes, ya que debe salpicarlo al llamar. Por ejemplo, paraa=[1,2,1]
llamar comof(a...)
.f(a)=f(a...)
eliminaría esa necesidad, pero es más larga. Necesito mejorar una recursión, y realmente no me gusta escribir código que arroje un error.Pruébalo en línea!
fuente
for
no es necesario;)