Description du défi
Une sous -séquence monotone est une séquence de nombres [a1, a2, ..., an]
telle que
a1 <= a2 <= ... <= an
ou a1 >= a2 >= ... >= an
. [1, 3, 3, 7, 9, 13, 13, 100]
est une sous-séquence monotone (non décroissante), ainsi que [9, 4, 4, 3, 0, -10, -12]
(celle-ci n'est pas croissante), mais [1, 3, 6, 9, 8]
ne l'est pas. Étant donné une liste d'entiers (dans n'importe quel format raisonnable), affichez le plus petit nombre de N
sorte que la séquence de ces entiers puisse être divisée en N
séquences monotones.
Exemples
[1, 3, 7, 5, 4, 2] -> [[1, 3, 7], [5, 4, 2]] -> 2
[1, 2, 3, 4, 5, 6] -> [1, 2, 3, 4, 5, 6] -> 1
[3, 1, 5, 5, 6] -> [[3, 1], [5, 5, 6]] -> 2
[4, 6, 8, 9, 1, 6] -> [[4, 6, 8, 9], [1, 6]] -> 2
[3, 3, 3, 3] -> [[3, 3, 3, 3]] -> 1
[7] -> [[7]] -> 1
[] -> [] -> anything (you don't actually have to handle an empty list case)
[1, 3, 2, -1, 6, 9, 10, 2, 1, -12] -> [[1, 3], [2, -1], [6, 9, 10], [2, 1, -12]] -> 4
[4,4,8,8,1,4,5] -> 2
0 / undefined
, il semble que ce devrait être 0 ou la représentation deundefined
dans notre langue, mais d'après votre commentaire sur la réponse Jelly de Jonathan Allan, cela ressemble à desundefined
moyensanything
... Lequel est-ce? ? Dans le deuxième cas, je suggère d'écrireanything
au lieu deundefined
Réponses:
Brachylog , 12 octets
Essayez-le en ligne!
Cela revient
false.
pour la liste vide[]
.Explication
Cela renverra le plus petit car
~c
générera des points de choix du plus petit nombre de sous-listes au plus grand.la source
Z
parce queZ
c'est un nom de variable; nous disons donc "appelez ce programme avec la sortie comme variable". Vous pouvez passerZ
à n'importe quelle autre lettre majuscule ; c'est juste un nom de variable. La raison pour laquelle cet argument existe est de permettre la possibilité de définir réellement la sortie sur quelque chose, au lieu d'une variable.4
dans cet exemple, il vous dira si c'est correct ou non )3
car il ne trouvera aucune liste de sous-listes où toutes sont monotones et de longueur3
. Cela prend juste beaucoup de temps car il va essayer toutes les listes possibles de sous-listes, même celles qui sont en fait plus longues que 3 éléments car la longueur est vérifiée après avoir trouvé la liste. Car5
cela dittrue
car il y a en effet au moins une liste de longueur5
avec des sous-listes monotones qui fonctionne. Donc, ce programme renvoie la plus petite longueur lorsque la sortie est une variable et s'il existe une liste de cette longueur qui fonctionne si la sortie est un entier.Perl, 65 octets
62 octets de code + 3 octets pour l'
-n
indicateur.monot_seq.pl:
Donnez l'entrée sans nouvelle ligne finale, avec les nombres séparés par des espaces:
-5 octets grâce à @Gabriel Benamy.
la source
($&<=>$1)*($1<=>$2)||$1==$2
en($&<=>$1)*($1<=>$2)>=0
Mathematica, 111 octets
Fonction nommée
f
prenant une liste non vide de nombres (entiers ou même réels). Fonctionne d'avant en arrière, en rejetant le premier élément à plusieurs reprises et en gardant une trace du nombre de sous-séquences nécessaires. Plus verbeux:la source
d=#2-#&@@#&;
également, la définition de l'opérateur unairef
oug
de celui-ci±
permettra probablement d'économiser quelques octets.Gelée , 19 octets
TryItOnline! ou exécutez tous les tests (les résultats de la liste vide dans
1
)Comment?
(Je ne suis pas convaincu que ce soit la méthode la plus appropriée pour minimiser le nombre d'octets)
la source
1
(ce que je pense en fait plus de sens que0
).undefined
signifie - le résultat n'est pas pertinent.Perl,
98979679 octetsL'entrée est fournie sous la forme d'une liste de nombres, séparés par des espaces, fournis lors de l'exécution, par exemple
(le 4 est la sortie)
Lisible:
L'opérateur de vaisseau spatial
<=>
renvoie -1 si LHS <RHS, 0 si LHS = RHS et +1 si LHS> RHS. Lors de la comparaison de trois éléments séquentiels$a,$b,$c
pour déterminer s'ils sont monotones, il suffit de déterminer que ce n'est pas le cas que l'un exactement$a<=>$b
,$b<=>$c
est 1 et l'autre est -1 - ce qui ne se produit que lorsque leur produit est -1. Si soit$a==$b
ou$b==$c
, alors la séquence est monotone et le produit est 0. Si$a < $b < $c
, alors les deux résultent en -1, et -1 * -1 = 1. Si$a > $b > $c
, alors ils donnent tous les deux en 1, et 1 * 1 = 1. Dans les deux cas, la séquence est monotone et nous souhaitons continuer.Si le produit est inférieur à 0, nous savons que la séquence n'est pas monotone, et nous rejetons les valeurs que
$a,$b
nous détenons actuellement et incrémentons notre compteur de sous-séquences. Sinon, on avance d'un chiffre.Ne renvoie rien si l'entrée est vide, sinon renvoie le plus petit nombre de sous-séquences monotones contiguës
la source
1
etif
(ou peut-être que vous le faites sur les anciennes perles, mais sur les récentes, vous n'en avez pas). Vous pouvez également (probablement) remplacershift
parpop
. Cependant, il existe certains cas de test sur lesquels votre code ne fonctionne pas:6 3 6 3
(vous imprimez 3 au lieu de 2),4 3 2 1
(vous imprimez 2 au lieu de 1). Utiliserpop
au lieu deshift
résoudre ceux-ci mais en créer de nouveaux (1 2 3 4
imprime 3 au lieu de 1) ...C # 6,
297209 octetsNon golfé avec des explications
la source
JavaScript (ES6), 69 octets
Prend l'entrée comme plusieurs paramètres. Fonctionne en comparant récursivement les trois premiers éléments pour voir s'ils sont monotones, si c'est le cas, supprime l'élément du milieu car il est inutile, sinon, supprime les deux premiers éléments et commence une nouvelle séquence.
la source
Clojure, 97 octets
reduce
garde la trace de la sous-séquence actuelle et calcule le nombre de fois<=
et les>=
conditions échouent. Le dernier1
prend le 2e élément du résultat (étant le compteuri
).la source