Écrivez une fonction ou un programme qui prend une liste et produit une liste des extrêmes locaux.
Dans une liste, [x_0, x_1, x_2...]
un extrême local est x_i
tel que x_(i-1) < x_i
et x_(i+1) < x_i
ou x_(i-1) > x_i
et x_(i+1) > x_i
. Notez que les premier et dernier éléments de la liste ne peuvent jamais être des extrêmes locaux.
Donc, pour quelques exemples
local_extremes([1, 2, 1]) = [2]
local_extremes([0, 1, 0, 1, 0]) = [1, 0, 1]
local_extremems([]) = []
C'est le golf de code, donc le code le plus court gagne!
1 2 2 1
ne devrait-elle pas aussi2
être considérée comme des extrêmes? - Je sais, cela rendrait la solution beaucoup plus difficile ...Réponses:
Mathematica
66 5851Solution actuelle
Raccourci grâce à une contribution de Calle.
Partition[#,3,1]
trouve les triplets.(a-b) (b-c)<0
est vrai si et seulement sib
est inférieurea
,c
ou au- dessusa
,c
. et regarde prend les signes des différences. Un extrême local retournera soit{-1,1}
ou{1,-1}
.Exemples
Solution antérieure
Cela ressemble à des exemples de tous les triplets (générés par
Partition
) et détermine si l'élément central est inférieur aux deux extrêmes ou supérieur aux extrêmes.Première solution
Cela trouve les triplets, et regarde prend les signes des différences. Un extrême local retournera soit
{-1,1}
ou{1,-1}
.Exemple
Analyse :
%
fait référence au résultat de la ligne précédente respective.Sort@Sign@Differences@x=={-1,1}
identifie les triplets parmi {{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 telle sorte que le signe (-, 0, +) des différences se compose de a-1
et a1
. Dans le cas présent, ce sont:Pour chacun de ces cas, x
x[[2]]
fait référence au deuxième terme. Ce seront tous les maxima et minima locaux.la source
J - 19 caractères
Je n'ai pas pu l'aider;)
L'explication suit:
2-/\]
- Sur chaque paire d'éléments dans l'argument (chaque infixe long de 2 éléments), prenez la différence.2*/\
- Maintenant, sur chaque paire de la nouvelle liste, prenez le produit.0>
- Testez si chaque résultat est inférieur à 0. Cela ne se produit que si les multiplicandes avaient des signes alternés, c'est-à-dire que cela ne se produit pas s'ils avaient le même signe ou l'un ou l'autre était nul.0,
- Déclarez que le premier élément n'est pas un élément extrême.}:
- Coupez le dernier élément, car cela ne peut pas non plus être un extrême.#~
- Utilisez les vraies valeurs sur le côté droit pour choisir des éléments dans la liste sur le côté gauche.Usage:
la source
Javascript -
6245 caractèresÉditer
la source
Rubis,
8370605549 caractèresImprime tous les extrêmes locaux dans STDOUT.
Utilise l'<=>
opérateur "vaisseau spatial", que j'aime beaucoup. (Il renvoie 1 si la première chose est supérieure à la seconde, -1 si elle est inférieure et 0 si elle est égale. Par conséquent, s'ils ajoutent à -2 ou 2, cela signifie que le milieu est un extrême.)Ce n'est plus le cas, car @daniero a souligné que le chemin "évident" est en fait plus court!Changé encore une fois! Maintenant, il utilise l'algorithme génial trouvé dans la réponse de MT0 (+1 pour lui!).
Aussi, j'aime
each_cons
qui sélectionne chaquen
groupe d'éléments consécutifs dans un tableau. Et le suiviif
est également intéressant.Dans l'ensemble, j'aime son élégance.
Quelques exemples d'exécutions:
la source
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
(même si l'opérateur du vaisseau spatial est très joli);)!((x..z)===y)
est encore plus court mais pas aussi intelligentx < z
.C ++ - 208 caractères
Encore la solution la plus longue:
Pour l'utiliser, entrez vos nombres entiers, puis tout caractère qui plantera le flux d'entrée - tous les caractères non numériques devraient fonctionner.
Contribution:
0 1 0 x
Production:
1
la source
deque
au lieu d'unvector
pour gagner 2 personnages.i
etj
, vous pouvez déclarerint i;
juste après la collecte et utiliser dans les deux boucles au lieu de déclarer deux variables.i++
dans votre boucle for et commencer votre conditionif(v[++i]>[i-1]...
afin de gagner à nouveau un personnage.Matlab - 45 octets
la source
Python 2.7 - 73 octets
Pas trop impressionnant (regardez chaque élément de la liste sauf le premier et le dernier, voyez s'il est plus grand ou plus petit que ses voisins).
Je ne le poste que parce que tout le monde ne sait pas que vous pouvez le fairex<y>z
et le faire fonctionner. Je pense que c'est plutôt bien.Oui,
x<y>z
c'est une fonctionnalité intéressante de python, mais ce n'est pas réellement optimal dans ce cas. Merci à VX pour l'astuce de multiplication, cela ne m'est pas venu du tout à l'esprit. Wrzlprmft m'a rappelé que déclarer une fonction anonyme représente moins de touches quedef x(y):
.la source
if(l[i]-l[i-1])*(l[i]-l[i+1])>0
réduirait le code de 11 caractères ...def e(l):\n
c'est le même nombre de caractères quee=lambda l:
, mais j'ai oublié que vous n'avez pas besoin d'utiliser lereturn
mot - clé. Merci!(l[i]-l[i-1])*(l[i]-l[i+1])
c'est1
sil[i]
est un extrême local et0
sinon, je n'ai pas besoin de l'utiliser>0
. Je peux simplement laisser python l'interpréter comme un booléen. :)\n
dans la déclaration! Cela aurait sauvé deux caractères, mais l'inclusion dereturn
n'en vaut pas la peine.Haskell 50
la source
x>p&&x>n
a un caractère de moins quex>max p n
:-),
n'est pas non plus nécessaire.x>p&&x>n
à(x>p)==(x>n)
des minimums locaux aussi, ajoute 4 autres caractères.Gelée , 8 octets
Essayez-le en ligne!
Explication
Un élément n'est un extrême local que si sa différence avec son voisin gauche a un signe opposé à sa différence avec son voisin droit, c'est-à-dire que les signes des différences diffèrent de 2 ou -2. Jelly a un certain nombre de primitives utiles pour traiter "trouver des éléments avec certaines propriétés" (en particulier, nous pouvons trouver des éléments avec certaines propriétés dans une liste et l'utiliser pour extraire des éléments d'une liste différente), ce qui signifie que nous pouvons traduire en la liste d'origine plus ou moins directement (il suffit de compenser de 1 car les premier et dernier éléments de la liste d'origine se sont perdus dans la prise de différence).
la source
Python avec Numpy -
81 7467 octets (6154 sans laimport
ligne)L'entrée doit être un tableau Numpy.
la source
C, 83
la source
awk - 32 caractères
Aucun espoir de battre un langage comme J ou APL par souci de concision, mais je pensais que je jetterais mon chapeau dans le ring de toute façon. Explication:
a
,b
etc
tenirx_i
,x_(i-1)
etx_(i-2)
b-c
eta-b
approximer la dérivée avant et aprèsx_(i-1)
x_(i-1)
un extrême local, alors imprimezla source
Brachylog , 17 octets
Essayez-le en ligne!
Prend l'entrée via la variable d'entrée et génère la sortie via la variable de sortie.
Si des séries de valeurs pouvaient être assurées d'être absentes,
s₃{{⌉|⌋}.&bh}
cela économiserait quatre octets.la source
Perl 5
-p
, 49 octetsEssayez-le en ligne!
la source
Wolfram Language (Mathematica) ,
4342 octetsEssayez-le en ligne!
Je suppose que
Nothing
c'est trop long ...la source
05AB1E ,
1110 octetsEssayez-le en ligne ou vérifiez quelques cas de test supplémentaires .
Explication:
la source
PHP,
116 114113Exemple d'utilisation:
la source
Haskell, 70C
Version golfée
Version non golfée
la source
Javascript: 102 caractères
la source
APL, 19 octets
J'ai converti la version J 20 caractères en APL. Mais j'ajoute un zéro au début et à la fin au lieu de supprimer le premier et le dernier chiffre. Sinon, cela fonctionne exactement comme la version J.
⍵
- paramètre formel oméga. Il s'agit de l'entrée de la fonction.la source
{x@1+&0>2_*':-':0 0,x}
. 6 of these characters (2_
and0 0,
) are spent protecting against a length error if the argument is shorter than two items, so if not for that problem it would be 16... The action is also a little different--we have to turn the boolean list into a list of indices with1+&
and use that to indexx
again--but it's shorter and also a very K-ish thing to do.Python 2, 59 bytes
Try it online!
This function mostly avoids the costly business of indexing, by taking the elements of the list as arguments, instead of the list itself. While there is more than one element left in the list, we recursively build up the list, checking for a maximum at each step.
la source