Contexte
Un arbre binaire est un arbre enraciné dont chaque nœud a au plus deux enfants.
Un arbre binaire étiqueté est un arbre binaire dont chaque nœud est étiqueté avec un entier positif; de plus, toutes les étiquettes sont distinctes .
Un BST (arbre de recherche binaire) est un arbre binaire étiqueté dans lequel l'étiquette de chaque nœud est supérieure aux étiquettes de tous les nœuds de son sous-arbre gauche et plus petite que les étiquettes de tous les nœuds de son sous-arbre droit. Par exemple, ce qui suit est un BST:
La traversée en précommande d'un arbre binaire étiqueté est définie par le pseudo-code suivant.
function preorder(node)
if node is null then
return
else
print(node.label)
preorder(node.left)
preorder(node.right)
Voir l'image suivante pour obtenir une meilleure intuition:
Les sommets de cet arbre binaire sont imprimés dans l'ordre suivant:
F, B, A, D, C, E, G, I, H
Vous pouvez en savoir plus sur les BST ici et en savoir plus sur le parcours de précommande ici .
Défi
Étant donné une liste d'entiers , votre tâche consiste à déterminer s'il existe un BST dont la traversée en précommande imprime exactement .
Contribution
- Une liste non vide d'entiers positifs distincts .
- Facultativement, la longueur d' .
Production
- Une valeur vraie si est la traversée de précommande de certains BST.
- Une valeur de falsey sinon.
Règles
- Règles standard pour les soumissions valides , les E / S , les failles s'appliquent.
- C'est le code-golf , donc la solution la plus courte (en octets) l'emporte. Comme d'habitude, ne laissez pas les solutions ridiculement courtes dans les langues de golf vous décourager de poster une réponse plus longue dans la langue de votre choix.
- Ce n'est pas une règle, mais votre réponse sera mieux reçue si elle comprend un lien pour tester la solution et une explication de son fonctionnement.
Exemples
Input ----> Output
[1] ----> True
[1,2,3,4] ----> True
[5,1,4,2,3] ----> True
[5,4,3,2,1,6,7,8,9] ----> True
[4,2,1,3,6,5,7] ----> True
[8,3,1,6,4,7,10,14,13] ----> True
[2,3,1] ----> False
[6,3,2,4,5,1,8,7,9] ----> False
[1,2,3,4,5,7,8,6] ----> False
[3,1,4,2] ----> False
Consultez ce lien (gracieuseté de Kevin Cruijssen ) pour avoir un aperçu visuel des exemples.
la source
Réponses:
JavaScript (Node.js) , 49 octets
Essayez-le en ligne!
En utilisant le fait que pour le tableauune0. . . unen - 1 , une est le pré-commande traversal de certains BST ssi ∀ 0 ≤ i < j < n ; uneje< aj - 1⟹uneje< aj tient.
Grâce à Arnauld , économisez 1 octet.
la source
Gelée , 7 octets
Essayez-le en ligne!
Renvoie
[4]
pour les traversées, sinon[]
.Utilise essentiellement l'algorithme de tsh: la condition "disqualifiante" pour une traversée de précommande est une sous- séquence de 3 éléments qui ressemble à [moyen, haut, bas] . (Par exemple, [20, 30, 10].)
Nous vérifions de manière équivalente toutes les sous-séquences de n'importe quelle longueur qui ont l'index 4 dans leurs listes de permutation, qui sont toutes des listes triées comme [a 1 … a k cdb] où les a i sont triées et a i <b <c <d . (Chacune de ces listes est disqualifiante si nous regardons les trois derniers éléments, et chaque liste disqualifiante est évidemment de cette forme.)
Preuve
la source
Java 10, 94 octets
Réponse JavaScript du port de @tsh .
Essayez-le en ligne.
Explication:
la source
|=
. Je suppose que&=
cela fonctionnerait aussi?|=
et&=
fonctionnent comme des raccourcis pourb = b | condition
etb = b & condition
(où les&
et|
sont des raccourcis pour&&
et||
dans la plupart des cas bien sûr).Rubis ,
46 4038 octetsEssayez-le en ligne!
Cela fonctionne en prenant récursivement le premier élément
a
comme pivot et en vérifiant si le reste du tableau peut être divisé en deux (en utilisant l'intersection et l'union: supprimez d'abord tous les éléments> a, puis ajoutez-les à nouveau à droite et vérifiez si quelque chose a modifié).la source
Retina 0.8.2 , 31 octets
Essayez-le en ligne! Le lien inclut des cas de test. Utilise l'algorithme de @ tsh. Explication:
Convertissez en unaire.
Trouvez les nombres qui se trouvent entre deux nombres décroissants consécutifs consécutifs.
Vérifiez que le nombre de correspondances est nul.
la source
Perl 6 , 38 octets
Essayez-le en ligne!
Explication
la source
Haskell , 50 octets
Essayez-le en ligne!
la source
Scala (
6867 octets)Essayez-le en ligne
Port of @ nwellnhof's answer .
Scala (
122103 octets)Merci à @Laikoni pour les suggestions visant à raccourcir les deux solutions.
Essayez-le en ligne
Explication:
span
) le tableau en utilisant la tête du tableau comme critère de découpage.la source
val (s,t)
,true
peut l'être1>0
et vous pouvez laisser tombers.forall(_<i(0))&
car cela devrait déjà être assuré parspan
.%
et supprimer l'espace:def%(i:Seq[Int])=
l.zipWithIndex.foldLeft(1>0){case(r,v,i)=>r&l.zip(l.tail).slice(i+1,l.length).forall(x=>l(i)>x._1|l(i)<x._2)}
.. Version 2(for(i<-l.indices)yield l.zip(l.tail).slice(i+1,l.length).forall(x =>l(i)>x._1|l(i)<x._2)).forall(x=>x)
.. Avez-vous des idées pour les raccourcir?05AB1E ,
1510 octetsRéponse de Port of @Lynn 's Jelly .
-5 octets grâce à @Emigna .
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication: "
la source
ŒεD{3.IÊ}P
?Haskell , 41 octets
Essayez-le en ligne!
Utilise l'observation de Lynn laquelle il suffit de vérifier qu'il n'y a pas de sous-séquence de for mid..high..low . Cela signifie que pour chaque élément
h
, la liste des élémentst
qui suit est un bloc d'éléments<h
suivi d'un bloc d'éléments>h
(les deux blocs peuvent être vides). Ainsi, le code vérifie que , après nous laissons tomber le préfixe des éléments<h
danst
, les autres éléments sont tous>h
. Récursif vérifie cela pour chaque élément initialh
jusqu'à ce que la liste soit de longueur 1.Une simplification potentielle est qu'il suffit de vérifier les sous-modèles mid..high, low où les deux derniers sont consécutifs. Malheureusement, Haskell n'a pas un moyen court d'extraire les deux derniers éléments, comme cela peut être fait de face avec une correspondance de modèle
a:b:c
. J'ai trouvé une solution plus courte qui vérifie les valeurs moyennes, élevées ... faibles , mais cela ne parvient pas à rejeter les entrées comme[3,1,4,2]
.Cas de test formatés pris formatés de Laikoni .
la source
Japt , 14 octets
Interprète Japt
Les sorties
false
pour BST,true
sans BST.Explication:
la source
Scala
Toutes les approches sont des implémentations de la règle indiquée par tsh.
109
101
98
78
Si ce doit être une fonction et pas seulement une expression, alors chaque ligne doit commencer par (17 octets)
la source
Oracle SQL, 177 octets
Puisqu'il n'y a pas de type booléen dans Oracle SQL, la requête renvoie 1 ou 0.
Oracle SQL 12c, 210 octets
Il n'est pas possible d'accéder à l'élément du tableau en SQL de la même manière qu'en PL / SQL - c'est-à-dire a (i), donc la fonction a
f
été déclarée danswith clause
ce but. Sinon, la solution aurait été beaucoup plus courte.Autres limitations
sqlplus listing
Vérification en ligne apex.oracle.com
Mise à jour
Oracle SQL, 155 octets
la source
C, 823 octets (sans compter les espaces blancs); 923 octets (y compris les espaces blancs)
La version lisible du programme est ci-dessous:
La méthode principale de ce programme lit la liste des numéros qui sont (prétendument) une traversée de précommande légitime.
La fonction insert_root qui est appelée insère les entiers dans une arborescence de recherche binaire où les nœuds précédents contiennent des valeurs moindres et les nœuds suivants contiennent des valeurs int plus grandes.
La fonction de précommande (racine) parcourt l'arborescence dans une traversée de précommande et concatène simultanément chaque entier que l'algorithme rencontre dans la liste int test_list .
Une dernière boucle while teste si chacune des valeurs int de la liste stdin et celles de test_list sont équivalentes à chaque index. S'il existe un élément de liste de stdin qui ne correspond pas à l'élément correspondant dans test_list à l'index respectif, la fonction principale renvoie 0. Sinon, la méthode principale renvoie 1 .
Pour déterminer ce qui est retourné, tapez echo $ status dans le terminal bash. BASH imprime un 1 ou un 0.
la source