Escreva uma função ou programa que inclua uma lista e produza uma lista dos extremos locais.
Em uma lista, [x_0, x_1, x_2...]
um extremo local é x_i
tal que x_(i-1) < x_i
e x_(i+1) < x_i
ou x_(i-1) > x_i
e x_(i+1) > x_i
. Observe que o primeiro e o último elementos da lista nunca podem ser extremos locais.
Então, para alguns exemplos
local_extremes([1, 2, 1]) = [2]
local_extremes([0, 1, 0, 1, 0]) = [1, 0, 1]
local_extremems([]) = []
Este é um código de golfe, então o código mais curto vence!
1 2 2 1
também não deveriam2
ser considerados extremos? - Eu sei, isso tornaria a solução muito mais difícil ...Respostas:
Mathematica
66 5851Solução Atual
Encurtado graças a uma contribuição da Calle.
Partition[#,3,1]
encontra os triplos.(a-b) (b-c)<0
é verdadeira se e somente seb
estiver abaixoa
,c
ou acimaa
,c
. e olha leva os sinais das diferenças. Um extremo local retornará um{-1,1}
ou{1,-1}
.Exemplos
Solução anterior
Este exemplo mostra todos os triplos (gerados por
Partition
) e determina se o elemento do meio é menor que os dois extremos ou maior que os extremos.Primeira solução
Isso encontra os triplos e examina os sinais das diferenças. Um extremo local retornará um
{-1,1}
ou{1,-1}
.Exemplo
Análise :
%
refere-se ao resultado da respectiva linha anterior.Sort@Sign@Differences@x=={-1,1}
identifica as triplas 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 o sinal (-, 0, +) das diferenças consista em a-1
e a1
. No presente caso, são eles:Para cada um desses casos, x,
x[[2]]
refere-se ao segundo termo. Esses serão todos os máximos e mínimos locais.fonte
J - 19 char
Não pude evitar;)
A explicação a seguir:
2-/\]
- Sobre cada par de elementos no argumento (cada infixo de 2 itens), faça a diferença.2*/\
- Agora, sobre cada par da nova lista, pegue o produto.0>
- Teste se cada resultado é menor que 0. Isso só acontece se os multiplicandos tiverem sinais alternados, ou seja, não ocorrerá se eles tiverem o mesmo sinal ou forem zero.0,
- Declare que o primeiro elemento não é um elemento extremo.}:
- Corte o último elemento, porque isso também não pode ser extremo.#~
- Use os valores verdadeiros no lado direito para selecionar itens da lista no lado esquerdo.Uso:
fonte
Javascript -
6245 caracteresEditar
fonte
Ruby,
8370605549 caracteresImprime todos os extremos locais em STDOUT.
Usa o<=>
operador "nave espacial", que eu realmente gosto. (Ele retorna 1 se a primeira coisa for maior que a segunda, -1 se for menor e 0 se igual. Portanto, se adicionarem a -2 ou 2, isso significa que o meio é um extremo.)Não é mais, como @daniero apontou que o caminho "óbvio" é realmente mais curto!Alterado mais uma vez! Agora ele usa o incrível algoritmo encontrado na resposta do MT0 (+1 para ele!).
Além disso, eu gosto do
each_cons
que seleciona cadan
grupo de elementos consecutivos em uma matriz. E arrastar tambémif
é interessante.No geral, eu apenas gosto da aparência elegante.
Algumas amostras são executadas:
fonte
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
(mesmo que o operador da nave espacial seja muito bonito);) #!((x..z)===y)
é ainda mais curto, embora não tão inteligentex < z
.C ++ - 208 caracteres
Solução mais longa novamente:
Para usar, digite seus números inteiros e, em seguida, qualquer caractere que irá travar o fluxo de entrada - qualquer caractere não numérico deve funcionar.
Entrada:
0 1 0 x
Resultado:
1
fonte
deque
vez de umvector
para ganhar 2 caracteres.i
ej
, você pode declararint i;
logo após a coleta e usar os dois loops em vez de declarar duas variáveis.i++
no loop for e iniciar sua condiçãoif(v[++i]>[i-1]...
para obter um caractere novamente.Matlab - 45 bytes
fonte
Python 2.7 - 73 bytes
Não é muito impressionante (observe todos os elementos da lista, exceto o primeiro e o último, veja se é maior ou menor que seus vizinhos).
Estou postando principalmente porque nem todo mundo sabe que você pode fazerx<y>z
e fazer funcionar. Eu acho isso meio legal.Sim,
x<y>z
é um recurso interessante do python, mas não é realmente ideal neste caso. Graças a VX pelo truque de multiplicação, isso não me ocorreu. Wrzlprmft me lembrou que declarar uma função anônima é menos pressionamento de tecla do quedef x(y):
.fonte
if(l[i]-l[i-1])*(l[i]-l[i+1])>0
reduziria o código em 11 caracteres ...def e(l):\n
o mesmo número de caracterese=lambda l:
, mas esqueci que você não precisa usar areturn
palavra - chave. Obrigado!(l[i]-l[i-1])*(l[i]-l[i+1])
é1
sel[i]
é um extremo local e0
caso contrário, eu não preciso usar>0
. Eu posso apenas deixar python interpretá-lo como um bool. :)\n
da declaração! Isso teria poupado dois caracteres, mas a inclusão dereturn
ainda não vale a pena.Haskell 50
fonte
x>p&&x>n
tem um a menos do que o personagemx>max p n
:-),
também não é necessário.x>p&&x>n
para(x>p)==(x>n)
para mínimos locais também, adiciona mais 4 caracteres.Geléia , 8 bytes
Experimente online!
Explicação
Um elemento é apenas um extremo local se sua diferença com o vizinho esquerdo tiver um sinal oposto à diferença com o vizinho direito, ou seja, os sinais das diferenças diferirem por 2 ou -2. O Jelly possui várias primitivas úteis para lidar com "encontrar elementos com certas propriedades" (em particular, podemos encontrar elementos com certas propriedades em uma lista e usá-la para extrair elementos de uma lista diferente), o que significa que podemos traduzir novamente para a lista original mais ou menos diretamente (só precisamos compensar por 1 porque o primeiro e o último elemento da lista original se perderam na diferença).
fonte
Python com Numpy -
81 7467 bytes (6154 sem aimport
linha)A entrada precisa ser uma matriz Numpy.
fonte
C, 83
fonte
awk - 32 caracteres
Não há esperança de derrotar uma linguagem como J ou APL por pouco tempo, mas pensei em jogar meu chapéu no ringue de qualquer maneira. Explicação:
a
,b
, ec
esperax_i
,x_(i-1)
ex_(i-2)
b-c
ea-b
aproximar o derivado antes e depoisx_(i-1)
x_(i-1)
; portanto, é um extremo local; portanto, imprimafonte
Brachylog , 17 bytes
Experimente online!
Leva a entrada através da variável de entrada e gera a saída através da variável de saída.
Se execuções de valores pudessem estar ausentes,
s₃{{⌉|⌋}.&bh}
isso salvaria quatro bytes.fonte
Perl 5
-p
, 49 bytesExperimente online!
fonte
Wolfram Language (Mathematica) ,
4342 bytesExperimente online!
Eu acho que
Nothing
é muito longo ...fonte
05AB1E ,
1110 bytesExperimente online ou verifique mais alguns casos de teste .
Explicação:
fonte
PHP,
116 114113Exemplo de uso:
fonte
Haskell, 70C
Versão Golfed
Versão ungolfed
fonte
Javascript: 102 caracteres
fonte
APL, 19 bytes
Eu converti a versão J de 20 caracteres para APL. Mas adiciono um zero ao começo e ao fim, em vez de remover o primeiro e o último dígito. Caso contrário, funciona exatamente como a versão J.
⍵
- parâmetro formal ômega. Esta é a entrada para a função.fonte
{x@1+&0>2_*':-':0 0,x}
. 6 desses caracteres (2_
e0 0,
) são gastos protegendo contra um erro de comprimento se o argumento for menor que dois itens, portanto, se não fosse por esse problema, seria 16 ... A ação também é um pouco diferente - precisamos ativar o lista booleana em uma lista de índices com1+&
e use-a para indexarx
novamente - mas é mais curto e também uma coisa muito K-ish a ser feita.Python 2 , 59 bytes
Experimente online!
Essa função evita principalmente os custosos negócios da indexação, tomando os elementos da lista como argumentos, em vez da própria lista. Embora exista mais de um elemento na lista, criamos recursivamente a lista, verificando o máximo em cada etapa.
fonte