Escriba una función o programa que tome una lista y produzca una lista de los extremos locales.
En una lista, [x_0, x_1, x_2...]
un extremo local es x_i
tal que x_(i-1) < x_i
y x_(i+1) < x_i
o x_(i-1) > x_i
y x_(i+1) > x_i
. Tenga en cuenta que el primer y el último elemento de la lista nunca pueden ser extremos locales.
Entonces, para algunos ejemplos
local_extremes([1, 2, 1]) = [2]
local_extremes([0, 1, 0, 1, 0]) = [1, 0, 1]
local_extremems([]) = []
Este es el código de golf, por lo que gana el código más corto.
1 2 2 1
¿No deberían2
considerarse también los extremos? - Lo sé, esto haría la solución mucho más difícil ...Respuestas:
Mathematica
66 5851Solución actual
Acortado gracias a una contribución de Calle.
Partition[#,3,1]
encuentra los triples(a-b) (b-c)<0
es verdadero si y sólo sib
está por debajoa
,c
o por encimaa
,c
. y mira toma los signos de las diferencias. Un extremo local volverá{-1,1}
o{1,-1}
.Ejemplos
Solución anterior
Esto busca ejemplos de todos los triples (generados por
Partition
) y determina si el elemento del medio es menor que ambos extremos o mayor que los extremos.Primera solución
Esto encuentra los triples, y observa los signos de las diferencias. Un extremo local volverá
{-1,1}
o{1,-1}
.Ejemplo
Análisis :
%
se refiere al resultado de la respectiva línea anterior.Sort@Sign@Differences@x=={-1,1}
identifica los triples de {{9, 10, 7}, {10, 7, 6}, {7, 6, 9}, {6, 9, 0}, {9, 0, 3}, {0, 3, 3}, {3, 3, 1}, {3, 1, 10}} de modo que el signo (-, 0, +) de las diferencias consiste en ay-1
a1
. En el presente caso esos son:Para cada uno de estos casos, x, se
x[[2]]
refiere al segundo término. Esos serán todos los máximos y mínimos locales.fuente
J - 19 char
No pude evitarlo;)
La explicación sigue:
2-/\]
- Sobre cada par de elementos en el argumento (cada infijo largo de 2 elementos), tome la diferencia.2*/\
- Ahora sobre cada par de la nueva lista, tome el producto.0>
- Pruebe si cada resultado es menor que 0. Esto solo sucede si los multiplicandos tenían signos alternos, es decir, no sucede si tenían el mismo signo o si era cero.0,
- Declarar que el primer elemento no es un elemento extremo.}:
- Corta el último elemento, porque eso tampoco puede ser un extremo.#~
- Utilice los valores verdaderos en el lado derecho para elegir elementos de la lista en el lado izquierdo.Uso:
fuente
Javascript -
6245 caracteresEditar
fuente
Ruby,
8370605549 caracteresImprime todos los extremos locales en STDOUT.
Utiliza el<=>
operador de "nave espacial", que realmente me gusta. (Devuelve 1 si lo primero es mayor que lo segundo, -1 si es menor y 0 si es igual. Por lo tanto, si suman a -2 o 2, eso significa que el medio es un extremo).¡Ya no más, como @daniero señaló que la forma "obvia" es en realidad más corta!Cambiado una vez más! Ahora usa el asombroso algoritmo que se encuentra en la respuesta de MT0 (¡+1 para él!).
Además, me gusta
each_cons
que selecciona cadan
grupo de elementos consecutivos en una matriz. Y seguir tambiénif
es interesante.En general, me gusta lo elegante que se ve.
Algunas ejecuciones de muestra:
fuente
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
(incluso si el operador de la nave espacial es muy bonito);)!((x..z)===y)
es aún más corto, aunque no tan inteligentex < z
.C ++ - 208 caracteres
La solución más larga nuevamente:
Para usar, ingrese sus enteros, luego cualquier carácter que bloqueará la secuencia de entrada; cualquier carácter que no sea un número debería funcionar.
Entrada:
0 1 0 x
Salida:
1
fuente
deque
lugar de avector
para obtener 2 caracteres.i
yj
, puede declararint i;
justo después de la colección y usar los dos bucles en lugar de declarar dos variables.i++
en tu ciclo for y comenzar tu condiciónif(v[++i]>[i-1]...
para volver a obtener un personaje.Matlab - 45 bytes
fuente
Python 2.7 - 73 bytes
No es demasiado impresionante (Mire cada elemento de la lista, excepto el primero y el último, vea si es más grande o más pequeño que sus vecinos).
Principalmente solo lo publico porque no todos saben que puedes hacerx<y>z
y que funcione. Creo que es un poco ordenado.Sí,
x<y>z
es una característica genial de Python, pero en realidad no es óptima en este caso. Gracias a VX por el truco de la multiplicación, eso no se me ocurrió en absoluto. Wrzlprmft me recordó que declarar una función anónima es menos pulsaciones de teclas quedef x(y):
.fuente
if(l[i]-l[i-1])*(l[i]-l[i+1])>0
reduciría el código en 11 caracteres ...def e(l):\n
tiene la misma cantidad de caracteres quee=lambda l:
, pero olvidé que no es necesario usar lareturn
palabra clave. ¡Gracias!(l[i]-l[i-1])*(l[i]-l[i+1])
es1
sil[i]
es un extremo local y de lo0
contrario, no necesito usar>0
. Solo puedo dejar que Python lo interprete como un bool. :)\n
la declaración en absoluto! Eso habría salvado a dos personajes, pero la inclusión dereturn
todavía hace que no valga la pena.Haskell 50
fuente
x>p&&x>n
tiene un carácter menos quex>max p n
:-),
tampoco es necesario.x>p&&x>n
a(x>p)==(x>n)
mínimos locales también, agrega 4 caracteres más.Jalea , 8 bytes
Pruébalo en línea!
Explicación
Un elemento es solo un extremo local si su diferencia con su vecino izquierdo tiene un signo opuesto a su diferencia con su vecino derecho, es decir, los signos de las diferencias difieren en 2 o -2. Jelly tiene una serie de primitivas útiles para tratar "buscar elementos con ciertas propiedades" (en particular, podemos encontrar elementos con ciertas propiedades en una lista y usarlos para extraer elementos de una lista diferente), lo que significa que podemos traducir de nuevo a la lista original más o menos directamente (solo necesitamos compensar por 1 porque el primer y el último elemento de la lista original se perdieron en la toma de diferencias).
fuente
Python con Numpy -
81 7467 bytes (6154 sin laimport
línea)La entrada debe ser una matriz Numpy.
fuente
C, 83
fuente
awk - 32 caracteres
No tengo esperanzas de superar un lenguaje como J o APL por brevedad, pero pensé en tirar mi sombrero al ring de todos modos. Explicación:
a
,b
, yc
esperax_i
,x_(i-1)
yx_(i-2)
b-c
ya-b
aproximar la derivada antes y despuésx_(i-1)
x_(i-1)
es un extremo local, así que imprimafuente
Brachylog , 17 bytes
Pruébalo en línea!
Toma la entrada a través de la variable de entrada y genera la salida a través de la variable de salida.
Si se pudiera garantizar la ausencia de ejecuciones de valores,
s₃{{⌉|⌋}.&bh}
se ahorrarían cuatro bytes.fuente
Perl 5
-p
, 49 bytesPruébalo en línea!
fuente
Wolfram Language (Mathematica) ,
4342 bytesPruébalo en línea!
Supongo que
Nothing
es demasiado largo ...fuente
05AB1E ,
1110 bytesPruébelo en línea o verifique algunos casos de prueba más .
Explicación:
fuente
PHP,
116 114113Ejemplo de uso:
fuente
Haskell, 70C
Versión de golf
Versión sin golf
fuente
Javascript: 102 caracteres
fuente
APL, 19 bytes
Convertí la versión de 20 char J a APL. Pero agrego un cero al principio y al final en lugar de eliminar el primer y último dígito. De lo contrario, funciona igual que la versión J.
⍵
- parámetro formal omega. Esta es la entrada a la función.fuente
{x@1+&0>2_*':-':0 0,x}
. 6 de estos caracteres (2_
y0 0,
) se gastan protegiendo contra un error de longitud si el argumento es más corto que dos elementos, por lo que si no fuera por ese problema serían 16 ... La acción también es un poco diferente: tenemos que cambiar el lista booleana en una lista de índices con1+&
y úsela para indexarx
nuevamente, pero es más corta y también es algo muy K-ish.Python 2 , 59 bytes
Pruébalo en línea!
Esta función evita principalmente el costoso negocio de la indexación, tomando los elementos de la lista como argumentos, en lugar de la lista misma. Si bien queda más de un elemento en la lista, acumulamos recursivamente la lista, verificando un máximo en cada paso.
fuente