Se puede visualizar una lista de enteros positivos como una cadena montañosa cuantificada donde cada entrada de la lista representa la altura de una sección vertical de las montañas.
Por ejemplo, la lista
1, 2, 2, 3, 4, 3, 5, 3, 2, 1, 2, 3, 3, 3, 2, 2, 1, 3
puede convertirse en el rango
x
x x
xxxxx xxx x
xxxxxxxx xxxxxx x
xxxxxxxxxxxxxxxxxx
(La gente menos poética podría llamar a esto un gráfico de barras, pero estoy divagando).
La pregunta en este desafío es: ¿Cuántos picos hay en la cordillera de alguna lista arbitraria? Básicamente, ¿cuántos máximos locales hay en la lista?
Un pico se define como una sección contigua de una o más columnas de la cordillera que son todas iguales en altura, donde las columnas inmediatamente a la izquierda y a la derecha son más bajas en altura.
Es fácil decir visualmente que el ejemplo tiene cuatro picos en estas ubicaciones entre paréntesis:
1, 2, 2, 3, (4), 3, (5), 3, 2, 1, 2, (3, 3, 3), 2, 2, 1, (3)
Observe cómo la (3, 3, 3)
sección de meseta cuenta como un pico porque es un conjunto contiguo de columnas de igual altura, más altas que sus columnas vecinas.
El último también (3)
cuenta como un pico porque, para los propósitos de este desafío, definiremos el vecino izquierdo de la columna más a la izquierda y el vecino derecho de la columna más a la derecha para que ambos tengan altura cero.
Esto significa que una lista con sólo un valor, por ejemplo 1, 1, 1
, se puede interpretar como 0, 1, 1, 1, 0
, y por lo tanto tiene un pico, no ninguno: 0, (1, 1, 1), 0
.
La única lista con picos cero es la lista vacía.
Reto
Escriba una función o programa que tome una lista arbitraria de enteros positivos e imprima o devuelva el número de picos en la cadena montañosa correspondiente.
El código más corto en bytes gana. Tiebreaker es una publicación anterior.
Casos de prueba
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
fuente
Respuestas:
Pyth, 18 bytes
Basado en la solución repetida mayor que @ PeterTaylor, pero con un giro.
++ZQZ
: Agregue ceros en ambos lados.eMr ... 8
: Eliminar repeticiones.u ... 2 ...
: Aplique lo siguiente dos veces:>VGTG
: Asigna cada par de números a si están en orden decreciente._
: Y al revés.Un 1 en la salida corresponde a un
1, 0
paso anterior, que corresponde aa < b > c
la entrada debido a la inversión.s
: Suma (e impresión)fuente
CJam (
32 26 2421 bytes)La entrada esperada son números separados por espacios.
Demostración en línea ; conjunto de pruebas completo (la salida esperada es
1
por caso de prueba).Gracias a Martin por informarme que la versión actual de CJam mejora uno de los operadores utilizados, ahorrando 2 caracteres; y para un ahorro adicional de 3 caracteres.
Disección
Dos fases: deduplicar, luego identificar máximos locales en cada conjunto de tres.
fuente
JavaScript (ES6),
5451 bytesExplicación
Toma una serie de números
Prueba
Mostrar fragmento de código
fuente
Pyth,
2523 bytesExplicación:
fuente
0q~0]{2ew::-:g0-}2*1-,
por 22.Julia, 66
Pad, diferenciar:
y=diff([0;x;0])
.No haga caso de las mesetas:
y=y[y.!=0]
.Contar
+
a-
los cruces por cero:sum((y[1:end-1].>0)&(y[2:end].<0))
.fuente
MATLAB,
2927 bytesFunción anónima que encuentra los picos en los datos y cuenta cuántos hay. 0 se antepone y se agrega a los datos para garantizar que los picos en los bordes se detecten según la pregunta.
Esto también funcionará con Octave . Puedes probar en línea aquí . Simplemente pegue el código anterior en la línea de comando y luego ejecútelo con
ans([1,2,1,3,4,5,6,1])
(o cualquier otra entrada).A medida que los números son siempre + ve, podemos suponer que son mayores que cero, por lo que puede ahorrar mediante el uso de 2 bytes
nnz
en lugar denumel
.fuente
Python 3, 75 bytes
Este es mi primer codegolf, por lo que puede haber algunos lugares para reducirlo, especialmente la
d=((n==p)&d)+(n>p)
parte. Sin embargo, funciona en todos los casos de prueba.fuente
Mathematica,
42363332 bytesGracias a Martin Büttner por guardar 1 byte.
PeakDetect
simplemente hace casi todo!Casos de prueba:
fuente
CJam,
2726 bytesUtiliza la codificación de longitud de ejecución para eliminar duplicados. Después de eso verificamos para cada triplete si el del medio es el número más grande.
Pruébalo aquí! Pasa la suite de prueba de Peter Taylor .
fuente
MATL , 22 bytes
Utiliza la versión actual del idioma / compilador.
Ejemplo
Explicación
fuente
Mathematica,
55393635 bytes¡Ahora funciona en todos los casos de prueba!
fuente
Last/@
->#&@@@
Retina ,
3331 bytesGracias a Neil por guardar 2 bytes.
Pruébalo en línea!
Toma datos como una lista unaria separada por comas .
fuente
\b(1+)(?<!\1 \1)( \1)*\b(?! \1)
parece ahorrar 2 bytes?JavaScript ES6,
9694 bytesPrincipio: colapsar mesetas en picos individuales, encontrar las selecciones que se definen como más altas que los elementos siguientes y anteriores.
Toma la entrada como una matriz.
Manifestación:
fuente
ES6,
5048 bytesGuardado 2 bytes gracias a @ user81655.
Sin golf:
fuente
.map()|
antes)MATL, 23
Como necesitamos usar esolangs basados en pila para ser competitivos, reimplementé mi solución Julia en MATL.
Empuje
0
, ingrese0
, concatene dos veces.0i0hh
=>x = [0, input(''), 0]
Diferenciar.
d
=>x = diff(x)
Duplicar
t
, convertir uno a booleano y usarlo para indexar el otro.tg)
=>x=x(x!=0)
Duplicar de nuevo.
t
Primero:
[1,G])0>
=>y1 = x(1:end-1)>0
Intercambiar.
w
Segundo:
[2,0])0<
=>y2 = x(2:end)<0
Lógica y, cuenta los valores de verdad.
*s
=>sum(y1 & y2)
fuente
[1,G]
->5L
ahorra 3 bytes.[2,0]
->6L
ahorra 3 bytesand
(&
) de MATL (y lo mismo paraor
). Siempre se puede reemplazar por*o
, y a menudo solo*
, como en este caso. ¿Qué piensas? De esa forma los personajes&
y|
podrían ser utilizados para otras funciones en el futuro.Japt, 19 bytes
Eso fue más fácil de lo que pensaba, pero el comienzo es un poco inútil debido a un error.
Pruébalo en línea!
Cómo funciona
Versión no competitiva, 15 bytes
Hoy temprano, agregué la
è
función, que es comof
pero devuelve el número de coincidencias en lugar de las coincidencias en sí. También arreglé un error en elArray.u
que devolvería la longitud de la matriz en lugar de la matriz en sí.Pruébalo en línea!
fuente
05AB1E , 9 bytes
Pruébalo en línea!
Explicación:
fuente
Jalea , 27 bytes
Pruébalo en línea!
fuente
GolfScript, 35
Prueba en línea
Básicamente elimina duplicados, agrega un 0 a ambos extremos y comprueba cuántos triples tienen un máximo en el centro.
fuente
Java 8, 141 bytes
Probablemente se pueda jugar golf usando un enfoque diferente, o una matriz como entrada en lugar de List.
Explicación:
Pruébalo aquí
fuente