Un tas , également appelé file d'attente prioritaire, est un type de données abstrait. Conceptuellement, c'est un arbre binaire où les enfants de chaque nœud sont inférieurs ou égaux au nœud lui-même. (En supposant qu'il s'agit d'un tas max.) Lorsqu'un élément est poussé ou sauté, le tas se réorganise de sorte que le plus grand élément soit le prochain à sauter. Il peut facilement être implémenté sous forme d'arbre ou de tableau.
Votre défi, si vous choisissez de l'accepter, est de déterminer si un tableau est un tas valide. Un tableau est sous forme de tas si les enfants de chaque élément sont inférieurs ou égaux à l'élément lui-même. Prenons l'exemple du tableau suivant:
[90, 15, 10, 7, 12, 2]
En réalité, il s'agit d'un arbre binaire disposé sous la forme d'un tableau. C'est parce que chaque élément a des enfants. 90 a deux enfants, 15 et 10 ans.
15, 10,
[(90), 7, 12, 2]
15 a également des enfants, 7 et 12 ans:
7, 12,
[90, (15), 10, 2]
10 a des enfants:
2
[90, 15, (10), 7, 12, ]
et l'élément suivant serait également un enfant de 10 ans, sauf qu'il n'y a pas de place. 7, 12 et 2 auraient tous aussi des enfants si la matrice était suffisamment longue. Voici un autre exemple de tas:
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
Et voici une visualisation de l'arbre que fait le tableau précédent:
Juste au cas où ce ne serait pas assez clair, voici la formule explicite pour obtenir les enfants du ième élément
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
Vous devez prendre un tableau non vide en entrée et générer une valeur véridique si le tableau est dans l'ordre du segment de mémoire et une valeur fausse dans le cas contraire. Cela peut être un tas indexé 0 ou un tas indexé 1 tant que vous spécifiez le format que votre programme / fonction attend. Vous pouvez supposer que tous les tableaux ne contiendront que des entiers positifs. Vous ne pouvez pas utiliser de commandes intégrées au tas. Cela comprend, mais sans s'y limiter
- Fonctions qui déterminent si un tableau est sous forme de segment de mémoire
- Fonctions qui convertissent un tableau en tas ou en forme de tas
- Fonctions qui prennent un tableau en entrée et retournent une structure de données de tas
Vous pouvez utiliser ce script python pour vérifier si un tableau est en forme de tas ou non (0 indexé):
def is_heap(l):
for head in range(0, len(l)):
c1, c2 = head * 2 + 1, head * 2 + 2
if c1 < len(l) and l[head] < l[c1]:
return False
if c2 < len(l) and l[head] < l[c2]:
return False
return True
Test IO:
Toutes ces entrées doivent renvoyer True:
[90, 15, 10, 7, 12, 2]
[93, 15, 87, 7, 15, 5]
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[100, 19, 36, 17, 3, 25, 1, 2, 7]
[5, 5, 5, 5, 5, 5, 5, 5]
Et toutes ces entrées doivent retourner False:
[4, 5, 5, 5, 5, 5, 5, 5]
[90, 15, 10, 7, 12, 11]
[1, 2, 3, 4, 5]
[4, 8, 15, 16, 23, 42]
[2, 1, 3]
Comme d'habitude, il s'agit de code-golf, donc les failles standard s'appliquent et la réponse la plus courte en octets gagne!
[3, 2, 1, 1]
?Réponses:
Gelée,
1195 octets4 octets supprimés grâce à Dennis!
Essayez-le ici.
Explication
la source
JavaScript (ES6),
3430 octetsEdit: La correction de mon code pour la clarification des spécifications coûte 1 octet, donc merci à @ edc65 pour avoir économisé 4 octets.
la source
[93, 15, 87, 7, 15, 5]
et 6[5, 5, 5, 5, 5, 5, 5, 5]
a=>!a.some((e,i)=>e>a[i-1>>1])
Haskell, 33 octets
ou
la source
J, 24 octets
Explication
la source
MATL ,
1312 octetsEssayez-le en ligne!Ou vérifiez tous les cas de test .
Un tableau est vrai s'il n'est pas vide et que toutes ses entrées sont différentes de zéro. Sinon, c'est faux. Voici quelques exemples .
Explication
la source
Python 2, 45 octets
Sorties 0 pour Falsy, non nul pour Truthy.
Vérifie que le dernier élément est inférieur ou égal à son parent à l'index
len(l)/2-1
. Ensuite, revient pour vérifier qu'il en est de même avec le dernier élément de la liste supprimé, et ainsi de suite jusqu'à ce que la liste soit vide.48 octets:
Vérifie qu'à chaque index
i
, l'élément est tout au plus son parent à l'index(i-1)/2
. La division au sol produit 0 si ce n'est pas le cas.Faire le cas de base comme
i/len(l)or
donne la même longueur. J'avais essayé de zipper au début, mais j'ai obtenu un code plus long (57 octets).la source
R,
97 8882 octetsJ'espère que j'ai bien compris cela. Voyons maintenant si je peux me débarrasser de quelques octets supplémentaires. Abandonné le rbind et mis dans un sapply et traiter correctement le vecteur basé sur 1.
Implémenté en tant que fonction sans nom
Avec quelques cas de test
la source
seq(Y)
place de1:length(Y)
.CJam,
19161312 octetsGolfé 3 octets grâce à Dennis.
Essayez-le ici.
la source
Pyth, 8 octets
Essayez-le en ligne
la source
Rétine , 51 octets
Essayez-le en ligne!
Prend une liste de nombres séparés par des espaces comme entrée. Sorties
1
/0
pour véridique / fauxla source
C ++ 14,
134105 octetsExige
c
d'être un conteneur supportant.operator[](int)
et.size()
, commestd::vector<int>
.Non golfé:
Pourrait être plus petit si truey =
0
et falsy =1
étaient autorisés.la source
R, 72 octets
Une approche légèrement différente de l'autre réponse R .
Lit l'entrée de stdin, crée un vecteur de toutes les paires de comparaison, les soustrait les unes des autres et vérifie que le résultat est un nombre négatif ou zéro.
Explication
Lire l'entrée de stdin:
Créez nos paires. Nous créons des indices de
1...N
(oùN
est la longueur dex
) pour les nœuds parents. Nous prenons cela deux fois car chaque parent a (au maximum) deux enfants. Nous emmenons aussi les enfants,(1...N)*2
et(1...N)*2+1
. Pour les indices au-delà de la longueur dex
, R renvoieNA
«non disponible». Pour la saisie90 15 10 7 12 2
, ce code nous donne90 15 10 7 12 2 90 15 10 7 12 2 15 7 2 NA NA NA 10 12 NA NA NA NA
.Dans ce vecteur de paires, chaque élément a son partenaire à distance
N*2
. Par exemple, le partenaire de l'article 1 est situé à la position 12 (6 * 2). Nous utilisonsdiff
pour calculer la différence entre ces paires, en spécifiantlag=N*2
de comparer les articles à leurs bons partenaires. Toutes les opérations sur lesNA
éléments reviennent simplementNA
.Enfin, nous vérifions que toutes ces valeurs retournées sont inférieures à
1
(c'est-à-dire que le premier nombre, le parent, était plus grand que le deuxième nombre, l'enfant), excluant lesNA
valeurs de la considération.la source
Réellement , 16 octets
Cette réponse est largement basée sur la réponse Jelly de jimmy23013 . Suggestions de golf bienvenues! Essayez-le en ligne!
Ungolfing
la source