Une liste d'entiers positifs peut être visualisée comme une chaîne de montagnes quantifiée où chaque entrée de la liste représente la hauteur d'une section verticale des montagnes.
Par exemple, la liste
1, 2, 2, 3, 4, 3, 5, 3, 2, 1, 2, 3, 3, 3, 2, 2, 1, 3
peut devenir la gamme
x
x x
xxxxx xxx x
xxxxxxxx xxxxxx x
xxxxxxxxxxxxxxxxxx
(Les gens moins poétiques pourraient appeler cela un graphique à barres, mais je m'égare.)
La question dans ce défi est la suivante: combien de pics se trouvent dans la chaîne de montagnes d'une liste arbitraire? Essentiellement, combien de maxima locaux figurent dans la liste?
Un pic est défini comme une section contiguë d'une ou plusieurs colonnes de la chaîne de montagnes qui sont toutes égales en hauteur, où les colonnes immédiatement à gauche et à droite sont plus basses.
Il est facile de dire visuellement que l'exemple a quatre pics à ces emplacements entre parenthèses:
1, 2, 2, 3, (4), 3, (5), 3, 2, 1, 2, (3, 3, 3), 2, 2, 1, (3)
Notez comment la (3, 3, 3)
section de plateau compte comme un pic car il s'agit d'un ensemble contigu de colonnes de hauteur égale, plus élevées que ses colonnes voisines.
Le dernier (3)
compte également comme un pic car, pour les besoins de ce défi, nous définirons le voisin gauche de la colonne la plus à gauche et le voisin droit de la colonne la plus à droite comme étant à la hauteur zéro.
Cela signifie que la liste avec une seule valeur, par exemple 1, 1, 1
, peut être interprété comme 0, 1, 1, 1, 0
, et a donc un pic, non pas: 0, (1, 1, 1), 0
.
La seule liste avec zéro pics est la liste vide.
Défi
Écrivez une fonction ou un programme qui prend une liste arbitraire d'entiers positifs et imprime ou renvoie le nombre de pics dans la chaîne de montagnes correspondante.
Le code le plus court en octets gagne. Tiebreaker est un post antérieur.
Cas de test
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
la source
Réponses:
Pyth, 18 octets
Basé sur @ PeterTaylor répété plus que la solution, mais avec une torsion.
++ZQZ
: Ajouter des zéros des deux côtés.eMr ... 8
: Supprimer les répétitions.u ... 2 ...
: Appliquer deux fois ce qui suit:>VGTG
: Mappez chaque paire de nombres pour déterminer s'ils sont en ordre décroissant._
: Et inverser.Un 1 en sortie correspond à une
1, 0
étape précédente, ce qui correspond àa < b > c
l'entrée en raison de l'inversion.s
: Somme (et impression)la source
CJam (
32 26 2421 octets)L'entrée attendue est des nombres séparés par des espaces.
Démo en ligne ; suite de tests complète (la sortie attendue est un
1
cas de test).Merci à Martin de m'avoir informé que la version actuelle de CJam améliore l'un des opérateurs utilisés, économisant 2 caractères; et pour une nouvelle économie de 3 caractères.
Dissection
Deux phases: dédupliquer, puis identifier les maxima locaux dans chaque ensemble de trois.
la source
JavaScript (ES6),
5451 octetsExplication
Prend un tableau de nombres
Tester
Afficher l'extrait de code
la source
Pyth,
2523 octetsExplication:
la source
0q~0]{2ew::-:g0-}2*1-,
pour 22.Julia, 66 ans
Pad, différencier:
y=diff([0;x;0])
.Ignorer les plateaux:
y=y[y.!=0]
.Compter
+
à-
passages à zéro:sum((y[1:end-1].>0)&(y[2:end].<0))
.la source
MATLAB,
2927 octetsFonction anonyme qui trouve les pics dans les données et compte le nombre. 0 est ajouté et ajouté aux données pour garantir que les pics aux extrémités sont détectés conformément à la question.
Cela fonctionnera également avec Octave . Vous pouvez essayer en ligne ici . Collez simplement le code ci-dessus dans la ligne de commande, puis exécutez-le avec
ans([1,2,1,3,4,5,6,1])
(ou toute autre entrée).Comme les nombres sont toujours + ve, nous pouvons supposer qu'ils sont supérieurs à zéro, donc nous pouvons économiser 2 octets en utilisant
nnz
au lieu denumel
.la source
Python 3, 75 octets
Ceci est mon premier codegolf donc il peut y avoir des endroits pour le réduire, en particulier la
d=((n==p)&d)+(n>p)
partie. Cependant, cela fonctionne sur tous les cas de testla source
Mathematica,
42363332 octetsMerci à Martin Büttner pour avoir économisé 1 octet.
PeakDetect
fait presque tout!Cas de test:
la source
CJam,
2726 octetsUtilise le codage de longueur d'exécution pour supprimer les doublons. Après cela, nous vérifions pour chaque triplet si celui du milieu est le plus grand nombre.
Essayez-le ici! Réussit la suite de tests de Peter Taylor .
la source
MATL , 22 octets
Utilise la version actuelle du langage / compilateur.
Exemple
Explication
la source
Mathematica,
55393635 octetsFonctionne maintenant sur tous les cas de test!
la source
Last/@
->#&@@@
Rétine ,
3331 octetsMerci à Neil d'avoir économisé 2 octets.
Essayez-le en ligne!
Prend la saisie sous forme de liste unaire séparée par des virgules .
la source
\b(1+)(?<!\1 \1)( \1)*\b(?! \1)
semble économiser 2 octets?JavaScript ES6,
9694 octetsPrincipe: réduire les plateaux en pics uniques, trouver les pics définis comme étant supérieurs aux éléments suivants et précédents.
Prend l'entrée comme un tableau.
Démo:
la source
ES6,
5048 octetsEnregistré 2 octets grâce à @ user81655.
Non golfé:
la source
.map()|
auparavant.)MATL, 23
Comme nous devons utiliser des esolangs basés sur des piles pour être compétitifs, j'ai réimplémenté ma solution Julia en MATL.
Appuyez
0
, saisissez0
, concaténez deux fois.0i0hh
=>x = [0, input(''), 0]
Différencier.
d
=>x = diff(x)
Dupliquez
t
, convertissez l'un en booléen et utilisez-le pour indexer l'autre.tg)
=>x=x(x!=0)
Dupliquez à nouveau.
t
Premier:
[1,G])0>
=>y1 = x(1:end-1)>0
Échange.
w
Deuxième:
[2,0])0<
=>y2 = x(2:end)<0
Logique et, comptez les valeurs véridiques.
*s
=>sum(y1 & y2)
la source
[1,G]
->5L
enregistre 3 octets.[2,0]
->6L
enregistre 3 octetsand
(&
) de MATL (et même pouror
). Il peut toujours être remplacé par*o
, et souvent par juste*
, comme dans ce cas. Qu'est-ce que tu penses? De cette façon, les personnages&
et|
pourraient être utilisés pour d'autres fonctions à l'avenir.Japt, 19 octets
C'était plus facile que je ne le pensais, mais le début est un peu inutile en raison d'un bug.
Essayez-le en ligne!
Comment ça marche
Version non concurrente, 15 octets
Plus tôt dans la journée, j'ai ajouté la
è
fonction, qui est similairef
mais renvoie le nombre de correspondances plutôt que les correspondances elles-mêmes. J'ai également corrigé un bug oùArray.u
retournait la longueur du tableau plutôt que le tableau lui-même.Essayez-le en ligne!
la source
05AB1E , 9 octets
Essayez-le en ligne!
Explication:
la source
Gelée , 27 octets
Essayez-le en ligne!
la source
GolfScript, 35
Testez en ligne
Supprime essentiellement les doublons, ajoute un 0 aux deux extrémités et vérifie combien de triplets ont un maximum au centre.
la source
Java 8, 141 octets
Peut probablement être joué au golf en utilisant une approche différente ou un tableau en entrée au lieu de List.
Explication:
Essayez-le ici.
la source