Uma lista de números inteiros positivos pode ser visualizada como uma cadeia de montanhas quantizada em que cada entrada da lista representa a altura de uma seção vertical das montanhas.
Por exemplo, a lista
1, 2, 2, 3, 4, 3, 5, 3, 2, 1, 2, 3, 3, 3, 2, 2, 1, 3
pode se tornar o intervalo
x
x x
xxxxx xxx x
xxxxxxxx xxxxxx x
xxxxxxxxxxxxxxxxxx
(Pessoas menos poéticas podem chamar isso de gráfico de barras, mas eu discordo.)
A questão deste desafio é: Quantos picos existem na cordilheira de alguma lista arbitrária? Essencialmente, quantos máximos locais existem na lista?
Um pico é definido como uma seção contígua de uma ou mais colunas da cordilheira, todas iguais em altura, onde as colunas imediatamente à esquerda e à direita têm menor altura.
É fácil dizer visualmente que o exemplo tem quatro picos nesses locais entre parênteses:
1, 2, 2, 3, (4), 3, (5), 3, 2, 1, 2, (3, 3, 3), 2, 2, 1, (3)
Observe como a (3, 3, 3)
seção do platô conta como um pico, porque é um conjunto contíguo de colunas com altura igual e superior às colunas vizinhas.
O último (3)
conta também como pico, porque, para os propósitos deste desafio, definiremos o vizinho esquerdo da coluna mais à esquerda e o vizinho direito da coluna mais à direita como altura zero.
Isto significa que uma lista com apenas um valor, por exemplo 1, 1, 1
, pode ser interpretado como 0, 1, 1, 1, 0
, e, portanto, tem um pico, não nenhum: 0, (1, 1, 1), 0
.
A única lista com picos zero é a lista vazia.
Desafio
Escreva uma função ou programa que obtenha uma lista arbitrária de números inteiros positivos e imprima ou retorne o número de picos na cordilheira correspondente.
O código mais curto em bytes vence. O desempatador é uma publicação anterior.
Casos de teste
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
fonte
Respostas:
Pitão, 18 bytes
Baseado em @ PeterTaylor repetiu maior que a solução, mas com uma torção.
++ZQZ
: Adicione zeros nos dois lados.eMr ... 8
: Remova as repetições.u ... 2 ...
: Aplique o seguinte duas vezes:>VGTG
: Mapeie cada par de números para saber se eles estão em ordem decrescente._
: E reverter.Um 1 na saída corresponde a um
1, 0
na etapa anterior, que corresponde àa < b > c
entrada devido à reversão.s
: Soma (e impressão)fonte
CJam (
32 26 2421 bytes)A entrada esperada é de números separados por espaço.
Demonstração online ; conjunto de testes completo (a saída esperada é um
1
caso de teste).Agradeço a Martin por me informar que a versão atual do CJam aprimora um dos operadores utilizados, economizando 2 caracteres; e para uma economia adicional de 3 caracteres.
Dissecação
Duas fases: desduplicar e, em seguida, identificar o máximo local em cada conjunto de três.
fonte
JavaScript (ES6),
5451 bytesExplicação
Toma uma matriz de números
Teste
Mostrar snippet de código
fonte
Pitão,
2523 bytesExplicação:
fonte
0q~0]{2ew::-:g0-}2*1-,
para 22.Julia, 66
Pad, diferenciar:
y=diff([0;x;0])
.Ignorar os planaltos:
y=y[y.!=0]
.Contagem
+
de-
cruzamentos de zero:sum((y[1:end-1].>0)&(y[2:end].<0))
.fonte
MATLAB,
2927 bytesFunção anônima que encontra os picos nos dados e conta quantos existem. 0 é anexado e anexado aos dados para garantir que os picos nas extremidades sejam detectados conforme a pergunta.
Isso também funcionará com o Octave . Você pode tentar online aqui . Simplesmente cole o código acima na linha de comando e execute-o com
ans([1,2,1,3,4,5,6,1])
(ou qualquer outra entrada).Como os números são sempre + ve, podemos assumir que eles são maiores que zero e, portanto, podemos economizar 2 bytes usando em
nnz
vez denumel
.fonte
Python 3, 75 bytes
Este é o meu primeiro codegolf, então pode haver alguns lugares para reduzi-lo, especialmente a
d=((n==p)&d)+(n>p)
parte. No entanto, funciona em todos os casos de testefonte
Mathematica,
42363332 bytesAgradecemos a Martin Büttner por economizar 1 byte.
PeakDetect
apenas faz quase tudo!Casos de teste:
fonte
CJam,
2726 bytesUsa a codificação do comprimento da execução para remover duplicatas. Depois disso, verificamos cada trigêmeo se o meio é o maior número.
Experimente aqui! Passa na suíte de testes de Peter Taylor .
fonte
MATL , 22 bytes
Usa a versão atual do idioma / compilador.
Exemplo
Explicação
fonte
Mathematica,
55393635 bytesAgora funciona em todos os casos de teste!
fonte
Last/@
->#&@@@
Retina ,
3331 bytesAgradecimentos a Neil por salvar 2 bytes.
Experimente online!
Recebe a entrada como uma lista unária e separada por vírgula .
fonte
\b(1+)(?<!\1 \1)( \1)*\b(?! \1)
parece salvar 2 bytes?JavaScript ES6,
9694 bytesPrincípio: colapsar planaltos em picos únicos, encontre os picos que são definidos como sendo mais altos que os elementos seguintes e anteriores.
Recebe entrada como uma matriz.
Demo:
fonte
ES6,
5048 bytesEconomizou 2 bytes graças a @ user81655.
Ungolfed:
fonte
.map()|
antes.)MATL, 23
Como precisamos usar esolangs baseados em pilha para sermos competitivos, reimplementei minha solução Julia em MATL.
Empurre
0
, insira0
, concatene duas vezes.0i0hh
=>x = [0, input(''), 0]
Distinguir.
d
=>x = diff(x)
Duplique
t
, converta um em booleano e use-o para indexar o outro.tg)
=>x=x(x!=0)
Duplicar novamente.
t
Primeiro:
[1,G])0>
=>y1 = x(1:end-1)>0
Troca.
w
Segundo:
[2,0])0<
=>y2 = x(2:end)<0
Lógica e, conte os valores verdadeiros.
*s
=>sum(y1 & y2)
fonte
[1,G]
->5L
salva 3 bytes.[2,0]
->6L
salva 3 bytesand
(&
) do MATL (e o mesmo paraor
). Ele sempre pode ser substituído por*o
, e geralmente por apenas*
, como neste caso. O que você acha? Dessa forma, os personagens&
e|
podem ser usados para outras funções no futuro.Japonês, 19 bytes
Isso foi mais fácil do que eu pensava, mas o começo é um pouco inútil devido a um bug.
Experimente online!
Como funciona
Versão não concorrente, 15 bytes
Hoje, eu adicionei a
è
função, que é como,f
mas retorna o número de correspondências em vez das correspondências em si. Também consertei um bug emArray.u
que retornaria o comprimento da matriz em vez da própria matriz.Experimente online!
fonte
05AB1E , 9 bytes
Experimente online!
Explicação:
fonte
Gelatina , 27 bytes
Experimente online!
fonte
GolfScript, 35
Teste on-line
Basicamente, remove duplicatas, adiciona 0 a ambas as extremidades e verifica quantos triplos têm um máximo no centro.
fonte
Java 8, 141 bytes
Provavelmente, você pode jogar golfe usando uma abordagem diferente ou uma matriz como entrada, em vez de Lista.
Explicação:
Experimente aqui.
fonte